16a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines// RUN: %clang_cl_asan -O0 %p/dll_host.cc -Fe%t 26a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines// RUN: %clang_cl_asan -LD -O0 %s -Fe%t.dll 36a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines// RUN: not %run %t %t.dll 2>&1 | FileCheck %s 46a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines 56a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines// Test that it works correctly even with ICF enabled. 66a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines// RUN: %clang_cl_asan -LD -O0 %s -Fe%t.dll -link /OPT:REF /OPT:ICF 76a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines// RUN: not %run %t %t.dll 2>&1 | FileCheck %s 86a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines 96a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines#include <stdio.h> 106a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines#include <string.h> 116a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines 126a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hinesextern "C" __declspec(dllexport) 136a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hinesint test_function() { 146a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines char buff[5] = "aaaa"; 156a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines 166a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines memset(buff, 'b', 5); 176a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines if (buff[2] != 'b') 186a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines return 2; 196a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines printf("Initial test OK\n"); 206a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines fflush(0); 216a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines// CHECK: Initial test OK 226a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines 236a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines memset(buff, 'c', 6); 246a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines// CHECK: AddressSanitizer: stack-buffer-overflow on address [[ADDR:0x[0-9a-f]+]] 256a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines// CHECK: WRITE of size 6 at [[ADDR]] thread T0 266a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines// CHECK-NEXT: __asan_memset 276a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines// CHECK-NEXT: test_function {{.*}}dll_intercept_memset.cc:[[@LINE-4]] 286a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines// CHECK: Address [[ADDR]] is located in stack of thread T0 at offset {{.*}} in frame 296a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines// CHECK-NEXT: test_function {{.*}}dll_intercept_memset.cc 306a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines// CHECK: 'buff' <== Memory access at offset {{.*}} overflows this variable 316a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines return 0; 326a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines} 33