...
These examples also assume that errno is set if fopen() or malloc() fail. These are guaranteed by POSIX but not by C11. See ERR30-C. Set errno to zero before calling a library function known to set errno, and check errno only after the function returns a value indicating failureTake care when reading errno for more details.
| Code Block | ||||
|---|---|---|---|---|
| ||||
typedef struct object { /* Generic struct: contents don't matter */
int propertyA, propertyB, propertyC;
} object_t;
errno_t do_something(void){
FILE *fin1, *fin2;
object_t *obj;
errno_t ret_val;
fin1 = fopen("some_file", "r");
if (fin1 == NULL) {
return errno;
}
fin2 = fopen("some_other_file", "r");
if (fin2 == NULL) {
fclose(fin1);
return errno;
}
obj = malloc(sizeof(object_t));
if (obj == NULL) {
ret_val = errno;
fclose(fin1);
return ret_val; /* Forgot to close fin2!! */
}
/* ... More code ... */
fclose(fin1);
fclose(fin2);
free(obj);
return NOERR;
}
|
...
Recommendation | Severity | Likelihood | Detectable | RepairableRemediation Cost | Priority | Level |
|---|---|---|---|---|---|---|
MEM12-C | Low | Probable | No | NoMedium | P4P2 | L3 |
Automated Detection
Tool | Version | Checker | Description | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Klocwork |
| MLK.MIGHT MLK.MUST MLK.RET.MIGHT MLK.RET.MUST RH.LEAK | ||||||||||||
| LDRA tool suite |
| 50 D | Partially implemented | |||||||||||
| Parasoft C/C++test |
| BD-RES-LEAK | ImplementedCERT_C-MEM12-a | Ensure resources are freed | ||||||||||
| PC-lint Plus |
| 429 | Assistance provided | |||||||||||
| Polyspace Bug Finder |
| R2016a |
| Checks for memory leak and resource leak (rec. partially covered) | ||||||||||
| Security Reviewer - Static Reviewer |
| CPP_48 | Fully implemented |
Bibliography
| Dijkstra, Edgar, "Go To Statement Considered Harmful.", 1968 | |
| Linux Kernel Sourcecode (v2.6.xx) | 2.6.29, kernel/fork.c, the copy_process() Function |
| [Seacord 2013] | Chapter 4, "Dynamic Memory Management" |
...