https://gcc.gnu.org/bugzilla/show_bug.cgi?id=116841

Richard Biener <rguenth at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Keywords|                            |needs-bisection
      Known to fail|                            |14.2.1
      Known to work|                            |15.0
            Summary|[14/15 Regression] spurious |[14 Regression] spurious
                   |-Warray-bounds=1 warning    |-Warray-bounds=1 warning
                   |when resizing + memcpy-ing  |when resizing + memcpy-ing
                   |into vector                 |into vector

--- Comment #1 from Richard Biener <rguenth at gcc dot gnu.org> ---
Trunk no longer warns (bisect?) for the small testcase.  The larger testcase
also warns with GCC 13 and -O3, but not -O2.

Full testcase for reference:

#include <array>
#include <cstdio>
#include <cstdint>
#include <cstring>
#include <vector>

struct StreamWriter {
    private:
        std::vector<uint8_t> _buf;
    public:
        void putBytes(void const* buf, size_t n) {
            size_t const pos = _buf.size();
            _buf.resize(pos+n);
            memcpy(_buf.data()+pos, buf, n);
        }
        void putByte(uint8_t v) { _buf.push_back(v); }
        void putVarint(uint32_t v) {
            if (v <= 0x7f) { putByte(v); }
            else { putByte((v >> 8) | 0x80); putByte(v & 0xff); }
        }
        std::vector<uint8_t> done() { return std::move(_buf); }
};

struct Packet {
    uint32_t packetNumber = 0;
    std::array<uint8_t, 160> destinationConnectionId = {};
    std::array<uint8_t, 160> sourceConnectionId = {};
};

std::vector<uint8_t> encode(Packet const& packet) {
    StreamWriter output;
    output.putVarint(packet.packetNumber);
    output.putBytes(packet.destinationConnectionId.data(),
packet.destinationConnectionId.size());
    output.putBytes(packet.sourceConnectionId.data(),
packet.sourceConnectionId.size());
    return output.done();
}

int main(int, char const**) {
    encode(Packet());
}

Reply via email to