All of lore.kernel.org
 help / color / mirror / Atom feed
* 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.