On 9/6/19 3:08 PM, Eric Blake wrote: > On 9/6/19 3:28 AM, Philippe Mathieu-Daudé wrote: >> On 9/2/19 3:26 AM, Tony Nguyen wrote: >>> Existing read rejecting validator was mistakenly cleared. >>> >>> Reads dispatched to io_mem_notdirty then segfaults as there is no read >>> handler. >>> >>> Signed-off-by: Tony Nguyen <tony.ngu...@bt.com> >>> --- >>> exec.c | 2 +- >>> 1 file changed, 1 insertion(+), 1 deletion(-) >>> >>> diff --git a/exec.c b/exec.c >>> index 1df966d17a..05d664541f 100644 >>> --- a/exec.c >>> +++ b/exec.c >>> @@ -2796,12 +2796,12 @@ static bool notdirty_mem_accepts(void *opaque, >>> hwaddr addr, >>> >>> static const MemoryRegionOps notdirty_mem_ops = { >>> .write = notdirty_mem_write, >>> - .valid.accepts = notdirty_mem_accepts, >>> .endianness = DEVICE_NATIVE_ENDIAN, >>> .valid = { >>> .min_access_size = 1, >>> .max_access_size = 8, >>> .unaligned = false, >>> + .accepts = notdirty_mem_accepts, >> >> I'm surprised the compiler doesn't emit any warning... > > Same here. > > But reading > https://en.cppreference.com/w/c/language/struct_initialization, this is > compliant behavior: > > "However, when an initializer begins with a left open brace, its current > object is fully re-initialized and any prior explicit initializers for > any of its subobjects are ignored:" > > so it is worth filing a gcc bug asking for a QoI improvement in adding a > warning (since the code does not violate the C standard, but does cause > surprises in the reinitialization of omitted members in the later {} to > go back to 0 in spite of the earlier initialization by nested name).
Just remembered another case of (correct) reinitialization in hw/arm/palm.c:101: static struct { int row; int column; } palmte_keymap[0x80] = { [0 ... 0x7f] = { -1, -1 }, [0x3b] = { 0, 0 }, /* F1 -> Calendar */ [0x3c] = { 1, 0 }, /* F2 -> Contacts */ [0x3d] = { 2, 0 }, /* F3 -> Tasks List */ [0x3e] = { 3, 0 }, /* F4 -> Note Pad */ [0x01] = { 4, 0 }, /* Esc -> Power */ [0x4b] = { 0, 1 }, /* Left */ [0x50] = { 1, 1 }, /* Down */ [0x48] = { 2, 1 }, /* Up */ [0x4d] = { 3, 1 }, /* Right */ [0x4c] = { 4, 1 }, /* Centre */ [0x39] = { 4, 1 }, /* Spc -> Centre */ };