From b768d5b863bcc2f425a2b321bf720221982362a6 Mon Sep 17 00:00:00 2001 From: Vitaly Buka Date: Sat, 24 Jun 2017 01:40:41 +0000 Subject: [PATCH] [asan] Regression test for PR33372 Reviewers: eugenis Subscribers: kubamracek, llvm-commits Differential Revision: https://reviews.llvm.org/D34315 llvm-svn: 306195 --- compiler-rt/test/asan/TestCases/pr33372.cc | 39 ++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 compiler-rt/test/asan/TestCases/pr33372.cc diff --git a/compiler-rt/test/asan/TestCases/pr33372.cc b/compiler-rt/test/asan/TestCases/pr33372.cc new file mode 100644 index 000000000000..a4b606e025c9 --- /dev/null +++ b/compiler-rt/test/asan/TestCases/pr33372.cc @@ -0,0 +1,39 @@ +// RUN: %clangxx_asan -O0 -std=c++11 %s -o %t && %run %t 2>&1 | FileCheck %s +// RUN: %clangxx_asan -O1 -std=c++11 %s -o %t && %run %t 2>&1 | FileCheck %s +// RUN: %clangxx_asan -O2 -std=c++11 %s -o %t && %run %t 2>&1 | FileCheck %s + +// Test that we do not detect false buffer overflows cased by optimization when +// when local variable replaced by a smaller global constant. +// https://bugs.llvm.org/show_bug.cgi?id=33372 + +#include +#include + +struct A { int x, y, z; }; +struct B { A a; /*gap*/ long b; }; +B *bb; + +void test1() { + A a1 = {1, 1, 2}; + B b1 = {a1, 6}; + bb = new B(b1); +} + +const char KKK[] = {1, 1, 2}; +char bbb[100000]; + +void test2() { + char cc[sizeof(bbb)]; + memcpy(cc, KKK , sizeof(KKK)); + memcpy(bbb, cc, sizeof(bbb)); +} + +int main(int argc, char *argv[]) { + test1(); + test2(); + printf("PASSED"); + return 0; +} + +// CHECK-NOT: ERROR: AddressSanitizer +// CHECK: PASSED