[Bug libstdc++/86516] New: Spurious warning __builtin_memset at O3 when protected by a conditional involving empty()
paulg at chiark dot greenend.org.uk
gcc-bugzilla@gcc.gnu.org
Fri Jul 13 13:20:00 GMT 2018
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=86516
Bug ID: 86516
Summary: Spurious warning __builtin_memset at O3 when
protected by a conditional involving empty()
Product: gcc
Version: unknown
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: libstdc++
Assignee: unassigned at gcc dot gnu.org
Reporter: paulg at chiark dot greenend.org.uk
Target Milestone: ---
This is spurious diagnostic regression in GCC 7 and beyond and is related to
two previous bugs.
The first one was was 82698 which was resolved as a duplicate of 88641. However
the workaround applied for 88641 is not complete and does not solve the
problem.
The issue is that at O3 if you do
std::vector<int> v;
if(c.size() > 0)
c.resize(c.size() - 1);
then you no longer get a spurious builtin memset warning in 7.3 however if
instead you do
if(! c.empty())
c.resize(c.size() -1);
it produces an erroneous warning. The fundamental problem is a dataflow
analysis issue which is somewhat difficult to fix.
In 88641 decorations were added to libstdc++ to avoid the warning however they
seem to have only been added to size() not empty() so the 2nd form of code
above still produces a spurious warning.
More information about the Gcc-bugs
mailing list