Skip to content
Snippets Groups Projects
Select Git revision
  • 036f25c16b8f8b9f418ed38fb532c6dacab95f49
  • main default protected
2 results

shamalloc

  • Clone with SSH
  • Clone with HTTPS
  • Christian Gram Kalhauge's avatar
    chrg authored
    036f25c1
    History

    ShamAlloc

    ShamAlloc! ShamAlloc! ShamAlloc! eh.. It's only a model.

    A dynamic library for making malloc, calloc, and realloc return NULL during tests:

    #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++:

    #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 and 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:

    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.

    add_subdirectory(thirdparty/shamalloc)
    
    ... some where later ...
    
    target_link_libraries(my-target
      shamalloc
      )

    If you are testing a C++ program and Valgrind, please use the shamallocpp target and libshamallocpp.so dynamic library (Also see the Valgrind Section). This is currently experimental.

    Limitations

    Currently, when used with Valgrind or Address Sanitizer, 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.