diff options
author | Yury Gribov <y.gribov@samsung.com> | 2014-08-18 08:23:47 +0000 |
---|---|---|
committer | Yury Gribov <ygribov@gcc.gnu.org> | 2014-08-18 08:23:47 +0000 |
commit | 87d1d65af7ebef1ca7240bbd25f3cd6873b1455a (patch) | |
tree | 160aeb5c4f22a3043b40b7f8eeebe93c37cac94f /gcc/asan.c | |
parent | 495e77b35b09f0ff8d347bceb06deaa2dc72602b (diff) | |
download | gcc-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.c | 22 |
1 files changed, 10 insertions, 12 deletions
@@ -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 |