Preprocessing C source files
FastCheck doesn't automatically pre-process your source files. On most flavors of UNIX, you can invoke the C preprocessor directly:
$ cpp file.c > file.i
Using the GNU toolchain, this can also be done with the -E option to gcc:
$ gcc -E file.c > file.i
See your compiler's documentation for further details.
The stubs.c file
FastCheck implicitly adds a source file named ../stubs.c to your list of files to analyze. This file is meant to contain pseudo-definitions of external functions. These definitions do not need to be a complete implementation of the function, but they should exhibit the same value-passing and allocation/deallocation behavior as a full implementation. This is especially useful if you don't have the source code for some allocators or deallocators.
The command line flag -stubs=no tells fastCheck not to look for a ../stubs.c file.
Here is an example stubs.c
typedef unsigned int size_t; void *memcpy (void * dest, const void * src, size_t n) { return dest; } void *memmove (void *dest, const void *src, size_t n) { return dest; } void *memccpy (void * dest, const void * src, int c, size_t n) { return dest; } void *memset (void *s, int c, size_t n) { return s; } void *memchr (const void *s, int c, size_t n) { return s; } char *strcpy (char * dest, const char * src) { return dest; } char *strncpy (char * dest, const char * src, size_t n) { return dest; } char *strcat (char * dest, const char * src) { return dest; } char *strncat (char * dest, const char * src, size_t n) { return dest; } char *strdup (const char *s) { char *t = malloc(sizeof(char*) * 10); return t; } char *strndup(const char *s, size_t n) { char *t = malloc(sizeof(char*) * 10); return t; } char *strdupa(const char *s) { char *t = alloca(sizeof(char*) * 10); return t; } char *strndupa(const char *s, size_t n) { char *t = alloca(sizeof(char*) * n); return t; } char *strsep (char ** stringp, const char * delim) { return *stringp; } void* realloc(void* s, size_t size) { return s; }
Allocation Site Categories
Subdirectory | Meaning | Reported by default? |
---|---|---|
freed.cond.leaked | Possible error: Memory may leak on some execution paths. | Yes |
freed.ok | Ok: memory is always freed. | No |
not_freed.local.not_main | Error: memory placed in local variables is never freed. | Yes |
not_freed.local.main |
Error: memory allocated in main is not freed.
| No |
not_freed.not_local | Error: memory placed in global or aggregate structures is never freed. | No |
freed.local.unknown | Too complicated; cannot draw any conclusions. | No |
freed.not_local.unknown | Too complicated; cannot draw any conclusions. | No |
Please refer to the paper for more details.