Generalize compute_objsize to return maximum size/offset instead of failing (PR middl...
authorMartin Sebor <msebor@redhat.com>
Fri, 9 Oct 2020 20:48:43 +0000 (14:48 -0600)
committerMartin Sebor <msebor@redhat.com>
Mon, 12 Oct 2020 15:05:55 +0000 (09:05 -0600)
commit83685efd5fd1623cfc4e4c435ce2773d95d458d1
tree5a6514717cd82b39bcec8872ba61871599c5684a
parentde05c19d5fd661ae16dd75a895b49d32d12f5edc
Generalize compute_objsize to return maximum size/offset instead of failing (PR middle-end/97023).

Also resolves:
PR middle-end/97342 - bogus -Wstringop-overflow with nonzero signed and unsigned offsets
PR middle-end/97023 - missing warning on buffer overflow in chained mempcpy
PR middle-end/96384 - bogus -Wstringop-overflow= storing into multidimensional array with index in range

gcc/ChangeLog:

PR middle-end/97342
PR middle-end/97023
PR middle-end/96384
* builtins.c (access_ref::access_ref): Initialize new member.  Use
new enum.
(access_ref::size_remaining): Define new member function.
(inform_access): Handle expressions referencing objects.
(gimple_call_alloc_size): Call get_size_range instead of get_range.
(gimple_call_return_array): New function.
(get_range): Rename...
(get_offset_range): ...to this.  Improve detection of ranges from
types of expressions.
(gimple_call_return_array): Adjust calls to get_range per above.
(compute_objsize): Same.  Set maximum size or offset instead of
failing for unknown objects and handle more kinds of expressions.
(compute_objsize): Call access_ref::size_remaining.
(compute_objsize): Have transitional wrapper fail for pointers
into unknown objects.
(expand_builtin_strncmp): Call access_ref::size_remaining and
handle new cases.
* builtins.h (access_ref::size_remaining): Declare new member function.
(access_ref::set_max_size_range): Define new member function.
(access_ref::add_ofset, access_ref::add_max_ofset): Same.
(access_ref::add_base0): New data member.
* calls.c (get_size_range): Change argument type.  Handle new
condition.
* calls.h (get_size_range): Adjust signature.
(enum size_range_flags): Define new type.
* gimple-ssa-warn-restrict.c (builtin_memref::builtin_memref): Correct
argument to get_size_range.
* tree-ssa-strlen.c (get_range): Handle anti-ranges.
(maybe_warn_overflow): Check DECL_P before assuming it's one.

gcc/testsuite/ChangeLog:

PR middle-end/97342
PR middle-end/97023
PR middle-end/96384
* c-c++-common/Wrestrict.c: Adjust comment.
* gcc.dg/Wstringop-overflow-34.c: Remove xfail.
* gcc.dg/Wstringop-overflow-43.c: Remove xfails.  Adjust regex patterns.
* gcc.dg/pr51683.c: Prune out expected warning.
* gcc.target/i386/pr60693.c: Same.
* g++.dg/warn/Wplacement-new-size-8.C: New test.
* gcc.dg/Wstringop-overflow-41.c: New test.
* gcc.dg/Wstringop-overflow-44.s: New test.
* gcc.dg/Wstringop-overflow-45.c: New test.
* gcc.dg/Wstringop-overflow-46.c: New test.
* gcc.dg/Wstringop-overflow-47.c: New test.
* gcc.dg/Wstringop-overflow-49.c: New test.
* gcc.dg/Wstringop-overflow-50.c: New test.
* gcc.dg/Wstringop-overflow-51.c: New test.
* gcc.dg/Wstringop-overflow-52.c: New test.
* gcc.dg/Wstringop-overflow-53.c: New test.
* gcc.dg/Wstringop-overflow-54.c: New test.
* gcc.dg/Wstringop-overflow-55.c: New test.
* gcc.dg/Wstringop-overread-5.c: New test.
25 files changed:
gcc/builtins.c
gcc/builtins.h
gcc/calls.c
gcc/calls.h
gcc/gimple-ssa-warn-restrict.c
gcc/testsuite/c-c++-common/Wrestrict.c
gcc/testsuite/g++.dg/warn/Wplacement-new-size-8.C [new file with mode: 0644]
gcc/testsuite/gcc.dg/Wstringop-overflow-34.c
gcc/testsuite/gcc.dg/Wstringop-overflow-41.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/Wstringop-overflow-43.c
gcc/testsuite/gcc.dg/Wstringop-overflow-44.s [new file with mode: 0644]
gcc/testsuite/gcc.dg/Wstringop-overflow-45.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/Wstringop-overflow-46.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/Wstringop-overflow-47.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/Wstringop-overflow-49.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/Wstringop-overflow-50.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/Wstringop-overflow-51.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/Wstringop-overflow-52.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/Wstringop-overflow-53.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/Wstringop-overflow-54.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/Wstringop-overflow-55.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/Wstringop-overread-5.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/pr51683.c
gcc/testsuite/gcc.target/i386/pr60693.c
gcc/tree-ssa-strlen.c