diff --git a/compiler-rt/lib/dfsan/dfsan_custom.cpp b/compiler-rt/lib/dfsan/dfsan_custom.cpp --- a/compiler-rt/lib/dfsan/dfsan_custom.cpp +++ b/compiler-rt/lib/dfsan/dfsan_custom.cpp @@ -129,6 +129,14 @@ return 0; } +SANITIZER_INTERFACE_ATTRIBUTE int __dfsw_bcmp(const void *s1, const void *s2, + size_t n, dfsan_label s1_label, + dfsan_label s2_label, + dfsan_label n_label, + dfsan_label *ret_label) { + return __dfsw_memcmp(s1, s2, n, s1_label, s2_label, n_label, ret_label); +} + DECLARE_WEAK_INTERCEPTOR_HOOK(dfsan_weak_hook_strcmp, uptr caller_pc, const char *s1, const char *s2, dfsan_label s1_label, dfsan_label s2_label) diff --git a/compiler-rt/lib/dfsan/done_abilist.txt b/compiler-rt/lib/dfsan/done_abilist.txt --- a/compiler-rt/lib/dfsan/done_abilist.txt +++ b/compiler-rt/lib/dfsan/done_abilist.txt @@ -183,6 +183,7 @@ # Functions that produce an output that is computed from the input, but is not # necessarily data dependent. +fun:bcmp=custom fun:memchr=custom fun:memcmp=custom fun:strcasecmp=custom diff --git a/compiler-rt/test/dfsan/custom.cpp b/compiler-rt/test/dfsan/custom.cpp --- a/compiler-rt/test/dfsan/custom.cpp +++ b/compiler-rt/test/dfsan/custom.cpp @@ -17,12 +17,13 @@ #include #include #include -#include #include +#include #include #include -#include +#include #include +#include #include #include #include @@ -86,6 +87,24 @@ #endif } +void test_bcmp() { + char str1[] = "str1", str2[] = "str2"; + dfsan_set_label(i_label, &str1[3], 1); + dfsan_set_label(j_label, &str2[3], 1); + + int rv = bcmp(str1, str2, sizeof(str1)); + assert(rv != 0); +#ifdef STRICT_DATA_DEPENDENCIES + ASSERT_ZERO_LABEL(rv); +#else + ASSERT_LABEL(rv, i_j_label); +#endif + + rv = bcmp(str1, str2, sizeof(str1) - 2); + assert(rv == 0); + ASSERT_ZERO_LABEL(rv); +} + void test_memcpy() { char str1[] = "str1"; char str2[sizeof(str1)]; @@ -967,6 +986,7 @@ assert(i_j_label != j_label); assert(i_j_label != k_label); + test_bcmp(); test_calloc(); test_clock_gettime(); test_ctime_r();