[ASan/Win tests] Add tests for stack array manipulation, as well as a use-after-return test

llvm-svn: 208873
This commit is contained in:
Timur Iskhodzhanov 2014-05-15 12:09:45 +00:00
parent 01124a0132
commit a357badc58
4 changed files with 69 additions and 0 deletions

View File

@ -0,0 +1,17 @@
// RUN: %clangxx_asan -O0 %s -Fe%t
// FIXME: 'cat' is needed due to PR19744.
// RUN: not %run %t 2>&1 | cat | FileCheck %s
#include <stdio.h>
int main() {
int subscript = -1;
char buffer[42];
buffer[subscript] = 42;
// CHECK: AddressSanitizer: stack-buffer-overflow on address [[ADDR:0x[0-9a-f]+]]
// CHECK: WRITE of size 1 at [[ADDR]] thread T0
// CHECK-NEXT: {{#0 .* main .*stack_array_left_oob.cc}}:[[@LINE-3]]
// CHECK: Address [[ADDR]] is located in stack of thread T0 at offset [[OFFSET:.*]] in frame
// CHECK-NEXT: {{#0 .* main .*stack_array_left_oob.cc}}
// CHECK: 'buffer' <== Memory access at offset [[OFFSET]] underflows this variable
}

View File

@ -0,0 +1,17 @@
// RUN: %clangxx_asan -O0 %s -Fe%t
// FIXME: 'cat' is needed due to PR19744.
// RUN: not %run %t 2>&1 | cat | FileCheck %s
#include <stdio.h>
int main() {
int subscript = 42;
char buffer[42];
buffer[subscript] = 42;
// CHECK: AddressSanitizer: stack-buffer-overflow on address [[ADDR:0x[0-9a-f]+]]
// CHECK: WRITE of size 1 at [[ADDR]] thread T0
// CHECK-NEXT: {{#0 .* main .*stack_array_right_oob.cc}}:[[@LINE-3]]
// CHECK: Address [[ADDR]] is located in stack of thread T0 at offset [[OFFSET:.*]] in frame
// CHECK-NEXT: {{#0 .* main .*stack_array_right_oob.cc}}
// CHECK: 'buffer' <== Memory access at offset [[OFFSET]] overflows this variable
}

View File

@ -0,0 +1,12 @@
// RUN: %clangxx_asan -O0 %s -Fe%t
// RUN: %run %t | FileCheck %s
#include <stdio.h>
int main() {
int subscript = 1;
char buffer[42];
buffer[subscript] = 42;
printf("OK\n");
// CHECK: OK
}

View File

@ -0,0 +1,23 @@
// RUN: %clangxx_asan -O0 %s -Fe%t
// FIXME: 'cat' is needed due to PR19744.
// RUN: ASAN_OPTIONS=detect_stack_use_after_return=1 not %run %t 2>&1 | cat | FileCheck %s
char *x;
void foo() {
char stack_buffer[42];
x = &stack_buffer[13];
}
int main() {
foo();
*x = 42;
// CHECK: AddressSanitizer: stack-use-after-return
// CHECK: WRITE of size 1 at {{.*}} thread T0
// CHECK-NEXT: {{#0 0x.* in main .*stack_use_after_return.cc}}:[[@LINE-3]]
//
// CHECK: is located in stack of thread T0 at offset [[OFFSET:.*]] in frame
// CHECK-NEXT: {{#0 0x.* in foo .*stack_use_after_return.cc}}
//
// CHECK: 'stack_buffer' <== Memory access at offset [[OFFSET]] is inside this variable
}