diff options
author | Dan Liew <dan@su-root.co.uk> | 2018-03-08 21:50:22 +0000 |
---|---|---|
committer | Dan Liew <dan@su-root.co.uk> | 2018-03-08 21:50:22 +0000 |
commit | 7332f89acb92bba401a4fd40d6f2f928896beb03 (patch) | |
tree | 5e7d4f0246ce0639c1e258857b68e6769ecd8aa4 /test/asan | |
parent | 70aabe0941d94ac5e936fa2e5f6b745a653e6f45 (diff) |
[asan] Fix bug where suppression of overlapping accesses was ignored on
`strcpy()`, `strncpy()`, `strcat()`, and `strncat()`.
rdar://problem/35576899
Differential Revision: https://reviews.llvm.org/D43702
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@327068 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/asan')
-rw-r--r-- | test/asan/TestCases/strcat-overlap.cc | 46 | ||||
-rw-r--r-- | test/asan/TestCases/strcpy-overlap.cc | 46 | ||||
-rw-r--r-- | test/asan/TestCases/strncat-overlap.cc | 46 | ||||
-rw-r--r-- | test/asan/TestCases/strncpy-overlap.cc | 46 |
4 files changed, 184 insertions, 0 deletions
diff --git a/test/asan/TestCases/strcat-overlap.cc b/test/asan/TestCases/strcat-overlap.cc new file mode 100644 index 000000000..96b102aaf --- /dev/null +++ b/test/asan/TestCases/strcat-overlap.cc @@ -0,0 +1,46 @@ +// RUN: %clangxx_asan -O0 %s -o %t +// RUN: not %run %t 2>&1 | FileCheck %s +// RUN: echo "interceptor_via_fun:bad_function" > %t.supp +// RUN: %env_asan_opts=suppressions='"%t.supp"' %run %t +// RUN: echo "interceptor_name:strcat" > %t.supp +// RUN: %env_asan_opts=suppressions='"%t.supp"' %run %t +// +// RUN: %clangxx_asan -O1 %s -o %t +// RUN: not %run %t 2>&1 | FileCheck %s +// RUN: echo "interceptor_via_fun:bad_function" > %t.supp +// RUN: %env_asan_opts=suppressions='"%t.supp"' %run %t +// RUN: echo "interceptor_name:strcat" > %t.supp +// RUN: %env_asan_opts=suppressions='"%t.supp"' %run %t +// +// RUN: %clangxx_asan -O2 %s -o %t +// RUN: not %run %t 2>&1 | FileCheck %s +// RUN: echo "interceptor_via_fun:bad_function" > %t.supp +// RUN: %env_asan_opts=suppressions='"%t.supp"' %run %t +// RUN: echo "interceptor_name:strcat" > %t.supp +// RUN: %env_asan_opts=suppressions='"%t.supp"' %run %t +// +// RUN: %clangxx_asan -O3 %s -o %t +// RUN: not %run %t 2>&1 | FileCheck %s +// RUN: echo "interceptor_via_fun:bad_function" > %t.supp +// RUN: %env_asan_opts=suppressions='"%t.supp"' %run %t +// RUN: echo "interceptor_name:strcat" > %t.supp +// RUN: %env_asan_opts=suppressions='"%t.supp"' %run %t + +#include <string.h> + + +// Don't inline function otherwise stacktrace changes. +__attribute__((noinline)) void bad_function() { + char buffer[] = "hello\0XXX"; + // CHECK: strcat-param-overlap: memory ranges + // CHECK: [{{0x.*,[ ]*0x.*}}) and [{{0x.*,[ ]*0x.*}}) overlap + // CHECK: {{#0 0x.* in .*strcat}} + // CHECK: {{#1 0x.* in bad_function.*strcat-overlap.cc:}}[[@LINE+2]] + // CHECK: {{#2 0x.* in main .*strcat-overlap.cc:}}[[@LINE+5]] + strcat(buffer, buffer + 1); // BOOM +} + +int main(int argc, char **argv) { + bad_function(); + return 0; +} diff --git a/test/asan/TestCases/strcpy-overlap.cc b/test/asan/TestCases/strcpy-overlap.cc new file mode 100644 index 000000000..5c71e791c --- /dev/null +++ b/test/asan/TestCases/strcpy-overlap.cc @@ -0,0 +1,46 @@ +// RUN: %clangxx_asan -O0 %s -o %t +// RUN: not %run %t 2>&1 | FileCheck %s +// RUN: echo "interceptor_via_fun:bad_function" > %t.supp +// RUN: %env_asan_opts=suppressions='"%t.supp"' %run %t +// RUN: echo "interceptor_name:strcpy" > %t.supp +// RUN: %env_asan_opts=suppressions='"%t.supp"' %run %t +// +// RUN: %clangxx_asan -O1 %s -o %t +// RUN: not %run %t 2>&1 | FileCheck %s +// RUN: echo "interceptor_via_fun:bad_function" > %t.supp +// RUN: %env_asan_opts=suppressions='"%t.supp"' %run %t +// RUN: echo "interceptor_name:strcpy" > %t.supp +// RUN: %env_asan_opts=suppressions='"%t.supp"' %run %t +// +// RUN: %clangxx_asan -O2 %s -o %t +// RUN: not %run %t 2>&1 | FileCheck %s +// RUN: echo "interceptor_via_fun:bad_function" > %t.supp +// RUN: %env_asan_opts=suppressions='"%t.supp"' %run %t +// RUN: echo "interceptor_name:strcpy" > %t.supp +// RUN: %env_asan_opts=suppressions='"%t.supp"' %run %t +// +// RUN: %clangxx_asan -O3 %s -o %t +// RUN: not %run %t 2>&1 | FileCheck %s +// RUN: echo "interceptor_via_fun:bad_function" > %t.supp +// RUN: %env_asan_opts=suppressions='"%t.supp"' %run %t +// RUN: echo "interceptor_name:strcpy" > %t.supp +// RUN: %env_asan_opts=suppressions='"%t.supp"' %run %t + +#include <string.h> + + +// Don't inline function otherwise stacktrace changes. +__attribute__((noinline)) void bad_function() { + char buffer[] = "hello"; + // CHECK: strcpy-param-overlap: memory ranges + // CHECK: [{{0x.*,[ ]*0x.*}}) and [{{0x.*,[ ]*0x.*}}) overlap + // CHECK: {{#0 0x.* in .*strcpy}} + // CHECK: {{#1 0x.* in bad_function.*strcpy-overlap.cc:}}[[@LINE+2]] + // CHECK: {{#2 0x.* in main .*strcpy-overlap.cc:}}[[@LINE+5]] + strcpy(buffer, buffer + 1); // BOOM +} + +int main(int argc, char **argv) { + bad_function(); + return 0; +} diff --git a/test/asan/TestCases/strncat-overlap.cc b/test/asan/TestCases/strncat-overlap.cc new file mode 100644 index 000000000..89bc64c08 --- /dev/null +++ b/test/asan/TestCases/strncat-overlap.cc @@ -0,0 +1,46 @@ +// RUN: %clangxx_asan -O0 %s -o %t +// RUN: not %run %t 2>&1 | FileCheck %s +// RUN: echo "interceptor_via_fun:bad_function" > %t.supp +// RUN: %env_asan_opts=suppressions='"%t.supp"' %run %t +// RUN: echo "interceptor_name:strncat" > %t.supp +// RUN: %env_asan_opts=suppressions='"%t.supp"' %run %t +// +// RUN: %clangxx_asan -O1 %s -o %t +// RUN: not %run %t 2>&1 | FileCheck %s +// RUN: echo "interceptor_via_fun:bad_function" > %t.supp +// RUN: %env_asan_opts=suppressions='"%t.supp"' %run %t +// RUN: echo "interceptor_name:strncat" > %t.supp +// RUN: %env_asan_opts=suppressions='"%t.supp"' %run %t +// +// RUN: %clangxx_asan -O2 %s -o %t +// RUN: not %run %t 2>&1 | FileCheck %s +// RUN: echo "interceptor_via_fun:bad_function" > %t.supp +// RUN: %env_asan_opts=suppressions='"%t.supp"' %run %t +// RUN: echo "interceptor_name:strncat" > %t.supp +// RUN: %env_asan_opts=suppressions='"%t.supp"' %run %t +// +// RUN: %clangxx_asan -O3 %s -o %t +// RUN: not %run %t 2>&1 | FileCheck %s +// RUN: echo "interceptor_via_fun:bad_function" > %t.supp +// RUN: %env_asan_opts=suppressions='"%t.supp"' %run %t +// RUN: echo "interceptor_name:strncat" > %t.supp +// RUN: %env_asan_opts=suppressions='"%t.supp"' %run %t + +#include <string.h> + + +// Don't inline function otherwise stacktrace changes. +__attribute__((noinline)) void bad_function() { + char buffer[] = "hello\0XXX"; + // CHECK: strncat-param-overlap: memory ranges + // CHECK: [{{0x.*,[ ]*0x.*}}) and [{{0x.*,[ ]*0x.*}}) overlap + // CHECK: {{#0 0x.* in .*strncat}} + // CHECK: {{#1 0x.* in bad_function.*strncat-overlap.cc:}}[[@LINE+2]] + // CHECK: {{#2 0x.* in main .*strncat-overlap.cc:}}[[@LINE+5]] + strncat(buffer, buffer + 1, 3); // BOOM +} + +int main(int argc, char **argv) { + bad_function(); + return 0; +} diff --git a/test/asan/TestCases/strncpy-overlap.cc b/test/asan/TestCases/strncpy-overlap.cc new file mode 100644 index 000000000..51bf4658c --- /dev/null +++ b/test/asan/TestCases/strncpy-overlap.cc @@ -0,0 +1,46 @@ +// RUN: %clangxx_asan -O0 %s -o %t +// RUN: not %run %t 2>&1 | FileCheck %s +// RUN: echo "interceptor_via_fun:bad_function" > %t.supp +// RUN: %env_asan_opts=suppressions='"%t.supp"' %run %t +// RUN: echo "interceptor_name:strncpy" > %t.supp +// RUN: %env_asan_opts=suppressions='"%t.supp"' %run %t +// +// RUN: %clangxx_asan -O1 %s -o %t +// RUN: not %run %t 2>&1 | FileCheck %s +// RUN: echo "interceptor_via_fun:bad_function" > %t.supp +// RUN: %env_asan_opts=suppressions='"%t.supp"' %run %t +// RUN: echo "interceptor_name:strncpy" > %t.supp +// RUN: %env_asan_opts=suppressions='"%t.supp"' %run %t +// +// RUN: %clangxx_asan -O2 %s -o %t +// RUN: not %run %t 2>&1 | FileCheck %s +// RUN: echo "interceptor_via_fun:bad_function" > %t.supp +// RUN: %env_asan_opts=suppressions='"%t.supp"' %run %t +// RUN: echo "interceptor_name:strncpy" > %t.supp +// RUN: %env_asan_opts=suppressions='"%t.supp"' %run %t +// +// RUN: %clangxx_asan -O3 %s -o %t +// RUN: not %run %t 2>&1 | FileCheck %s +// RUN: echo "interceptor_via_fun:bad_function" > %t.supp +// RUN: %env_asan_opts=suppressions='"%t.supp"' %run %t +// RUN: echo "interceptor_name:strncpy" > %t.supp +// RUN: %env_asan_opts=suppressions='"%t.supp"' %run %t + +#include <string.h> + + +// Don't inline function otherwise stacktrace changes. +__attribute__((noinline)) void bad_function() { + char buffer[] = "hello"; + // CHECK: strncpy-param-overlap: memory ranges + // CHECK: [{{0x.*,[ ]*0x.*}}) and [{{0x.*,[ ]*0x.*}}) overlap + // CHECK: {{#0 0x.* in .*strncpy}} + // CHECK: {{#1 0x.* in bad_function.*strncpy-overlap.cc:}}[[@LINE+2]] + // CHECK: {{#2 0x.* in main .*strncpy-overlap.cc:}}[[@LINE+5]] + strncpy(buffer, buffer + 1, 5); // BOOM +} + +int main(int argc, char **argv) { + bad_function(); + return 0; +} |