diff --git a/.github/workflows/actions.yml b/.github/workflows/actions.yml index ec79195c..e89cb371 100644 --- a/.github/workflows/actions.yml +++ b/.github/workflows/actions.yml @@ -30,10 +30,6 @@ jobs: -DCMAKE_CXX_COMPILER=${{ matrix.cfg.cxx }} -DCMAKE_BUILD_TYPE=${{ matrix.build_type }} - - name: Enable memcpy interposition? - if: ${{ matrix.cfg.cc == 'gcc' }} - run: cmake -S. -Bbuild -DDICE_INTERPOSE_MEMCPY=on - - name: Build run: cmake --build build - name: Test diff --git a/CMakeLists.txt b/CMakeLists.txt index 135b7c2a..6e244df0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -9,9 +9,7 @@ project( set(CMAKE_EXPORT_COMPILE_COMMANDS ON) -add_compile_options(-Wall -Wextra -Werror) - -option(DICE_INTERPOSE_MEMCPY "Build dice-memcpy (memcpy, memset, memmove)" off) +add_compile_options(-g -Wall -Wextra -Werror) # LTO setup option(DICE_LTO "Build Dice with LTO" on) diff --git a/src/mod/CMakeLists.txt b/src/mod/CMakeLists.txt index 7ed6c6cc..508f50ea 100644 --- a/src/mod/CMakeLists.txt +++ b/src/mod/CMakeLists.txt @@ -15,7 +15,7 @@ foreach(SRC ${SRCS}) get_filename_component(MODULE ${SRC} NAME_WLE) set(TARGET dice-${MODULE}) - if(${TARGET} STREQUAL "dice-memcpy" AND NOT ${DICE_INTERPOSE_MEMCPY}) + if(${TARGET} STREQUAL "dice-memcpy") continue() endif() diff --git a/src/mod/memcpy.c b/src/mod/memcpy.c index 2d4f35db..d0e9f66a 100644 --- a/src/mod/memcpy.c +++ b/src/mod/memcpy.c @@ -14,7 +14,6 @@ INTERPOSE(void *, memcpy, void *dest ,const void *src ,size_t num) .dest = dest, .src = src, .num = num, - .ret = 0, }; metadata_t md = {0}; @@ -31,7 +30,6 @@ INTERPOSE(void *, memmove, void *dest ,const void *src ,size_t count) .dest = dest, .src = src, .count = count, - .ret = 0, }; metadata_t md = {0}; @@ -48,7 +46,6 @@ INTERPOSE(void *, memset, void *ptr ,int value, size_t num) .ptr = ptr, .value = value, .num = num, - .ret = 0, }; metadata_t md = {0}; diff --git a/test/interpose/CMakeLists.txt b/test/interpose/CMakeLists.txt index 2e259cb6..4ccb4082 100644 --- a/test/interpose/CMakeLists.txt +++ b/test/interpose/CMakeLists.txt @@ -6,7 +6,7 @@ set(INTERPOSED_IN ${CMAKE_CURRENT_SOURCE_DIR}/interposed.h.in) set(FUNS_malloc malloc calloc realloc free posix_memalign aligned_alloc) set(INCL_malloc '') -set(FUNS_memcpy memcpy memmove memset) +set(FUNS_memcpy memcpy) set(INCL_memcpy '') set(FUNS_mman mmap munmap) @@ -53,10 +53,6 @@ set(MODS sem cxa) -if(${DICE_INTERPOSE_MEMCPY}) - set(MODS memcpy ${MODS}) -endif() - if(NOT ${ENABLE_SANITIZER}) # malloc does not play well with the sanitizers set(MODS malloc ${MODS}) @@ -93,3 +89,10 @@ foreach(MOD ${MODS}) target_link_libraries(${TARGET} PRIVATE ${LIBSAN_LINK}) endif() endforeach() + +# Add the test executable +add_executable(memcpy_test ${CMAKE_CURRENT_SOURCE_DIR}/memcpy_test.c) + +# Link any required libraries (optional) +target_link_libraries(memcpy_test PRIVATE dice.o tsano pthread) +add_test(NAME memcpy_test COMMAND memcpy_test) diff --git a/test/interpose/memcpy_test.c b/test/interpose/memcpy_test.c index c7187ab7..1a146c8e 100644 --- a/test/interpose/memcpy_test.c +++ b/test/interpose/memcpy_test.c @@ -4,6 +4,7 @@ */ #include #include +#define memcpy fake_memcpy #include #define DICE_TEST_INTERPOSE @@ -101,8 +102,8 @@ fake_memset(void *ptr, int value, size_t num) ensure(value == E_memset.value); ensure(num == E_memset.num); /* return expected value */ - return E_memset.ret; -} + return E_memset.ret; +} #define ASSERT_FIELD_EQ(E, field) \ ensure(memcmp(&ev->field, &(E)->field, sizeof(__typeof((E)->field))) == 0); @@ -143,6 +144,7 @@ PS_SUBSCRIBE(INTERCEPT_AFTER, EVENT_MEMMOVE, { ASSERT_FIELD_EQ(&E_memmove, count); ASSERT_FIELD_EQ(&E_memmove, ret); }) + PS_SUBSCRIBE(INTERCEPT_BEFORE, EVENT_MEMSET, { if (!enabled()) return PS_STOP_CHAIN; @@ -162,60 +164,62 @@ PS_SUBSCRIBE(INTERCEPT_AFTER, EVENT_MEMSET, { ASSERT_FIELD_EQ(&E_memset, ret); }) - -static void -event_init(void *ptr, size_t n) -{ - char *buf = ptr; - for (size_t i = 0; i < n; i++) - buf[i] = rand() % 256; -} - /* test case */ +const int SIZE = 10; static void test_memcpy(void) { - /* initialize event with random content */ - event_init(&E_memcpy, sizeof(struct memcpy_event)); - /* call memcpy with arguments */ enable(fake_memcpy); - void * ret = // + char dest[SIZE]; + E_memcpy.dest = dest; + char hello[] = "Hello!"; + E_memcpy.src= hello; + E_memcpy.num = strlen(E_memcpy.src) + 1; + E_memcpy.ret = E_memcpy.dest; + void * ret = // memcpy( // E_memcpy.dest, // E_memcpy.src, // - E_memcpy.num ); - ensure(ret == E_memcpy.ret); + E_memcpy.num ); + ensure(ret == E_memcpy.dest); disable(); } + static void test_memmove(void) { - /* initialize event with random content */ - event_init(&E_memmove, sizeof(struct memmove_event)); - /* call memmove with arguments */ enable(fake_memmove); - void * ret = // + char dest[SIZE]; + E_memmove.dest = dest; + char hello[] = "Hi there!"; + E_memmove.src= hello; + E_memmove.count = 2; + E_memmove.ret = E_memmove.dest; + void * ret = // memmove( // E_memmove.dest, // E_memmove.src, // E_memmove.count ); - ensure(ret == E_memmove.ret); + ensure(ret == E_memmove.dest); disable(); } + static void test_memset(void) { - /* initialize event with random content */ - event_init(&E_memset, sizeof(struct memset_event)); - /* call memset with arguments */ enable(fake_memset); - void * ret = // + char dest[SIZE]; + E_memset.ptr = dest; + E_memset.value= 3; + E_memset.num = 5; + E_memset.ret = E_memset.ptr; + void * ret = // memset( // E_memset.ptr, // E_memset.value, // E_memset.num ); - ensure(ret == E_memset.ret); + ensure(ret == E_memset.ptr); disable(); }