summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormpolacek <mpolacek@138bc75d-0d04-0410-961f-82ee72b054a4>2015-05-07 08:08:57 +0000
committermpolacek <mpolacek@138bc75d-0d04-0410-961f-82ee72b054a4>2015-05-07 08:08:57 +0000
commit8cafe2834ebdcac360743afe5baea3ee00b1773e (patch)
treeef62eceb38bcfbb26bb1550dda4f456ae31db72e
parent3032a4eac370ee7a180a157cf45422bc1fefc1c9 (diff)
downloadgcc-8cafe2834ebdcac360743afe5baea3ee00b1773e.tar.gz
* c-ubsan.c (ubsan_instrument_bounds): Don't skip instrumenting
flexible member array-like members if SANITIZE_BOUNDS_STRICT. * doc/invoke.texi: Document -fsanitize=bounds-strict. * flag-types.h (enum sanitize_code): Add SANITIZE_BOUNDS_STRICT, or it into SANITIZE_NONDEFAULT. * opts.c (common_handle_option): Handle -fsanitize=bounds-strict. * c-c++-common/ubsan/bounds-10.c: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@222871 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/c-family/ChangeLog12
-rw-r--r--gcc/c-family/c-ubsan.c6
-rw-r--r--gcc/doc/invoke.texi7
-rw-r--r--gcc/flag-types.h2
-rw-r--r--gcc/opts.c2
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/c-c++-common/ubsan/bounds-10.c16
8 files changed, 53 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 19cd61cde92..beabbcb5fa0 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,11 @@
+2015-05-07 Marek Polacek <polacek@redhat.com>
+ Martin Uecker <uecker@eecs.berkeley.edu>
+
+ * doc/invoke.texi: Document -fsanitize=bounds-strict.
+ * flag-types.h (enum sanitize_code): Add SANITIZE_BOUNDS_STRICT, or it
+ into SANITIZE_NONDEFAULT.
+ * opts.c (common_handle_option): Handle -fsanitize=bounds-strict.
+
2015-05-07 Uros Bizjak <ubizjak@gmail.com>
PR target/66015
diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog
index 9d16d4319d4..dd69f258406 100644
--- a/gcc/c-family/ChangeLog
+++ b/gcc/c-family/ChangeLog
@@ -1,3 +1,9 @@
+2015-05-07 Marek Polacek <polacek@redhat.com>
+ Martin Uecker <uecker@eecs.berkeley.edu>
+
+ * c-ubsan.c (ubsan_instrument_bounds): Don't skip instrumenting
+ flexible member array-like members if SANITIZE_BOUNDS_STRICT.
+
2015-05-05 Jason Merrill <jason@redhat.com>
* c.opt (Wterminate): New.
@@ -9,8 +15,8 @@
2015-04-29 Josh Triplett <josh@joshtriplett.org>
- * c-common.c (handle_section_attribute): Refactor to reduce
- nesting and distinguish between error cases.
+ * c-common.c (handle_section_attribute): Refactor to reduce
+ nesting and distinguish between error cases.
2015-04-29 Marek Polacek <polacek@redhat.com>
@@ -30,7 +36,7 @@
* c-common.c (build_va_arg): Mark va_arg ap argument as addressable.
2015-04-28 Eric Botcazou <ebotcazou@adacore.com>
- Pierre-Marie de Rodat <derodat@adacore.com>
+ Pierre-Marie de Rodat <derodat@adacore.com>
* c-ada-spec.c (in_function): Delete.
(dump_generic_ada_node): Do not change in_function and remove the
diff --git a/gcc/c-family/c-ubsan.c b/gcc/c-family/c-ubsan.c
index a14426f9624..dbbdc5bf1c4 100644
--- a/gcc/c-family/c-ubsan.c
+++ b/gcc/c-family/c-ubsan.c
@@ -301,9 +301,11 @@ ubsan_instrument_bounds (location_t loc, tree array, tree *index,
bound = fold_build2 (PLUS_EXPR, TREE_TYPE (bound), bound,
build_int_cst (TREE_TYPE (bound), 1));
- /* Detect flexible array members and suchlike. */
+ /* Detect flexible array members and suchlike, unless
+ -fsanitize=bounds-strict. */
tree base = get_base_address (array);
- if (TREE_CODE (array) == COMPONENT_REF
+ if ((flag_sanitize & SANITIZE_BOUNDS_STRICT) == 0
+ && TREE_CODE (array) == COMPONENT_REF
&& base && (TREE_CODE (base) == INDIRECT_REF
|| TREE_CODE (base) == MEM_REF))
{
diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
index 9c8aa99dbd9..2c58a0d76ca 100644
--- a/gcc/doc/invoke.texi
+++ b/gcc/doc/invoke.texi
@@ -5736,6 +5736,13 @@ This option enables instrumentation of array bounds. Various out of bounds
accesses are detected. Flexible array members, flexible array member-like
arrays, and initializers of variables with static storage are not instrumented.
+@item -fsanitize=bounds-strict
+@opindex fsanitize=bounds-strict
+This option enables strict instrumentation of array bounds. Most out of bounds
+accesses are detected, including flexible array members and flexible array
+member-like arrays. Initializers of variables with static storage are not
+instrumented.
+
@item -fsanitize=alignment
@opindex fsanitize=alignment
diff --git a/gcc/flag-types.h b/gcc/flag-types.h
index bfdce442a62..2f820a5a764 100644
--- a/gcc/flag-types.h
+++ b/gcc/flag-types.h
@@ -238,6 +238,7 @@ enum sanitize_code {
SANITIZE_RETURNS_NONNULL_ATTRIBUTE = 1UL << 19,
SANITIZE_OBJECT_SIZE = 1UL << 20,
SANITIZE_VPTR = 1UL << 21,
+ SANITIZE_BOUNDS_STRICT = 1UL << 22,
SANITIZE_UNDEFINED = SANITIZE_SHIFT | SANITIZE_DIVIDE | SANITIZE_UNREACHABLE
| SANITIZE_VLA | SANITIZE_NULL | SANITIZE_RETURN
| SANITIZE_SI_OVERFLOW | SANITIZE_BOOL | SANITIZE_ENUM
@@ -246,6 +247,7 @@ enum sanitize_code {
| SANITIZE_RETURNS_NONNULL_ATTRIBUTE
| SANITIZE_OBJECT_SIZE | SANITIZE_VPTR,
SANITIZE_NONDEFAULT = SANITIZE_FLOAT_DIVIDE | SANITIZE_FLOAT_CAST
+ | SANITIZE_BOUNDS_STRICT
};
/* flag_vtable_verify initialization levels. */
diff --git a/gcc/opts.c b/gcc/opts.c
index fed5d12063b..cf923344a11 100644
--- a/gcc/opts.c
+++ b/gcc/opts.c
@@ -1584,6 +1584,8 @@ common_handle_option (struct gcc_options *opts,
{ "float-cast-overflow", SANITIZE_FLOAT_CAST,
sizeof "float-cast-overflow" - 1 },
{ "bounds", SANITIZE_BOUNDS, sizeof "bounds" - 1 },
+ { "bounds-strict", SANITIZE_BOUNDS | SANITIZE_BOUNDS_STRICT,
+ sizeof "bounds-strict" - 1 },
{ "alignment", SANITIZE_ALIGNMENT, sizeof "alignment" - 1 },
{ "nonnull-attribute", SANITIZE_NONNULL_ATTRIBUTE,
sizeof "nonnull-attribute" - 1 },
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 669efb56af3..d4d52638150 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2015-05-07 Marek Polacek <polacek@redhat.com>
+ Martin Uecker <uecker@eecs.berkeley.edu>
+
+ * c-c++-common/ubsan/bounds-10.c: New test.
+
2015-05-06 David Malcolm <dmalcolm@redhat.com>
* jit.dg/harness.h (set_options): Wrap with
diff --git a/gcc/testsuite/c-c++-common/ubsan/bounds-10.c b/gcc/testsuite/c-c++-common/ubsan/bounds-10.c
new file mode 100644
index 00000000000..a6187b543e8
--- /dev/null
+++ b/gcc/testsuite/c-c++-common/ubsan/bounds-10.c
@@ -0,0 +1,16 @@
+/* { dg-do run } */
+/* { dg-options "-fsanitize=bounds-strict" } */
+
+struct V { int l; int a[1]; };
+
+int
+main (void)
+{
+ /* For strict, do instrument last array in a struct. */
+ struct V *v = (struct V *) __builtin_malloc (sizeof (struct V) + 10);
+ v->a[1] = 1;
+
+ return 0;
+}
+
+/* { dg-output "index 1 out of bounds for type 'int \\\[1\\\]'" } */