]> gcc.gnu.org Git - gcc.git/commit
Allow (void *) 0xdeadbeef accesses without warnings [PR99578]
authorJakub Jelinek <jakub@redhat.com>
Fri, 18 Mar 2022 17:58:06 +0000 (18:58 +0100)
committerJakub Jelinek <jakub@redhat.com>
Fri, 18 Mar 2022 18:02:19 +0000 (19:02 +0100)
commit32ca611c42658948f1b8883994796f35e8b4e74d
tree20ce7c597f2ef4552d030bc33b37a2255d60fcef
parent0a0c2c3f06227d46b5e9542dfdd4e0fd2d67d894
Allow (void *) 0xdeadbeef accesses without warnings [PR99578]

Starting with GCC11 we keep emitting false positive -Warray-bounds or
-Wstringop-overflow etc. warnings on widely used *(type *)0x12345000
style accesses (or memory/string routines to such pointers).
This is a standard programming style supported by all C/C++ compilers
I've ever tried, used mostly in kernel or DSP programming, but sometimes
also together with mmap MAP_FIXED when certain things, often I/O registers
but could be anything else too are known to be present at fixed
addresses.

Such INTEGER_CST addresses can appear in code either because a user
used it like that (in which case it is fine) or because somebody used
pointer arithmetics (including &((struct whatever *)NULL)->field) on
a NULL pointer.  The middle-end warning code wrongly assumes that the
latter case is what is very likely, while the former is unlikely and
users should change their code.

The following patch adds a min-pagesize param defaulting to 4KB,
and treats INTEGER_CST addresses smaller than that as assumed results
of pointer arithmetics from NULL while addresses equal or larger than
that as expected user constant addresses.  For GCC 13 we can
represent results from pointer arithmetics on NULL using
&MEM[(void*)0 + offset] instead of (void*)offset INTEGER_CSTs.

2022-03-18  Jakub Jelinek  <jakub@redhat.com>

PR middle-end/99578
PR middle-end/100680
PR tree-optimization/100834
* params.opt (--param=min-pagesize=): New parameter.
* pointer-query.cc
(compute_objsize_r) <case ARRAY_REF>: Formatting fix.
(compute_objsize_r) <case INTEGER_CST>: Use maximum object size instead
of zero for pointer constants equal or larger than min-pagesize.

* gcc.dg/tree-ssa/pr99578-1.c: New test.
* gcc.dg/pr99578-1.c: New test.
* gcc.dg/pr99578-2.c: New test.
* gcc.dg/pr99578-3.c: New test.
* gcc.dg/pr100680.c: New test.
* gcc.dg/pr100834.c: New test.
gcc/params.opt
gcc/pointer-query.cc
gcc/testsuite/gcc.dg/pr100680.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/pr100834.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/pr99578-1.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/pr99578-2.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/pr99578-3.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/tree-ssa/pr99578-1.c [new file with mode: 0644]
This page took 0.071457 seconds and 6 git commands to generate.