1673dc3d4SNico Weber // RUN: %clangxx_asan -O0 -mllvm -asan-instrument-dynamic-allocas %s -o %t
2673dc3d4SNico Weber // RUN: not %run %t 2>&1 | FileCheck %s
3673dc3d4SNico Weber //
4673dc3d4SNico Weber 
5673dc3d4SNico Weber // This is reduced testcase based on Chromium code.
6673dc3d4SNico Weber // See http://reviews.llvm.org/D6055?vs=on&id=15616&whitespace=ignore-all#toc.
7673dc3d4SNico Weber 
8673dc3d4SNico Weber #include <stdint.h>
9673dc3d4SNico Weber #include <assert.h>
10673dc3d4SNico Weber 
11673dc3d4SNico Weber int a = 7;
12673dc3d4SNico Weber int b;
13673dc3d4SNico Weber int c;
14673dc3d4SNico Weber int *p;
15673dc3d4SNico Weber 
fn3(int * first,int second)16673dc3d4SNico Weber __attribute__((noinline)) void fn3(int *first, int second) {
17673dc3d4SNico Weber }
18673dc3d4SNico Weber 
main()19673dc3d4SNico Weber int main() {
20673dc3d4SNico Weber   int d = b && c;
21*c0fa6322SVitaly Buka   int e[a];
22673dc3d4SNico Weber   assert(!(reinterpret_cast<uintptr_t>(e) & 31L));
23673dc3d4SNico Weber   int f;
24673dc3d4SNico Weber   if (d)
25673dc3d4SNico Weber     fn3(&f, sizeof 0 * (&c - e));
26673dc3d4SNico Weber   e[a] = 0;
27673dc3d4SNico Weber // CHECK: ERROR: AddressSanitizer: dynamic-stack-buffer-overflow on address [[ADDR:0x[0-9a-f]+]]
28673dc3d4SNico Weber // CHECK: WRITE of size 4 at [[ADDR]] thread T0
29673dc3d4SNico Weber   return 0;
30673dc3d4SNico Weber }
31