aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarat Zakirov <m.zakirov@samsung.com>2014-11-18 08:46:39 +0000
committerMarat Zakirov <m.zakirov@samsung.com>2014-11-18 08:46:39 +0000
commitd4de9ae771db6086ba2ca45dd4f66a81c70ae46b (patch)
treefa0e89f662222008a55de589be3b96b6f1bc3ecf
parent986b5ba9e4ef6163fdcebd2bae51d7fce0feb8b0 (diff)
gcc
2014-11-18 Marat Zakirov <m.zakirov@samsung.com> * opts.c (finish_options): Disable aggressive opts for sanitizer. (common_handle_option): Move code to finish_options. gcc/testsuite 2014-11-18 Marat Zakirov <m.zakirov@samsung.com> * c-c++-common/asan/aggressive-opts.c: New test. git-svn-id: https://gcc.gnu.org/svn/gcc/trunk@217690 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/opts.c19
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/c-c++-common/asan/aggressive-opts.c28
4 files changed, 50 insertions, 6 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index c0649cf5d03..4877dc97747 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2014-11-18 Marat Zakirov <m.zakirov@samsung.com>
+
+ * opts.c (finish_options): Disable aggressive opts for sanitizer.
+ (common_handle_option): Move code to finish_options.
+
2014-11-18 Yury Gribov <y.gribov@samsung.com>
PR sanitizer/63802
diff --git a/gcc/opts.c b/gcc/opts.c
index d22882bf3a2..a83345b91e2 100644
--- a/gcc/opts.c
+++ b/gcc/opts.c
@@ -904,6 +904,19 @@ finish_options (struct gcc_options *opts, struct gcc_options *opts_set,
if (opts->x_flag_sanitize_recover & SANITIZE_LEAK)
error_at (loc, "-fsanitize-recover=leak is not supported");
+
+ /* When instrumenting the pointers, we don't want to remove
+ the null pointer checks. */
+ if (opts->x_flag_sanitize & (SANITIZE_NULL | SANITIZE_NONNULL_ATTRIBUTE
+ | SANITIZE_RETURNS_NONNULL_ATTRIBUTE))
+ opts->x_flag_delete_null_pointer_checks = 0;
+
+ /* Aggressive compiler optimizations may cause false negatives. */
+ if (opts->x_flag_sanitize)
+ {
+ opts->x_flag_aggressive_loop_optimizations = 0;
+ opts->x_flag_strict_overflow = 0;
+ }
}
#define LEFT_COLUMN 27
@@ -1622,12 +1635,6 @@ common_handle_option (struct gcc_options *opts,
if (code != OPT_fsanitize_)
break;
- /* When instrumenting the pointers, we don't want to remove
- the null pointer checks. */
- if (opts->x_flag_sanitize & (SANITIZE_NULL | SANITIZE_NONNULL_ATTRIBUTE
- | SANITIZE_RETURNS_NONNULL_ATTRIBUTE))
- opts->x_flag_delete_null_pointer_checks = 0;
-
/* Kernel ASan implies normal ASan but does not yet support
all features. */
if (opts->x_flag_sanitize & SANITIZE_KERNEL_ADDRESS)
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 8a924cc5f0e..fbae34cb8c0 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2014-11-18 Marat Zakirov <m.zakirov@samsung.com>
+
+ * c-c++-common/asan/aggressive-opts.c: New test.
+
2014-11-18 Yury Gribov <y.gribov@samsung.com>
PR sanitizer/63802
diff --git a/gcc/testsuite/c-c++-common/asan/aggressive-opts.c b/gcc/testsuite/c-c++-common/asan/aggressive-opts.c
new file mode 100644
index 00000000000..979b6118d1d
--- /dev/null
+++ b/gcc/testsuite/c-c++-common/asan/aggressive-opts.c
@@ -0,0 +1,28 @@
+/* { dg-options "-fdump-tree-asan" } */
+/* { dg-do compile } */
+/* { dg-skip-if "" { *-*-* } { "*" } { "-O3" } } */
+
+int ext;
+
+int
+Perl_do_sv_dump()
+{
+ int freq[10];
+ int i;
+ int max = 0;
+
+ if (max < ext)
+ max = ext;
+
+ for (i = 0; i <= max; i++)
+ if (freq[i])
+ ext = 0;
+
+ if (i > 20)
+ return freq[i];
+ else
+ return 0;
+}
+
+/* { dg-final { scan-tree-dump-times "ASAN_CHECK" 2 "asan1" } } */
+/* { dg-final { cleanup-tree-dump "asan1" } } */