#include <stdlib.h> #include <stdio.h> static void* return_arg(void* p); int frame3 ( void ) { int *a = malloc(10 * sizeof(int)); // bad address; int n = a[10]; // undefined condition if (a[5] == 42) { printf("hello from frame3(). The answer is 42.\n"); } else { printf("hello from frame3(). The answer is not 42.\n"); } // undefined address (careful ..) n = a[ a[0] & 7 ]; // invalid free, the second time free(a); free(a); // more invalid frees free(return_arg(&n)); // leak .. a = malloc(99 * sizeof(int)); // pass garbage to the exit syscall return n; } int frame2 ( void ) { return frame3() - 1; } int frame1 ( void ) { return frame2() + 1; } int main ( void ) { int ret = frame1() - 1; #if defined(VGO_solaris) /* Avoid reporting possible memory leak on finish when both FILE->base and FILE->ptr point to the middle of a buffer allocated in _findbuf() for stdout. */ fcloseall(); #endif return ret; } /* * The only purpose of the function below is to make sure that gcc 4.4.x does * not print the following warning during the compilation of this test program: * warning: attempt to free a non-heap object */ static void* return_arg(void* p) { return p; }