Re: [PATCH v2 07/12] Fix some -Werror=maybe-uninitialized

Akihiko Odaki <[email protected]> Mon, 27 Jul 2026 14:25:39 +0900
Newsgroups org.kernel.vger.linux-cxl,org.nongnu.qemu-devel
Message-ID <[email protected]>
On 2026/07/27 6:07, Marc-André Lureau wrote:
> Hi
> 
> On Mon, Jul 27, 2026 at 12:53 AM Michael S. Tsirkin <[email protected]> wrote:
>>
>> On Mon, Jul 27, 2026 at 12:44:06AM +0400, Marc-André Lureau wrote:
>>> When compiled with -Og, gcc produces many false-positives
>>> gcc (GCC) 16.1.1 20260515 (Red Hat 16.1.1-2).
>>
>> it hurts if you do it? so don't do it then?
> 
> We are not far from getting it working, we can accommodate a bit of
> code while making it a bit clearer for the reader too.
> 
>>
>>> We already use auto-var-init=zero, but better be explicit.
>>
>> explicit about false positives?
> 
> Explicit initialization

These are the same concerns I raised in my previous review:

https://lore.kernel.org/qemu-devel/[email protected]/

I do not think this patch make the code clearer. They add values that 
are never consumed, which obscures rather than clarifies the data flow. 
Leaving a variable uninitialized until its actual value is assigned 
makes that flow more explicit.

Still, I think this change makes sense. Failure with -Og shows that
whether GCC emits the warning depends on subtle optimization details.
Avoiding that dependency is worthwhile.

> 
>>
>>> Signed-off-by: Marc-André Lureau <[email protected]>
>>> ---
>>>   target/i386/cpu.c             | 3 ++-
>>>   target/i386/emulate/x86_mmu.c | 4 ++--
>>>   2 files changed, 4 insertions(+), 3 deletions(-)
>>>
>>> diff --git a/target/i386/cpu.c b/target/i386/cpu.c
>>> index 5805d33ab92d..28e4435df23f 100644
>>> --- a/target/i386/cpu.c
>>> +++ b/target/i386/cpu.c
>>> @@ -7734,7 +7734,7 @@ static void x86_cpuid_get_avx10_version(Object *obj, Visitor *v,
>>>   static bool x86_cpu_apply_avx10_features(X86CPU *cpu, uint8_t version,
>>>                                            Error **errp)
>>>   {
>>> -    const AVX10VersionDefinition *def;
>>> +    const AVX10VersionDefinition *def = NULL;
>>>       CPUX86State *env = &cpu->env;
>>>
>>>       if (!version) {
>>> @@ -7757,6 +7757,7 @@ static bool x86_cpu_apply_avx10_features(X86CPU *cpu, uint8_t version,
>>>               break;
>>>           }
>>>       }
>>> +    assert(def != NULL);
>>>
>>>       if (def->version < version) {
>>>           error_setg(errp, "avx10-version can be at most %d", def->version);
>>
>>
>> what does assert have to do with gcc warnings?
> 
> That's what is expected at this point, unfortunately the compiler
> doesn't care we help it here. I can drop it

I would keep it. It reduces the downside of introducing an otherwise 
unused initial value by documenting the invariant.

> 
>>> diff --git a/target/i386/emulate/x86_mmu.c b/target/i386/emulate/x86_mmu.c
>>> index 8d4371467fd7..65bcccd4751e 100644
>>> --- a/target/i386/emulate/x86_mmu.c
>>> +++ b/target/i386/emulate/x86_mmu.c
>>> @@ -185,8 +185,8 @@ static MMUTranslateResult walk_gpt(CPUState *cpu, target_ulong addr, MMUTranslat
>>>       int largeness = 0;
>>>       target_ulong cr3 = x86_read_cr(cpu, 3);
>>>       uint64_t page_mask = pae ? PAE_PTE_PAGE_MASK : LEGACY_PTE_PAGE_MASK;
>>> -    MMUTranslateResult res;
>>> -
>>> +    MMUTranslateResult res = MMU_TRANSLATE_PAGE_NOT_MAPPED;
>>> +
>>
>>
>> This is not 0 as the commit log implies.
> 
> Initializing with 0 implies defaulting to MMU_TRANSLATE_SUCCESS - not
> the best choice here.

Since the value is ultimately overwritten anyway, the specific 
placeholder chosen doesn't strictly matter for execution, but 
MMU_TRANSLATE_SUCCESS feels like a more natural default behavior.

walk_gpt() checks each page-table level until one rejects the mapping or
all levels have been traversed. If top_level == 0 (i.e., there is zero 
levels to traverse), nothing would have rejected the mapping, so success 
is more natural than MMU_TRANSLATE_PAGE_NOT_MAPPED.

Regards,
Akihiko Odaki