Re: ath10k: ret used but uninitialized

From: Arnd Bergmann
Date: Fri Jul 07 2017 - 10:14:25 EST


On Fri, Jul 7, 2017 at 12:04 PM, Kalle Valo <kvalo@xxxxxxxxxxxxxxxx> wrote:
> Erik Stromdahl <erik.stromdahl@xxxxxxxxx> writes:
>
>>> With gcc 4.1.2:
>>>
>>> drivers/net/wireless/ath/ath10k/sdio.c: In function
>>> âath10k_sdio_mbox_rxmsg_pending_handlerâ:
>>> drivers/net/wireless/ath/ath10k/sdio.c:676: warning: âretâ may be used
>>> uninitialized in this function
>>>
>>>> +
>>>> + *done = true;
>>>> +
>>>> + /* Copy the lookahead obtained from the HTC register table into our
>>>> + * temp array as a start value.
>>>> + */
>>>> + lookaheads[0] = msg_lookahead;
>>>> +
>>>> + timeout = jiffies + SDIO_MBOX_PROCESSING_TIMEOUT_HZ;
>>>
>>> Although very unlikely due to the long timeout, if the code is preempted here,
>>> and the loop below never entered, ret will indeed be uninitialized.
>>>
>>> It's unclear to me what the proper initialization would be, though, so
>>> that's why I didn't send a patch.
>>>
>> I think it would be best to use 0 as initial value of ret in this case.
>> This will make all other interrupts be processed in a normal way.
>>
>> Kalle: Should I create a new patch (initializing ret with zero)?
>
> Yes, please send a new patch fixing this.
>
> But I don't like that much with the style of initialising ret to zero,
> it tends to hide things. Instead my preference is something like below
> where the error handling is more explicit and easier to find where it's
> exactly failing. But that's just an example how I would try to solve it,
> it still lacks the handling of -ECANCEL etc.

I think I would simply replace the "while() {}" loop with "do{} while()",
as that would guarantee it to be run at least once in a way that the
compiler can see.

Arnd