1*673dc3d4SNico Weber // If user provides his own libc functions, ASan doesn't
2*673dc3d4SNico Weber // intercept these functions.
3*673dc3d4SNico Weber
4*673dc3d4SNico Weber // RUN: %clangxx_asan -O0 %s -o %t && %run %t 2>&1 | FileCheck %s
5*673dc3d4SNico Weber // RUN: %clangxx_asan -O1 %s -o %t && %run %t 2>&1 | FileCheck %s
6*673dc3d4SNico Weber // RUN: %clangxx_asan -O2 %s -o %t && %run %t 2>&1 | FileCheck %s
7*673dc3d4SNico Weber // RUN: %clangxx_asan -O3 %s -o %t && %run %t 2>&1 | FileCheck %s
8*673dc3d4SNico Weber // XFAIL: freebsd
9*673dc3d4SNico Weber
10*673dc3d4SNico Weber // On Windows, defining strtoll in a static build results in linker errors, but
11*673dc3d4SNico Weber // it works with the dynamic runtime.
12*673dc3d4SNico Weber // XFAIL: win32-static-asan
13*673dc3d4SNico Weber
14*673dc3d4SNico Weber // On NetBSD, defining strtol in a static build results in linker errors, but
15*673dc3d4SNico Weber // it works with the dynamic runtime.
16*673dc3d4SNico Weber // XFAIL: netbsd && !asan-dynamic-runtime
17*673dc3d4SNico Weber
18*673dc3d4SNico Weber #include <stdlib.h>
19*673dc3d4SNico Weber #include <stdio.h>
20*673dc3d4SNico Weber #include <string.h>
21*673dc3d4SNico Weber
strtol(const char * nptr,char ** endptr,int base)22*673dc3d4SNico Weber extern "C" long strtol(const char *nptr, char **endptr, int base) {
23*673dc3d4SNico Weber fprintf(stderr, "my_strtol_interceptor\n");
24*673dc3d4SNico Weber if (endptr)
25*673dc3d4SNico Weber *endptr = (char*)nptr + strlen(nptr);
26*673dc3d4SNico Weber return 0;
27*673dc3d4SNico Weber }
28*673dc3d4SNico Weber
main()29*673dc3d4SNico Weber int main() {
30*673dc3d4SNico Weber char *x = (char*)malloc(10 * sizeof(char));
31*673dc3d4SNico Weber free(x);
32*673dc3d4SNico Weber return (int)strtol(x, 0, 10);
33*673dc3d4SNico Weber // CHECK: my_strtol_interceptor
34*673dc3d4SNico Weber // CHECK-NOT: heap-use-after-free
35*673dc3d4SNico Weber }
36