Enable stack-use-after-scope tests.

Fix and enable working stack-use-after-scope tests.
Add more failing tests for the feature, for fix later.

PR27453.

Patch by Vitaly Buka.

llvm-svn: 267084
This commit is contained in:
Evgeniy Stepanov 2016-04-22 00:10:23 +00:00
parent c998a8c044
commit 4c0f6afbab
10 changed files with 93 additions and 32 deletions

View File

@ -1,14 +1,17 @@
// RUN: %clangxx_asan -O0 -fsanitize=use-after-scope %s -o %t && %run %t
// XFAIL: *
// RUN: %clangxx_asan -std=c++11 -O1 -mllvm -asan-use-after-scope=1 %s -o %t && \
// RUN: not %run %t 2>&1 | FileCheck %s
#include <functional>
int main() {
std::function<int()> f;
{
int x = 0;
f = [&x]() {
return x;
}
return x; // BOOM
// CHECK: ERROR: AddressSanitizer: stack-use-after-scope
// CHECK: #0 0x{{.*}} in {{.*}}::operator()(){{.*}}.cc:[[@LINE-2]]
};
}
return f(); // BOOM
// CHECK: ERROR: AddressSanitizer: stack-use-after-scope
}

View File

@ -1,6 +1,6 @@
// RUN: %clangxx_asan -O0 -fsanitize=use-after-scope %s -o %t && \
// RUN: %clangxx_asan -O1 -mllvm -asan-use-after-scope=1 %s -o %t && \
// RUN: not %run %t 2>&1 | FileCheck %s
// XFAIL: *
#include <stdio.h>
struct IntHolder {
@ -8,7 +8,7 @@ struct IntHolder {
~IntHolder() {
printf("Value: %d\n", *val_); // BOOM
// CHECK: ERROR: AddressSanitizer: stack-use-after-scope
// CHECK: #0 0x{{.*}} in IntHolder::~IntHolder{{.*}}use-after-scope-dtor-order.cc:[[@LINE-2]]
// CHECK: #0 0x{{.*}} in IntHolder::~IntHolder{{.*}}.cc:[[@LINE-2]]
}
void set(int *val) { val_ = val; }
int *get() { return val_; }

View File

@ -0,0 +1,15 @@
// RUN: %clangxx_asan -O1 -mllvm -asan-use-after-scope=1 %s -o %t && \
// RUN: not %run %t 2>&1 | FileCheck %s
int *p;
bool b = true;
int main() {
if (b) {
int x[5];
p = x+1;
}
return *p; // BOOM
// CHECK: ERROR: AddressSanitizer: stack-use-after-scope
// CHECK: #0 0x{{.*}} in main {{.*}}.cc:[[@LINE-2]]
}

View File

@ -2,8 +2,8 @@
// happens. "always_inline" is not enough, as Clang doesn't emit
// llvm.lifetime intrinsics at -O0.
//
// RUN: %clangxx_asan -O2 -fsanitize=use-after-scope %s -o %t && not %run %t 2>&1 | FileCheck %s
// XFAIL: *
// RUN: %clangxx_asan -O2 -mllvm -asan-use-after-scope=1 %s -o %t && \
// RUN: not %run %t 2>&1 | FileCheck %s
int *arr;

View File

@ -0,0 +1,16 @@
// RUN: %clangxx_asan -O1 -mllvm -asan-use-after-scope=1 %s -o %t && \
// RUN: not %run %t 2>&1 | FileCheck %s
//
// FIXME: @llvm.lifetime.* are not emitted for x.
// XFAIL: *
int *p;
int main() {
// Variable goes in and out of scope.
for (int i = 0; i < 3; ++i) {
int x[3] = {i, i, i};
p = x + i;
}
return *p; // BOOM
}

View File

@ -0,0 +1,19 @@
// RUN: %clangxx_asan -O1 -mllvm -asan-use-after-scope=1 %s -o %t && \
// RUN: not %run %t 2>&1 | FileCheck %s
//
// FIXME: Compiler removes for-loop but keeps x variable. For unknown reason
// @llvm.lifetime.* are not emitted for x.
// XFAIL: *
#include <stdlib.h>
int *p;
int main() {
for (int i = 0; i < 3; i++) {
int x;
p = &x;
}
return **p; // BOOM
// CHECK: ERROR: AddressSanitizer: stack-use-after-scope
}

View File

@ -0,0 +1,14 @@
// RUN: %clangxx_asan -O1 -mllvm -asan-use-after-scope=1 %s -o %t && \
// RUN: not %run %t 2>&1 | FileCheck %s
int *p[3];
int main() {
for (int i = 0; i < 3; i++) {
int x;
p[i] = &x;
}
return **p; // BOOM
// CHECK: ERROR: AddressSanitizer: stack-use-after-scope
// CHECK: #0 0x{{.*}} in main {{.*}}.cc:[[@LINE-2]]
}

View File

@ -1,14 +1,15 @@
// RUN: %clangxx_asan -O0 -fsanitize=use-after-scope %s -o %t && %run %t
// XFAIL: *
// RUN: %clangxx_asan -O1 -mllvm -asan-use-after-scope=1 %s -o %t && %run %t
#include <stdio.h>
#include <stdlib.h>
int *p[3];
int main() {
int *p = 0;
// Variable goes in and out of scope.
for (int i = 0; i < 3; i++) {
int x = 0;
p = &x;
int x;
p[i] = &x;
}
printf("PASSED\n");
return 0;

View File

@ -1,15 +1,10 @@
// RUN: %clangxx_asan -O0 -fsanitize=use-after-scope %s -o %t && \
// RUN: %run %t 2>&1 | FileCheck %s
// RUN: %clangxx_asan -O1 -mllvm -asan-use-after-scope=1 %s -o %t && \
// RUN: not %run %t 2>&1 | FileCheck %s
//
// Lifetime for temporaries is not emitted yet.
// XFAIL: *
#include <stdio.h>
struct IntHolder {
explicit IntHolder(int val) : val(val) {
printf("IntHolder: %d\n", val);
}
int val;
};
@ -20,10 +15,9 @@ void save(const IntHolder &holder) {
}
int main(int argc, char *argv[]) {
save(IntHolder(10));
save({10});
int x = saved->val; // BOOM
// CHECK: ERROR: AddressSanitizer: stack-use-after-scope
// CHECK: #0 0x{{.*}} in main {{.*}}use-after-scope-temp.cc:[[@LINE-2]]
printf("saved value: %d\n", x);
return 0;
// CHECK: ERROR: AddressSanitizer: stack-use-after-scope
// CHECK: #0 0x{{.*}} in main {{.*}}use-after-scope-temp.cc:[[@LINE-2]]
return x;
}

View File

@ -1,10 +1,9 @@
// RUN: %clangxx_asan -O0 -fsanitize=use-after-scope %s -o %t && \
// RUN: not %run %t 2>&1 | FileCheck %s
// RUN: %env_asan_opts=detect_stack_use_after_return=1 not %run %t 2>&1 | FileCheck %s
// XFAIL: *
// RUN: %clangxx_asan -O1 -mllvm -asan-use-after-scope=1 %s -o %t && \
// RUN: not %run %t 2>&1 | FileCheck %s
int *p = 0;
int main() {
int *p = 0;
{
int x = 0;
p = &x;