...
In this noncompliant code example, the memory referred to by x may be freed twice: once if error_condition is true and again at the end of the code.
| Code Block | ||
|---|---|---|
| ||
int f(size_t num_elem = /* some initial value */; n) { int error_condition = 0; int *x = (int *)malloc(num_elemn * sizeof(int)); if (x == NULL) { return -1; /* handle allocation Use x and set error_condition on error. */ } /* ... */ if (error_condition == 1) { /* handleHandle error condition*/ free(x); x} = NULL; } /* ... */ free(x); x =return NULLerror_condition; } |
Compliant Solution
In this compliant solution, the free a referenced by x is only freed once. This is accomplished by eliminating the call to free() when error_condition is equal to 1set.
| Code Block | ||
|---|---|---|
| ||
int f(size_t num_elem = /* some initial value */; n) { int error_condition = 0; if (num_elemn > SIZE_MAX / sizeof(int)) { errno /* Handle overflow */ } = EOVERFLOW; return -1; } int *x = (int *)malloc(num_elemn * sizeof(int)); if (x == NULL) { /* handleReport allocation error failure to caller. */ return -1; } /* ... Use x and set error_condition on error. */ if (error_condition !== 10) { /* Handle error condition and proceed. */ } /* ... */ free(x); x =return NULLerror_condition; } |
Note that this solution checks for numeric overflow (see INT32-C. Ensure that operations on signed integers do not result in overflow).
...