xref: /openbsd-src/gnu/llvm/clang/docs/analyzer/checkers/unix_malloc_example.c (revision e5dd70708596ae51455a0ffa086a00c5b29f8583)
1*e5dd7070Spatrick 
test()2*e5dd7070Spatrick void test() {
3*e5dd7070Spatrick   int *p = malloc(1);
4*e5dd7070Spatrick   free(p);
5*e5dd7070Spatrick   free(p); // warn: attempt to free released memory
6*e5dd7070Spatrick }
7*e5dd7070Spatrick 
test()8*e5dd7070Spatrick void test() {
9*e5dd7070Spatrick   int *p = malloc(sizeof(int));
10*e5dd7070Spatrick   free(p);
11*e5dd7070Spatrick   *p = 1; // warn: use after free
12*e5dd7070Spatrick }
13*e5dd7070Spatrick 
test()14*e5dd7070Spatrick void test() {
15*e5dd7070Spatrick   int *p = malloc(1);
16*e5dd7070Spatrick   if (p)
17*e5dd7070Spatrick     return; // warn: memory is never released
18*e5dd7070Spatrick }
19*e5dd7070Spatrick 
test()20*e5dd7070Spatrick void test() {
21*e5dd7070Spatrick   int a[] = { 1 };
22*e5dd7070Spatrick   free(a); // warn: argument is not allocated by malloc
23*e5dd7070Spatrick }
24*e5dd7070Spatrick 
test()25*e5dd7070Spatrick void test() {
26*e5dd7070Spatrick   int *p = malloc(sizeof(char));
27*e5dd7070Spatrick   p = p - 1;
28*e5dd7070Spatrick   free(p); // warn: argument to free() is offset by -4 bytes
29*e5dd7070Spatrick }
30*e5dd7070Spatrick 
31