Index: lib/dfsan/dfsan_custom.cc =================================================================== --- lib/dfsan/dfsan_custom.cc +++ lib/dfsan/dfsan_custom.cc @@ -1132,4 +1132,26 @@ va_end(ap); return ret; } -} // extern "C" + +// Default empty implementations (weak). Users should redefine them. +SANITIZER_INTERFACE_WEAK_DEF(void, __sanitizer_cov_trace_pc_guard, u32 *) {} +SANITIZER_INTERFACE_WEAK_DEF(void, __sanitizer_cov_trace_pc_guard_init, u32 *, + u32 *) {} +SANITIZER_INTERFACE_WEAK_DEF(void, __sanitizer_cov_pcs_init, void) {} +SANITIZER_INTERFACE_WEAK_DEF(void, __sanitizer_cov_trace_pc_indir, void) {} + +SANITIZER_INTERFACE_WEAK_DEF(void, __dfsw___sanitizer_cov_trace_cmp, void) {} +SANITIZER_INTERFACE_WEAK_DEF(void, __dfsw___sanitizer_cov_trace_cmp1, void) {} +SANITIZER_INTERFACE_WEAK_DEF(void, __dfsw___sanitizer_cov_trace_cmp2, void) {} +SANITIZER_INTERFACE_WEAK_DEF(void, __dfsw___sanitizer_cov_trace_cmp4, void) {} +SANITIZER_INTERFACE_WEAK_DEF(void, __dfsw___sanitizer_cov_trace_cmp8, void) {} +SANITIZER_INTERFACE_WEAK_DEF(void, __dfsw___sanitizer_cov_trace_const_cmp1, + void) {} +SANITIZER_INTERFACE_WEAK_DEF(void, __dfsw___sanitizer_cov_trace_const_cmp2, + void) {} +SANITIZER_INTERFACE_WEAK_DEF(void, __dfsw___sanitizer_cov_trace_const_cmp4, + void) {} +SANITIZER_INTERFACE_WEAK_DEF(void, __dfsw___sanitizer_cov_trace_const_cmp8, + void) {} +SANITIZER_INTERFACE_WEAK_DEF(void, __dfsw___sanitizer_cov_trace_switch, void) {} +} // extern "C" Index: lib/dfsan/scripts/check_custom_wrappers.sh =================================================================== --- lib/dfsan/scripts/check_custom_wrappers.sh +++ lib/dfsan/scripts/check_custom_wrappers.sh @@ -23,6 +23,7 @@ | grep -v "dfsan_get_label\|__sanitizer_cov_trace" \ | sed "s/^fun:\(.*\)=custom.*/\1/" | sort > $DIFF_A grep -E "__dfsw.*\(" ${DFSAN_CUSTOM_WRAPPERS} \ + | grep -v "__sanitizer_cov_trace" \ | sed "s/.*__dfsw_\(.*\)(.*/\1/" | sort > $DIFF_B diff -u $DIFF_A $DIFF_B > ${DIFFOUT} if [ $? -ne 0 ] @@ -33,6 +34,7 @@ fi grep -E __dfsw_ ${DFSAN_CUSTOM_WRAPPERS} \ + | grep -v "__sanitizer_cov_trace" \ | sed "s/.*__dfsw_\([^(]*\).*/\1/" | sort > $DIFF_A grep -E "^[[:space:]]*test_.*\(\);" ${DFSAN_CUSTOM_TESTS} \ | sed "s/.*test_\(.*\)();/\1/" | sort > $DIFF_B Index: test/dfsan/trace-cmp.c =================================================================== --- test/dfsan/trace-cmp.c +++ test/dfsan/trace-cmp.c @@ -0,0 +1,50 @@ +// Checks that dfsan works with trace-cmp instrumentation, even if some hooks +// are not defined (relies on week hooks implemented in dfsan). +// +// RUN: %clang_dfsan -fsanitize-coverage=trace-pc-guard,pc-table,func,trace-cmp %s -o %t +// RUN: %run %t 2>&1 | FileCheck %s + +#include +#include +#include + +#include + +uint32_t a4, b4; +uint64_t a8, b8; + +// Define just two hooks, and leave others undefined. +void __dfsw___sanitizer_cov_trace_const_cmp4(uint8_t a, uint8_t b, + dfsan_label l1, dfsan_label l2) { + printf("const_cmp4 %d %d\n", a, b); +} +void __dfsw___sanitizer_cov_trace_cmp8(uint8_t a, uint8_t b, dfsan_label l1, + dfsan_label l2) { + printf("cmp8 %d %d\n", a, b); +} + +int main(int argc, char **argv) { + printf("MAIN\n"); + // CHECK: MAIN + + if (a4 != b4) abort(); + if (a4 == 42) abort(); + // CHECK: const_cmp4 42 0 + if (a8 != b8) abort(); + // CHECK: cmp8 0 0 + if (a8 == 66) abort(); + + switch (10 / (a4 + 2)) { + case 1: abort(); + case 2: exit(1); + case 5: + printf("SWITCH OK\n"); + break; + } + // CHECK: SWITCH OK + + + printf("DONE\n"); + // CHECK: DONE + return 0; +}