diff options
author | Martin Sebor <msebor@redhat.com> | 2019-09-19 22:15:34 +0000 |
---|---|---|
committer | Martin Sebor <msebor@gcc.gnu.org> | 2019-09-19 16:15:34 -0600 |
commit | 6889a3acfeed47265886676c6d43b04ef799fb82 (patch) | |
tree | 8101bfd6fc153a6707fc453e76507f09e0916c46 /gcc/builtins.c | |
parent | 7d112d6670a0e0e662f8a7e64c33686e475832c8 (diff) | |
download | gcc-6889a3acfeed47265886676c6d43b04ef799fb82.zip gcc-6889a3acfeed47265886676c6d43b04ef799fb82.tar.gz gcc-6889a3acfeed47265886676c6d43b04ef799fb82.tar.bz2 |
PR middle-end/91631 - buffer overflow into an array member of a declared object not detected
gcc/ChangeLog:
PR middle-end/91631
* builtins.c (component_size): Correct trailing array computation,
rename to component_ref_size and move...
(compute_objsize): Adjust.
* gimple-ssa-warn-restrict.c (builtin_memref::refsize): New member.
(builtin_access::strict): Do not consider mememmove.
(builtin_access::write_off): New function.
(builtin_memref::builtin_memref): Initialize refsize.
(builtin_memref::set_base_and_offset): Adjust refoff and compute
refsize.
(builtin_memref::offset_out_of_bounds): Use ooboff input values.
Handle refsize.
(builtin_access::builtin_access): Intialize dstoff to destination
refeence offset here instead of in maybe_diag_overlap. Adjust
referencess even to unrelated objects. Adjust sizrange of bounded
string functions to reflect bound. For strcat, adjust destination
sizrange by that of source.
(builtin_access::strcat_overlap): Adjust offsets and sizes
to reflect the increase in destination sizrange above.
(builtin_access::overlap): Do not set dstoff here but instead
in builtin_access::builtin_access.
(check_bounds_or_overlap): Use builtin_access::write_off.
(maybe_diag_access_bounds): Add argument. Add informational notes.
(dump_builtin_memref, dump_builtin_access): New functions.
* tree.c (component_ref_size): ...to here.
* tree.h (component_ref_size): Declare.
* tree-ssa-strlen (handle_builtin_strcat): Include the terminating
nul in the size of the source string.
gcc/testsuite/ChangeLog:
PR middle-end/91631
* /c-c++-common/Warray-bounds-3.c: Correct expected offsets.
* /c-c++-common/Warray-bounds-4.c: Same.
* gcc.dg/Warray-bounds-39.c: Remove xfails.
* gcc.dg/Warray-bounds-45.c: New test.
* gcc.dg/Warray-bounds-46.c: New test.
From-SVN: r275981
Diffstat (limited to 'gcc/builtins.c')
-rw-r--r-- | gcc/builtins.c | 50 |
1 files changed, 1 insertions, 49 deletions
diff --git a/gcc/builtins.c b/gcc/builtins.c index f8063c1..1fd4b88 100644 --- a/gcc/builtins.c +++ b/gcc/builtins.c @@ -3562,54 +3562,6 @@ check_access (tree exp, tree, tree, tree dstwrite, return true; } -/* Determines the size of the member referenced by the COMPONENT_REF - REF, using its initializer expression if necessary in order to - determine the size of an initialized flexible array member. - Returns the size (which might be zero for an object with - an uninitialized flexible array member) or null if the size - cannot be determined. */ - -static tree -component_size (tree ref) -{ - gcc_assert (TREE_CODE (ref) == COMPONENT_REF); - - tree member = TREE_OPERAND (ref, 1); - - /* If the member is not last or has a size greater than one, return - it. Otherwise it's either a flexible array member or a zero-length - array member, or an array of length one treated as such. */ - tree size = DECL_SIZE_UNIT (member); - if (size - && (!array_at_struct_end_p (ref) - || (!integer_zerop (size) - && !integer_onep (size)))) - return size; - - /* If the reference is to a declared object and the member a true - flexible array, try to determine its size from its initializer. */ - poly_int64 off = 0; - tree base = get_addr_base_and_unit_offset (ref, &off); - if (!base || !VAR_P (base)) - return NULL_TREE; - - /* The size of any member of a declared object other than a flexible - array member is that obtained above. */ - if (size) - return size; - - if (tree init = DECL_INITIAL (base)) - if (TREE_CODE (init) == CONSTRUCTOR) - { - off <<= LOG2_BITS_PER_UNIT; - init = fold_ctor_reference (NULL_TREE, init, off, 0, base); - if (init) - return TYPE_SIZE_UNIT (TREE_TYPE (init)); - } - - return DECL_EXTERNAL (base) ? NULL_TREE : integer_zero_node; -} - /* Helper to compute the size of the object referenced by the DEST expression which must have pointer type, using Object Size type OSTYPE (only the least significant 2 bits are used). Return @@ -3744,7 +3696,7 @@ compute_objsize (tree dest, int ostype, tree *pdecl /* = NULL */) if (TREE_CODE (dest) == COMPONENT_REF) { *pdecl = TREE_OPERAND (dest, 1); - return component_size (dest); + return component_ref_size (dest); } if (TREE_CODE (dest) != ADDR_EXPR) |