#include #include #include #include typedef enum { TEST_CASE_NONE = 0, TEST_CASE_SHADOW_TAG_POOL_CREATION, TEST_CASE_SHADOW_TAG_CHAIN_CREATION, TEST_CASE_SHADOW_TAG_CHAIN_PREPEND, TEST_CASE_FREE_SHADOW_TAG_CHAIN, TEST_CASE_STRESSTEST } TestCase; TestCase g_current_test_case = TEST_CASE_NONE; int g_stresstest_iteration = 0; const char * stringify_test_case(TestCase test_case) { switch(test_case) { case TEST_CASE_NONE: return "NONE"; case TEST_CASE_SHADOW_TAG_POOL_CREATION: return "SHADOW_TAG_POOL_CREATION"; case TEST_CASE_SHADOW_TAG_CHAIN_CREATION: return "SHADOW_TAG_CHAIN_CREATION"; case TEST_CASE_SHADOW_TAG_CHAIN_PREPEND: return "SHADOW_TAG_CHAIN_PREPEND"; case TEST_CASE_FREE_SHADOW_TAG_CHAIN: return "FREE_SHADOW_TAG_CHAIN"; case TEST_CASE_STRESSTEST: return "STRESSTEST"; } return "?"; } void signal_handler(int number) { printf("FAIL: The program crashed because of a memory error in test: %s\n", stringify_test_case(g_current_test_case)); if(g_current_test_case == TEST_CASE_STRESSTEST) printf("Iteration: %d\n", g_stresstest_iteration); exit(-1); } void test_heavy_use() { g_current_test_case = TEST_CASE_STRESSTEST; MtShadowTagPool *pool = mt_new_shadow_tag_pool(1024); MtShadowTag *tag_chain = mt_alloc_shadow_tag_in_pool(pool); while(g_stresstest_iteration < (1024 * 1024)) { tag_chain = mt_alloc_shadow_tag_before(tag_chain); ++g_stresstest_iteration; } mt_free_shadow_tag_chain(tag_chain); mt_free_shadow_tag_pool(pool); } void test_functionality() { g_current_test_case = TEST_CASE_SHADOW_TAG_POOL_CREATION; MtShadowTagPool *pool = mt_new_shadow_tag_pool(1024); g_current_test_case = TEST_CASE_SHADOW_TAG_CHAIN_CREATION; MtShadowTag *tag_chain = mt_alloc_shadow_tag_in_pool(pool); g_current_test_case = TEST_CASE_SHADOW_TAG_CHAIN_PREPEND; tag_chain = mt_alloc_shadow_tag_before(tag_chain); g_current_test_case = TEST_CASE_FREE_SHADOW_TAG_CHAIN; mt_free_shadow_tag_chain(tag_chain); mt_free_shadow_tag_pool(pool); } int main(int argc, char **argv) { signal(SIGSEGV, &signal_handler); test_functionality(); test_heavy_use(); puts("Success."); return 0; }