forked from OSchip/llvm-project
[ASan] Add a few tests for use-after-scope mode
llvm-svn: 183391
This commit is contained in:
parent
7a75e16c27
commit
b42b2f5c69
|
@ -0,0 +1,25 @@
|
|||
// RUN: %clangxx_asan -m64 -O0 -fsanitize=use-after-scope %s -o %t && \
|
||||
// RUN: %t 2>&1 | %symbolize | FileCheck %s
|
||||
#include <stdio.h>
|
||||
|
||||
struct IntHolder {
|
||||
explicit IntHolder(int *val = 0) : val_(val) { }
|
||||
~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]]
|
||||
}
|
||||
void set(int *val) { val_ = val; }
|
||||
int *get() { return val_; }
|
||||
|
||||
int *val_;
|
||||
};
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
// It is incorrect to use "x" int IntHolder destructor, because "x" is
|
||||
// "destroyed" earlier as it's declared later.
|
||||
IntHolder holder;
|
||||
int x = argc;
|
||||
holder.set(&x);
|
||||
return 0;
|
||||
}
|
|
@ -0,0 +1,16 @@
|
|||
// RUN: %clangxx_asan -m64 -O0 -fsanitize=use-after-scope %s -o %t && \
|
||||
// RUN: %t 2>&1 | %symbolize | FileCheck %s
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
int main() {
|
||||
int *p = 0;
|
||||
// Variable goes in and out of scope.
|
||||
for (int i = 0; i < 3; i++) {
|
||||
int x = 0;
|
||||
p = &x;
|
||||
}
|
||||
printf("PASSED\n");
|
||||
// CHECK: PASSED
|
||||
return 0;
|
||||
}
|
|
@ -0,0 +1,29 @@
|
|||
// RUN: %clangxx_asan -m64 -O0 -fsanitize=use-after-scope %s -o %t && \
|
||||
// RUN: %t 2>&1 | %symbolize | 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;
|
||||
};
|
||||
|
||||
const IntHolder *saved;
|
||||
|
||||
void save(const IntHolder &holder) {
|
||||
saved = &holder;
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
save(IntHolder(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;
|
||||
}
|
|
@ -0,0 +1,15 @@
|
|||
// RUN: %clangxx_asan -m64 -O0 -fsanitize=use-after-scope %s -o %t && \
|
||||
// RUN: %t 2>&1 | %symbolize | FileCheck %s
|
||||
|
||||
int main() {
|
||||
int *p = 0;
|
||||
{
|
||||
int x = 0;
|
||||
p = &x;
|
||||
}
|
||||
return *p; // BOOM
|
||||
// CHECK: ERROR: AddressSanitizer: stack-use-after-scope
|
||||
// CHECK: #0 0x{{.*}} in {{_?}}main {{.*}}use-after-scope.cc:[[@LINE-2]]
|
||||
// CHECK: Address 0x{{.*}} is located in stack of thread T{{.*}} at offset [[OFFSET:[^ ]+]] in frame
|
||||
// {{\[}}[[OFFSET]], {{[0-9]+}}) 'x'
|
||||
}
|
Loading…
Reference in New Issue