|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v1 2/3] xen: x86: irq: initialize irq desc in create_irq()
On 3/27/25 05:00, Nicola Vetrini wrote:
> On 2025-03-27 09:37, Nicola Vetrini wrote:
>> On 2025-03-27 09:03, Jan Beulich wrote:
>>> On 27.03.2025 01:40, Volodymyr Babchuk wrote:
>>>> While building xen with GCC 14.2.1 with "-fcondition-coverage" option,
>>>> the compiler produces a false positive warning:
>>>>
>>>> arch/x86/irq.c: In function ‘create_irq’:
>>>> arch/x86/irq.c:281:11: error: ‘desc’ may be used uninitialized
>>>> [-Werror=maybe-uninitialized]
>>>> 281 | ret = init_one_irq_desc(desc);
>>>> | ^~~~~~~~~~~~~~~~~~~~~~~
>>>> arch/x86/irq.c:269:22: note: ‘desc’ was declared here
>>>> 269 | struct irq_desc *desc;
>>>> | ^~~~
>>>> cc1: all warnings being treated as errors
>>>> make[2]: *** [Rules.mk:252: arch/x86/irq.o] Error 1
>>>>
>>>> While we have signed/unsigned comparison both in "for" loop and in
>>>> "if" statement, this still can't lead to use of uninitialized "desc",
>>>> as either loop will be executed at least once, or the function will
>>>> return early. So this is a clearly false positive warning. Anyways,
>>>> initialize "desc" with NULL to make GCC happy.
>>>>
>>>> Signed-off-by: Volodymyr Babchuk <volodymyr_babchuk@xxxxxxxx>
>>>
>>> Hmm, this puts us in an interesting conflict, I think. Misra, aiui, will ...
>>>
>>>> --- a/xen/arch/x86/irq.c
>>>> +++ b/xen/arch/x86/irq.c
>>>> @@ -265,7 +265,7 @@ void __init clear_irq_vector(int irq)
>>>> int create_irq(nodeid_t node, bool grant_access)
>>>> {
>>>> int irq, ret;
>>>> - struct irq_desc *desc;
>>>> + struct irq_desc *desc = NULL;
>>>
>>> ... consider such an assignment useless (and hence potentially confusing)
>>> code. I'm curious what BugsEng folks are going to say here.
>>>
>
> Just to mention it: having a "do { } while" loop instead of a for (just out
> of context) probably avoid tripping gcc's false positive and also help with
> MISRA Rule 9.1 without needing an explicit initializer.
>
>>
>> It is quite odd to see this only in coverage builds, but the side effects of
>> coverage options might trigger some of gcc's internal analyzer thresholds.
>> Anyway, since there are no concerns about dead code (see
>> https://gitlab.com/xen-project/xen/-/blob/staging/docs/misra/deviations.rst:
>> R2.2, "There shall be no dead code", is globally deviated) and that this
>> might actually be beneficial to remove some caution reports for R9.1 ("The
>> value of an object with automatic storage duration shall not be read before
>> it has been set") I think the overall effect is positive.
I tried running an "-Og default for debug builds" change through CI, and
I ran into *almost* the same error with -Og and certain version(s) of
GCC:
arch/x86/irq.c: In function 'create_irq':
arch/x86/irq.c:298:25: error: 'desc' may be used uninitialized
[-Werror=maybe-uninitialized]
298 | desc->arch.used = IRQ_UNUSED;
arch/x86/irq.c:268:22: note: 'desc' was declared here
268 | struct irq_desc *desc;
| ^~~~
The do { } while loop Nicola suggested indeed fixes it in the case of
-Og:
diff --git a/xen/arch/x86/irq.c b/xen/arch/x86/irq.c
index dd8d921f18f6..812f9eb91453 100644
--- a/xen/arch/x86/irq.c
+++ b/xen/arch/x86/irq.c
@@ -267,12 +267,18 @@ int create_irq(nodeid_t node, bool grant_access)
int irq, ret;
struct irq_desc *desc;
- for (irq = nr_irqs_gsi; irq < nr_irqs; irq++)
+ irq = nr_irqs_gsi;
+
+ if ( irq >= nr_irqs )
+ return -1;
+
+ do
{
desc = irq_to_desc(irq);
if (cmpxchg(&desc->arch.used, IRQ_UNUSED, IRQ_RESERVED) == IRQ_UNUSED)
break;
- }
+ irq++;
+ } while ( irq < nr_irqs );
if (irq >= nr_irqs)
return -ENOSPC;
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |