• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Make sure everything works even if the main module doesn't have any stack
2 // variables, thus doesn't explicitly reference any symbol exported by the
3 // runtime thunk.
4 //
5 // RUN: %clang_cl_asan -LD -O0 -DDLL1 %s -Fe%t1.dll
6 // RUN: %clang_cl_asan -LD -O0 -DDLL2 %s -Fe%t2.dll
7 // RUN: %clang_cl_asan -O0 -DEXE %s %t1.lib %t2.lib -Fe%t
8 // RUN: not %run %t 2>&1 | FileCheck %s
9 
10 #include <malloc.h>
11 #include <string.h>
12 
13 extern "C" {
14 #if defined(EXE)
15 __declspec(dllimport) void foo1();
16 __declspec(dllimport) void foo2();
17 
main()18 int main() {
19   foo1();
20   foo2();
21 }
22 #elif defined(DLL1)
23 __declspec(dllexport) void foo1() {}
24 #elif defined(DLL2)
25 __attribute__((noinline))
26 static void NullDeref(int *ptr) {
27   // CHECK: ERROR: AddressSanitizer: access-violation on unknown address
28   // CHECK:   {{0x0*000.. .*pc 0x.*}}
29   ptr[10]++;  // BOOM
30 }
31 
32 __declspec(dllexport) void foo2() {
33   NullDeref((int*)0);
34   // CHECK: {{    #1 0x.* in foo2.*null_deref_multiple_dlls.cc:}}[[@LINE-1]]
35   // CHECK: AddressSanitizer can not provide additional info.
36 }
37 #else
38 # error oops!
39 #endif
40 }
41