CodeQL documentation

Returning stack-allocated memory

ID: cpp/return-stack-allocated-memory Kind: path-problem Security severity: 9.3 Severity: warning Precision: high Tags: - reliability - security - external/cwe/cwe-825 Query suites: - cpp-code-scanning.qls - cpp-security-extended.qls - cpp-security-and-quality.qls 

Click to see the query in the CodeQL repository

This rule finds return statements that return pointers to an object allocated on the stack. The lifetime of a stack allocated memory location only lasts until the function returns, and the contents of that memory become undefined after that. Clearly, using a pointer to stack memory after the function has already returned will have undefined results.

Recommendation

Use the functions of the malloc family, or new, to dynamically allocate memory on the heap for data that is used across function calls.

Example

The following example allocates an object on the stack and returns a pointer to it. This is incorrect because the object is deallocated when the function returns, and the pointer becomes invalid.

Record*mkRecord(intvalue){RecordmyRecord(value);return&myRecord;// BAD: returns a pointer to `myRecord`, which is a stack-allocated object.}

To fix this, allocate the object on the heap using new and return a pointer to the heap-allocated object.

Record*mkRecord(intvalue){Record*myRecord=newRecord(value);returnmyRecord;// GOOD: returns a pointer to a `myRecord`, which is a heap-allocated object.}

References

  • Common Weakness Enumeration: CWE-825.

close