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());
}