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

Reply via email to