Skip to content
Snippets Groups Projects
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.