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