# ShamAlloc > ShamAlloc! ShamAlloc! ShamAlloc! > eh.. It's only a model. A dynamic library for making `malloc`, `calloc`, and `realloc` return `NULL` during tests: ```c #include <stdio.h> #include <shamalloc.h> int main () { void *a; void *b; // Break malloc, calloc, and realloc after 0 allocations. break_alloc(0); a = malloc(8); // Remember to unbreak malloc again, otherwise printf might fail. break_alloc(-1); // Prints "(null)" printf("%p\n", a); // Break malloc, calloc, and realloc after 1 allocations. break_alloc(1); a = malloc(8); b = malloc(8); break_alloc(-1); // Prints "(null), <pointer>" printf("%p, %p\n", a, b); return 0; } ``` or in c++: ```cpp #include <iostream> #include <shamalloc.h> int main(int argc, char ** argv) { break_alloc(0); try { int * ptr = new int; } catch (const std::bad_alloc& e) { std::cout << "Allocation failed: " << e.what() << "\n"; } break_alloc(-1); int * ptr = new int; std::cout << "Allocation succeded: " << ptr << "\n"; } ``` Also see [test/main.c](test/main.c) and [test/main.cpp](test/main.cpp). *Why, would I ever do such a thing?* Well, most people forget to check if `malloc` returns `NULL`, or that `new` can throw an exception. By using this library you can put a ticking time-bomb under your tests, because it better to fail early than in production. ## Usage Either, include in compilation: ```sh clang -o main main.c libshamalloc.so -I<pathto-shamalloc>/include -ldl ``` Or if you use the `CMake` build system, you can add the code as as subdirectory, in the `CMakeLists.txt` file. ```cmake add_subdirectory(thirdparty/shamalloc) ... some where later ... target_link_libraries(my-target shamalloc ) ``` If you are testing a C++ program and [Valgrind](https://valgrind.org/), please use the `shamallocpp` target and `libshamallocpp.so` dynamic library (Also see the [Valgrind Section](#Valgrind)). This is currently experimental. ## Limitations Currently, when used with [Valgrind](https://valgrind.org/) or [Address Sanitizer](https://clang.llvm.org/docs/AddressSanitizer.html), Valgrind and Address Sanitizer will overload the mallocs instead of using the code of this library. ### Valgrind Wiht valgrind, use the `--soname-synonyms=somalloc` flag, and compile and dynamic link using the C++ version of the library if you are testing a C++ application. ``` valgrind --soname-synonyms=somalloc <binary> ``` ### Address Sanitizer There are courently no workaround.. yet. ### Thread Safty The library is currently not thread-safe, use with causion.