* FW: [error27/smatch] smatch misidentifies uninitialized variable after switch with no default: (Issue #3)
[not found] <error27/smatch/issues/3@github.com>
@ 2022-01-07 16:19 ` Brandeburg, Jesse
2022-01-10 12:42 ` Dan Carpenter
0 siblings, 1 reply; 2+ messages in thread
From: Brandeburg, Jesse @ 2022-01-07 16:19 UTC (permalink / raw)
To: smatch; +Cc: Dan Carpenter
Forwarding to try to get some attention, if you'd rather I resend to the list, please let me know.
From: Jesse Brandeburg <notifications@github.com>
Sent: Tuesday, December 21, 2021 11:49 AM
To: error27/smatch <smatch@noreply.github.com>
Cc: Brandeburg, Jesse <jesse.brandeburg@intel.com>; Your activity <your_activity@noreply.github.com>
Subject: [error27/smatch] smatch misidentifies uninitialized variable after switch with no default: (Issue #3)
I've got a simple reproducer for the issue that I found when scanning our ice driver in the kernel with smatch.
original repro against smatch HEAD https://github.com/error27/smatch/commit/0951ed5915c0f9a764a284f185de8cfdb59a4aa5 ("db: fix uninitialized variable false positives")
smatch reported:
~/git/smatch/smatch_scripts/kchecker drivers/net/ethernet/intel/ice/ice_ptp_hw.c
drivers/net/ethernet/intel/ice/ice_ptp_hw.c:2852 ice_ptp_port_cmd_e810() error: uninitialized symbol 'cmd_val'.
Below is a simple c-code reproducer, compile with:
gcc -o srt -Wextra -Wall smatch_switch_repro.c
see error with
~/git/smatch/smatch smatch_switch_repro.c
smatch_switch_repro.c:43 badfunc() error: uninitialized symbol 'my_int'.
One bit of data that might be useful: it works fine with badfunc content inline in main() and fails when badfunc is a function with the enum argument. It also succeeds when there is a "default:" label and a simple assignment in that case (see the reproducer below and bit of commented out code)
// SPDX-License-Identifier: BSD-3-Clause
/*
* Copyright 2021, Intel Corporation
*
* A quick demo of a smatch false positive
*/
#include <stdio.h>
enum three_values
{
value_one,
value_two,
value_three
};
void badfunc(const enum three_values cmd)
{
unsigned int my_int, new_int; //uninitialized
switch (cmd) {
case value_one:
printf("one\n");
my_int = 1;
break;
case value_two:
printf("two\n");
my_int = 2;
break;
case value_three:
printf("three\n");
my_int = 3;
break;
/* no default because all enum values handled, which has value
* to developers because it forces compile error if not all enum values
* handled and enum is changed */
//default:
//my_int = 4;
//break;
}
new_int = 0;
new_int |= my_int;
printf("data: %d\n", new_int);
}
int main(int argc __attribute__((unused)), char **argv __attribute__((unused)))
{
enum three_values my_enum = value_two;
badfunc(my_enum);
return 0;
}
^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: FW: [error27/smatch] smatch misidentifies uninitialized variable after switch with no default: (Issue #3)
2022-01-07 16:19 ` FW: [error27/smatch] smatch misidentifies uninitialized variable after switch with no default: (Issue #3) Brandeburg, Jesse
@ 2022-01-10 12:42 ` Dan Carpenter
0 siblings, 0 replies; 2+ messages in thread
From: Dan Carpenter @ 2022-01-10 12:42 UTC (permalink / raw)
To: Brandeburg, Jesse; +Cc: smatch
Thanks for the bug report. The ideal way to fix this would be to handle
it in Smatch core so that if called get_implied_rl(cmd, &rl) then it
would return 0-2.
Unfortunately, that's quite a bit of work to implement it properly...
For now, I'm just going to add a special case in check_uninitialized.c
to silence these warnings. If you have a switch(some_enum) and there is
no default statement, then mark all the partially initialized variables
as fully initialized.
regards,
dan carpenter
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2022-01-10 12:42 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
[not found] <error27/smatch/issues/3@github.com>
2022-01-07 16:19 ` FW: [error27/smatch] smatch misidentifies uninitialized variable after switch with no default: (Issue #3) Brandeburg, Jesse
2022-01-10 12:42 ` Dan Carpenter
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.