fuzz testing #11
3 changed files with 21 additions and 1 deletions
|
@ -84,4 +84,11 @@ add_executable(soak tests/soak.c lib/common.c lib/tdigest.c lib/roaring.c)
|
|||
target_link_libraries(soak PRIVATE sparsemap)
|
||||
target_include_directories(soak PRIVATE ${HEADER_DIR} lib)
|
||||
target_link_libraries(soak PUBLIC m)
|
||||
add_custom_target(run_soak COMMAND soak WORKING_DIRECTORY ${CMAKE_BINARY_DIR})
|
||||
add_custom_target(run_soak COMMAND soak WORKING_DIRECTORY ${CMAKE_BINARY_DIR})
|
||||
|
||||
# Add fuzzer program
|
||||
add_executable(fuzzer tests/fuzzer.c)
|
||||
target_link_libraries(fuzzer PRIVATE sparsemap)
|
||||
target_include_directories(fuzzer PRIVATE ${HEADER_DIR} lib)
|
||||
target_link_libraries(fuzzer PUBLIC m)
|
||||
add_custom_target(run_fuzzer COMMAND fuzzer WORKING_DIRECTORY ${CMAKE_BINARY_DIR})
|
||||
|
|
6
Makefile
6
Makefile
|
@ -49,6 +49,9 @@ test: tests
|
|||
soak: tests
|
||||
env ASAN_OPTIONS=detect_leaks=1 LSAN_OPTIONS=verbosity=1:log_threads=1 ./tests/soak
|
||||
|
||||
fuzzer: tests
|
||||
env ASAN_OPTIONS=detect_leaks=1 LSAN_OPTIONS=verbosity=1:log_threads=1 ./tests/fuzzer ./crash.case
|
||||
|
||||
tests/test: $(TEST_OBJS) $(LIB_OBJS) $(STATIC_LIB)
|
||||
$(CC) $^ $(LIBS) -o $@ $(TEST_FLAGS)
|
||||
|
||||
|
@ -90,6 +93,9 @@ examples/ex_4: $(LIB_OBJS) examples/ex_4.o $(STATIC_LIB)
|
|||
tests/soak: $(LIB_OBJS) tests/soak.o $(STATIC_LIB)
|
||||
$(CC) $^ $(LIBS) -o $@ $(TEST_FLAGS)
|
||||
|
||||
tests/fuzzer: $(LIB_OBJS) tests/fuzzer.o $(STATIC_LIB)
|
||||
$(CC) $^ $(LIBS) -o $@ $(TEST_FLAGS) -DFUZZ_DEBUG
|
||||
|
||||
todo:
|
||||
rg -i 'todo|gsb|abort'
|
||||
|
||||
|
|
|
@ -1705,6 +1705,10 @@ sparsemap_select(sparsemap_t *map, sparsemap_idx_t n, bool value)
|
|||
sm_idx_t start;
|
||||
size_t count = __sm_get_chunk_count(map);
|
||||
|
||||
if (count == 0 && value == false) {
|
||||
return n;
|
||||
}
|
||||
|
||||
uint8_t *p = __sm_get_chunk_data(map, 0);
|
||||
|
||||
for (size_t i = 0; i < count; i++) {
|
||||
|
@ -1847,6 +1851,9 @@ sparsemap_span(sparsemap_t *map, sparsemap_idx_t idx, size_t len, bool value)
|
|||
many selects we can avoid by taking the rank of the range and starting
|
||||
at that bit. */
|
||||
nth = (idx == 0) ? 0 : sparsemap_rank(map, 0, idx - 1, value);
|
||||
if (SPARSEMAP_NOT_FOUND(nth)) {
|
||||
return nth;
|
||||
}
|
||||
/* Find the first bit that matches value, then... */
|
||||
offset = sparsemap_select(map, nth, value);
|
||||
do {
|
||||
|
|
Loading…
Reference in a new issue