aboutsummaryrefslogtreecommitdiff
path: root/gcc/asan.c
diff options
context:
space:
mode:
authorYury Gribov <y.gribov@samsung.com>2014-08-18 08:23:47 +0000
committerYury Gribov <ygribov@gcc.gnu.org>2014-08-18 08:23:47 +0000
commit87d1d65af7ebef1ca7240bbd25f3cd6873b1455a (patch)
tree160aeb5c4f22a3043b40b7f8eeebe93c37cac94f /gcc/asan.c
parent495e77b35b09f0ff8d347bceb06deaa2dc72602b (diff)
downloadgcc-87d1d65af7ebef1ca7240bbd25f3cd6873b1455a.zip
gcc-87d1d65af7ebef1ca7240bbd25f3cd6873b1455a.tar.gz
gcc-87d1d65af7ebef1ca7240bbd25f3cd6873b1455a.tar.bz2
re PR sanitizer/62089 (Sanitizer may fail to instrument struct accesses)
2014-08-18 Yury Gribov <y.gribov@samsung.com> PR sanitizer/62089 gcc/ * asan.c (instrument_derefs): Fix bitfield check. gcc/testsuite/ * c-c++-common/asan/pr62089.c: New test. * c-c++-common/asan/bitfield-1.c: New test. * c-c++-common/asan/bitfield-2.c: New test. * c-c++-common/asan/bitfield-3.c: New test. * c-c++-common/asan/bitfield-4.c: New test. From-SVN: r214086
Diffstat (limited to 'gcc/asan.c')
-rw-r--r--gcc/asan.c22
1 files changed, 10 insertions, 12 deletions
diff --git a/gcc/asan.c b/gcc/asan.c
index 4e6f438..15c0737 100644
--- a/gcc/asan.c
+++ b/gcc/asan.c
@@ -1690,21 +1690,19 @@ instrument_derefs (gimple_stmt_iterator *iter, tree t,
int volatilep = 0, unsignedp = 0;
tree inner = get_inner_reference (t, &bitsize, &bitpos, &offset,
&mode, &unsignedp, &volatilep, false);
- if (((size_in_bytes & (size_in_bytes - 1)) == 0
- && (bitpos % (size_in_bytes * BITS_PER_UNIT)))
- || bitsize != size_in_bytes * BITS_PER_UNIT)
+
+ if (TREE_CODE (t) == COMPONENT_REF
+ && DECL_BIT_FIELD_REPRESENTATIVE (TREE_OPERAND (t, 1)) != NULL_TREE)
{
- if (TREE_CODE (t) == COMPONENT_REF
- && DECL_BIT_FIELD_REPRESENTATIVE (TREE_OPERAND (t, 1)) != NULL_TREE)
- {
- tree repr = DECL_BIT_FIELD_REPRESENTATIVE (TREE_OPERAND (t, 1));
- instrument_derefs (iter, build3 (COMPONENT_REF, TREE_TYPE (repr),
- TREE_OPERAND (t, 0), repr,
- NULL_TREE), location, is_store);
- }
+ tree repr = DECL_BIT_FIELD_REPRESENTATIVE (TREE_OPERAND (t, 1));
+ instrument_derefs (iter, build3 (COMPONENT_REF, TREE_TYPE (repr),
+ TREE_OPERAND (t, 0), repr,
+ NULL_TREE), location, is_store);
return;
}
- if (bitpos % BITS_PER_UNIT)
+
+ if (bitpos % BITS_PER_UNIT
+ || bitsize != size_in_bytes * BITS_PER_UNIT)
return;
if (TREE_CODE (inner) == VAR_DECL