https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115125
Bug ID: 115125 Summary: [-Wstringop-overflow=] with O2/O3 - false positive? Product: gcc Version: 14.1.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: oknenavin at outlook dot com Target Milestone: --- $ g++ --version g++.exe (Rev2, Built by MSYS2 project) 14.1.0 test.cxx: template <typename II> inline char peek(II i, II e) { return i != e ? *i : '\xFF'; } template <typename II> inline char next(II& i, II e) { return peek(++i, e); } #define READ() *f = c, c = next(i, e), ++f; #define NEXT() { if (f == l) return -1; READ() } template <typename II> inline int consume(char* f, const char* l, II& i, II e) { char c = peek(i, e); if (c == '"') { ; READ() if (c == '-') NEXT() if (c == 'i') { NEXT() if (c != 'n') return 0; NEXT() if (c != 'f') return 0; } else if (c == 'n') { NEXT() if (c != 'a') return 0; NEXT() if (c != 'n') return 0; } else return 0; NEXT() if (c != '"') return 0; NEXT() } return f != l ? (*f = '\0', 1) : -1; } int main(int argc, char* argv[]) { char bf[3]; consume(bf, bf + 3, argv[0], argv[0] + 16); //char* in = argv[0]; //consume(bf, bf + 3, in, in + 16); } $ g++ -c -O2 test.cxx In function 'int consume(char*, const char*, II&, II) [with II = char*]', inlined from 'int main(int, char**)' at test.cxx:33:12: test.cxx:6:19: warning: writing 1 byte into a region of size 0 [-Wstringop-overflow=] 6 | #define READ() *f = c, c = next(i, e), ++f; | ~~~^~~ test.cxx:7:41: note: in expansion of macro 'READ' 7 | #define NEXT() { if (f == l) return -1; READ() } | ^~~~ test.cxx:25:17: note: in expansion of macro 'NEXT' 25 | NEXT() if (c != '"') return 0; | ^~~~ test.cxx: In function 'int main(int, char**)': test.cxx:32:10: note: at offset [1, 3] into destination object 'bf' of size 3 32 | char bf[3]; | ^~ test.cxx:32:10: note: at offset [2, 3] into destination object 'bf' of size 3 test.cxx:32:10: note: at offset [1, 3] into destination object 'bf' of size 3 test.cxx:32:10: note: at offset [2, 3] into destination object 'bf' of size 3