1 // Test strict_string_checks option in strncmp function
2 // RUN: %clang_asan %s -o %t
4 // RUN: %env_asan_opts=strict_string_checks=false %run %t a 2>&1
5 // RUN: %env_asan_opts=strict_string_checks=true %run %t a 2>&1
6 // RUN: not %run %t b 2>&1 | FileCheck %s
7 // RUN: not %run %t c 2>&1 | FileCheck %s
8 // RUN: not %run %t d 2>&1 | FileCheck %s
9 // RUN: not %run %t e 2>&1 | FileCheck %s
10 // RUN: not %run %t f 2>&1 | FileCheck %s
11 // RUN: not %run %t g 2>&1 | FileCheck %s
12 // RUN: %env_asan_opts=strict_string_checks=false %run %t h 2>&1
13 // RUN: %env_asan_opts=strict_string_checks=true not %run %t h 2>&1 | FileCheck %s
14 // RUN: %env_asan_opts=strict_string_checks=false %run %t i 2>&1
15 // RUN: %env_asan_opts=strict_string_checks=true not %run %t i 2>&1 | FileCheck %s
17 // XFAIL: target={{.*windows-(msvc.*|gnu)}}
25 int main(int argc
, char **argv
) {
31 memset(s1
, fill
, size
);
32 memset(s2
, fill
, size
);
38 for (int i
= 0; i
<= size
; ++i
)
39 assert((strncasecmp(s1
, s2
, i
) == 0) == (i
< size
));
42 assert(strncasecmp(s1
, s2
, 2*size
) == 0);
45 return strncasecmp(s1
-1, s2
, 1);
47 return strncasecmp(s1
, s2
-1, 1);
49 return strncasecmp(s1
+size
, s2
, 1);
51 return strncasecmp(s1
, s2
+size
, 1);
53 return strncasecmp(s1
+1, s2
, size
);
55 return strncasecmp(s1
, s2
+1, size
);
58 assert(strncasecmp(s1
, s2
, 2*size
) != 0);
62 assert(strncasecmp(s1
, s2
, 2*size
) != 0);
64 // CHECK: {{.*}}ERROR: AddressSanitizer: stack-buffer-{{ov|und}}erflow on address