https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108366
Richard Biener <rguenth at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Keywords| |missed-optimization
Last reconfirmed| |2023-01-11
Status|UNCONFIRMED |NEW
Ever confirmed|0 |1
--- Comment #4 from Richard Biener <rguenth at gcc dot gnu.org> ---
Warns from
#1 0x00000000013bc420 in warn_for_access<gimple*> (loc=2147485003,
func=<function_decl 0x7ffff633ad00 memset>, exp=<gimple_call
0x7ffff60938e8>,
opt=761, range=0x7fffffffd560, size=<integer_cst 0x7ffff63f42e8>,
write=true, read=false, maybe=false)
at /home/rguenther/src/gcc-12-branch/gcc/gimple-ssa-warn-access.cc:995
(gdb) l
990 }
991
992 if (write)
993 {
994 if (tree_int_cst_equal (range[0], range[1]))
995 warned = (func
996 ? warning_n (loc, opt, tree_to_uhwi (range[0]),
997 (maybe
998 ? G_("%qD may write %E byte into a
region "
999 "of size %E")
(gdb) p debug_gimple_stmt (exp)
# .MEM_2 = VDEF <.MEM_23>
memset (&MEM <char[32]> [(void *)&actual], 65, 128);
on a path where actual.m_outline == nullptr
for some unknown reason we reload actual.m_outline in the loop, likely
because storing to it is thought to clobber actual.m_outline
(which is initialized from a new expression). Note 'actual' escapes
the function via the printf call and 'new' can inspect/clobber globals.
We're also "bad" in computing points-to info because of the
memset(buffer.data(), 'A', new_size);
which with
char* data() {
if (m_outline)
return m_outline;
return reinterpret_cast<char*>(m_inline);
}
simply clobbers the whole object (with our points-to analysis).
Helping the compiler and doing
auto *b = buffer.m_outline;
for (unsigned i = 0; i < 128; ++i)
b[i] = 0;
allows it to optimize and avoid the diagnostic. Using buffer.m_outline
in the memset instead of buffer.data () would probably work as well.