Skip to content

Commit c04428d

Browse files
committed
C++: Add test cases for the memory freed queries.
1 parent 4c8da54 commit c04428d

File tree

4 files changed

+81
-1
lines changed

4 files changed

+81
-1
lines changed

cpp/ql/test/query-tests/Critical/MemoryFreed/MemoryFreed.expected

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,12 @@
117117
| test_free.cpp:346:26:346:28 | ptr |
118118
| test_free.cpp:356:19:356:19 | a |
119119
| test_free.cpp:357:19:357:19 | a |
120+
| test_free.cpp:370:10:370:10 | a |
121+
| test_free.cpp:373:10:373:10 | e |
122+
| test_free.cpp:382:10:382:10 | i |
123+
| test_free.cpp:383:10:383:10 | s |
124+
| test_free.cpp:395:14:395:19 | buffer |
125+
| test_free.cpp:424:10:424:16 | buffer2 |
120126
| virtual.cpp:18:10:18:10 | a |
121127
| virtual.cpp:19:10:19:10 | c |
122128
| virtual.cpp:38:10:38:10 | b |
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,4 @@
11
| test_free.cpp:36:22:36:35 | ... = ... | This memory allocation may not be released at $@. | test_free.cpp:38:1:38:1 | return ... | this exit point |
22
| test_free.cpp:267:12:267:17 | call to malloc | This memory allocation may not be released at $@. | test_free.cpp:270:1:270:1 | return ... | this exit point |
3+
| test_free.cpp:420:23:420:31 | call to getBuffer | This memory allocation may not be released at $@. | test_free.cpp:428:1:428:1 | return ... | this exit point |
4+
| test_free.cpp:427:25:427:33 | call to getBuffer | This memory allocation may not be released at $@. | test_free.cpp:428:1:428:1 | return ... | this exit point |

cpp/ql/test/query-tests/Critical/MemoryFreed/MemoryNeverFreed.expected

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,3 +14,5 @@
1414
| test_free.cpp:167:15:167:21 | call to realloc | This memory is never freed. |
1515
| test_free.cpp:253:14:253:19 | call to malloc | This memory is never freed. |
1616
| test_free.cpp:261:6:261:12 | new | This memory is never freed. |
17+
| test_free.cpp:365:21:365:26 | call to malloc | This memory is never freed. |
18+
| test_free.cpp:368:31:368:36 | call to malloc | This memory is never freed. |

cpp/ql/test/query-tests/Critical/MemoryFreed/test_free.cpp

Lines changed: 71 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -355,4 +355,74 @@ struct E {
355355
void test(E* e) {
356356
free(e->ec[0].a);
357357
free(e->ec[1].a); // GOOD
358-
}
358+
}
359+
360+
// ---
361+
362+
void test_return_by_parameter(int **out_i, MyStruct **out_ms) {
363+
int *a = (int *)malloc(sizeof(int)); // GOOD (freed)
364+
int *b = (int *)malloc(sizeof(int)); // GOOD (out parameter)
365+
int *d = (int *)malloc(sizeof(int)); // BAD (not freed)
366+
MyStruct *e = (MyStruct *)malloc(sizeof(MyStruct)); // GOOD (freed)
367+
MyStruct *f = (MyStruct *)malloc(sizeof(MyStruct)); // GOOD (out parameter)
368+
MyStruct *h = (MyStruct *)malloc(sizeof(MyStruct)); // BAD (not freed)
369+
370+
free(a);
371+
*out_i = b;
372+
373+
free(e);
374+
*out_ms = f;
375+
}
376+
377+
void test_return_by_parameter_caller() {
378+
int *i;
379+
MyStruct *s;
380+
381+
test_return_by_parameter(&i, &s);
382+
free(i);
383+
free(s);
384+
}
385+
386+
// ---
387+
388+
class HasGetterAndFree {
389+
public:
390+
HasGetterAndFree() {
391+
buffer = malloc(1024);
392+
}
393+
394+
~HasGetterAndFree() {
395+
free(buffer);
396+
}
397+
398+
void *getBuffer() {
399+
return buffer;
400+
}
401+
402+
void *buffer;
403+
};
404+
405+
class HasGetterNoFree {
406+
public:
407+
HasGetterNoFree() {
408+
buffer = malloc(1024);
409+
}
410+
411+
void *getBuffer() {
412+
return buffer;
413+
}
414+
415+
void *buffer;
416+
};
417+
418+
void testHasGetter() {
419+
HasGetterAndFree hg;
420+
void *buffer = hg.getBuffer(); // GOOD (freed in destructor) [FALSE POSITIVE]
421+
422+
HasGetterNoFree hg2;
423+
void *buffer2 = hg2.getBuffer(); // GOOD (freed below)
424+
free(buffer2);
425+
426+
HasGetterNoFree hg3;
427+
void *buffer3 = hg3.getBuffer(); // BAD (not freed)
428+
}

0 commit comments

Comments
 (0)