| // RUN: %clangxx_asan -O0 -fsanitize-address-field-padding=1 %s -o %t |
| // RUN: not %run %t 11 2>&1 | FileCheck %s |
| // RUN: %run %t 10 |
| // |
| // FIXME: fix 32-bits. |
| // REQUIRES: asan-64-bits, shadow-scale-3 |
| // FIXME: Implement ASan intra-object padding in Clang's MS record layout |
| // UNSUPPORTED: win32 |
| #include <stdio.h> |
| #include <stdlib.h> |
| class Foo { |
| public: |
| Foo() : pre1(1), pre2(2), post1(3), post2(4) { |
| } |
| virtual ~Foo() { |
| } |
| void set(int i, int val) { a[i] = val; } |
| // CHECK: ERROR: AddressSanitizer: intra-object-overflow |
| // CHECK: #0 {{.*}}Foo::set{{.*}}intra-object-overflow.cc:[[@LINE-2]] |
| private: |
| int pre1, pre2; |
| int a[11]; |
| int post1, post2; |
| }; |
| |
| int main(int argc, char **argv) { |
| int idx = argc == 2 ? atoi(argv[1]) : 0; |
| Foo *foo = new Foo; |
| foo->set(idx, 42); |
| // CHECK: #1 {{.*}}main{{.*}}intra-object-overflow.cc:[[@LINE-1]] |
| // CHECK: is located 84 bytes inside of 128-byte region |
| delete foo; |
| } |