https://gcc.gnu.org/bugzilla/show_bug.cgi?id=117063
Bug ID: 117063
Summary: Incorrect stringop-overread warning using
std::vector::insert at -O3
Product: gcc
Version: 14.1.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: wsf at fultondesigns dot co.uk
Target Milestone: ---
Standalone code is below and triggers warning
gcc-14.1.0/include/c++/14.1.0/bits/stl_algobase.h:452:30: warning: 'void*
__builtin_memcpy(void*, const void*, long unsigned int)' reading between 9 and
9223372036854775800 bytes from a region of size 8 [-Wstringop-overread]
Compile using: g++ -std=c++14 -O2
No warning with gcc 13.3.0, warning appears with gcc 14.1.0 and 14.2.0.
Also warns, but requires -O3 instead of -O2, with godbolt.org build: g++
(Compiler-Explorer-Build-gcc-e9a213810aa9b87c7c868c93d5a93f3c63e03a3c-binutils-2.42)
15.0.0 20241010 (experimental)
Workarounds:
1) Compile with -O1 instead of -O2
2) Alternative code using #if 1 instead of #if 0 below
#include <iostream>
#include <vector>
using std::vector;
#include <algorithm>
template<class C, class V> inline
typename C::const_iterator container_upper_bound(const C& container, const V&
value)
{
return upper_bound(container.begin(), container.end(), value);
}
template<class T>
T Next(T val)
{
++val;
return val;
}
template<class T>
T Previous(T val)
{
--val;
return val;
}
long m_firstDate = 500;
long m_lastDate = 2400;
vector<long> event_dates { 300, 2000 };
int main() {
vector<long> relevantDates;
if (event_dates.size() > 0)
{
if (m_firstDate < event_dates.front())
relevantDates.push_back(0L);
vector<long>::const_iterator start = ((m_firstDate <
event_dates.front()) ? event_dates.begin()
: Previous(container_upper_bound(event_dates, m_firstDate)));
auto upper_iterator = container_upper_bound(event_dates, m_lastDate);
vector<long>::const_iterator stop = (upper_iterator !=
event_dates.end()) ? Next(upper_iterator) : event_dates.end();
#if 1
// Results in stringop-overread warning
relevantDates.insert(relevantDates.end(), start, stop);
#else
// Workaround to remove warning
std::copy(start, stop, std::back_inserter(relevantDates));
#endif
}
std::cout << "dates..." << std::endl;
for (auto v : relevantDates)
std::cout << v << std::endl;
return 0;
}