brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.6 KiB · e95de73 Raw
94 lines · cpp
1// Test the weak hooks.2// RUN: %clangxx %s -o %t && %run %t3 4// Must not be implemented, no other reason to install interceptors.5// XFAIL: lsan, ubsan6 7// FIXME: Implement.8// XFAIL: hwasan9 10#include <assert.h>11#include <string.h>12#if defined(_GNU_SOURCE)13#include <strings.h> // for bcmp14#endif15 16bool seen_memcmp, seen_strncmp, seen_strncasecmp, seen_strcmp, seen_strcasecmp,17    seen_strstr, seen_strcasestr, seen_memmem;18 19extern "C" {20void __sanitizer_weak_hook_memcmp(void *called_pc, const void *s1,21                                  const void *s2, size_t n, int result) {22  seen_memcmp = true;23}24void __sanitizer_weak_hook_strncmp(void *called_pc, const char *s1,25                                   const char *s2, size_t n, int result) {26  seen_strncmp = true;27}28void __sanitizer_weak_hook_strncasecmp(void *called_pc, const char *s1,29                                       const char *s2, size_t n, int result){30  seen_strncasecmp = true;31}32void __sanitizer_weak_hook_strcmp(void *called_pc, const char *s1,33                                  const char *s2, int result){34  seen_strcmp = true;35}36void __sanitizer_weak_hook_strcasecmp(void *called_pc, const char *s1,37                                      const char *s2, int result){38  seen_strcasecmp = true;39}40void __sanitizer_weak_hook_strstr(void *called_pc, const char *s1,41                                  const char *s2, char *result){42  seen_strstr = true;43}44void __sanitizer_weak_hook_strcasestr(void *called_pc, const char *s1,45                                      const char *s2, char *result){46  seen_strcasestr = true;47}48void __sanitizer_weak_hook_memmem(void *called_pc, const void *s1, size_t len1,49                                  const void *s2, size_t len2, void *result){50  seen_memmem = true;51}52} // extern "C"53 54char s1[] = "ABCDEF";55char s2[] = "CDE";56 57static volatile int int_sink;58static volatile void *ptr_sink;59 60int main() {61  assert(sizeof(s2) < sizeof(s1));62 63  int_sink = memcmp(s1, s2, sizeof(s2));64  assert(seen_memcmp);65 66#if (defined(__linux__) && !defined(__ANDROID__) && defined(_GNU_SOURCE)) || defined(__NetBSD__) || defined(__FreeBSD__) || defined(__OpenBSD__)67  seen_memcmp = false;68  int_sink = bcmp(s1, s2, sizeof(s2));69  assert(seen_memcmp);70#endif71 72  int_sink = strncmp(s1, s2, sizeof(s2));73  assert(seen_strncmp);74 75  int_sink = strncasecmp(s1, s2, sizeof(s2));76  assert(seen_strncasecmp);77 78  int_sink = strcmp(s1, s2);79  assert(seen_strcmp);80 81  int_sink = strcasecmp(s1, s2);82  assert(seen_strcasecmp);83 84  ptr_sink = strstr(s1, s2);85  assert(seen_strstr);86 87  ptr_sink = strcasestr(s1, s2);88  assert(seen_strcasestr);89 90  ptr_sink = memmem(s1, sizeof(s1), s2, sizeof(s2));91  assert(seen_memmem);92  return 0;93}94