Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 26 May 2013 12:45:18 +1000 (EST)
From:      Bruce Evans <brde@optusnet.com.au>
To:        mdf@FreeBSD.org
Cc:        "svn-src-head@freebsd.org" <svn-src-head@FreeBSD.org>, "svn-src-all@freebsd.org" <svn-src-all@FreeBSD.org>, "src-committers@freebsd.org" <src-committers@FreeBSD.org>, Hans Petter Selasky <hselasky@FreeBSD.org>
Subject:   Re: svn commit: r250986 - head/sys/dev/usb
Message-ID:  <20130526122502.P847@besplex.bde.org>
In-Reply-To: <CAMBSHm_EgRxbjvTQOu2EDMN%2BMtEJzzbTKSmRKPa9%2B0j3AkqCfQ@mail.gmail.com>
References:  <201305251709.r4PH9xfv015285@svn.freebsd.org> <CAMBSHm_EgRxbjvTQOu2EDMN%2BMtEJzzbTKSmRKPa9%2B0j3AkqCfQ@mail.gmail.com>

next in thread | previous in thread | raw e-mail | index | archive | help
On Sat, 25 May 2013 mdf@FreeBSD.org wrote:

> On Sat, May 25, 2013 at 10:09 AM, Hans Petter Selasky
> <hselasky@freebsd.org>wrote:
>> ...
>> Log:
>>   Fix some statical clang analyzer warnings.
>> ...
>> ==============================================================================
>> --- head/sys/dev/usb/usb_msctest.c      Sat May 25 16:58:12 2013
>>  (r250985)
>> +++ head/sys/dev/usb/usb_msctest.c      Sat May 25 17:09:58 2013
>>  (r250986)
>> @@ -802,7 +802,6 @@ usb_msc_eject(struct usb_device *udev, u
>>         if (sc == NULL)
>>                 return (USB_ERR_INVAL);
>>
>> -       err = 0;
>>         switch (method) {
>>         case MSC_EJECT_STOPUNIT:
>>                 err = bbb_command_start(sc, DIR_IN, 0, NULL, 0,
>> @@ -844,6 +843,7 @@ usb_msc_eject(struct usb_device *udev, u
>>                 break;
>>         default:
>>                 DPRINTF("Unknown eject method (%d)\n", method);
>> +               err = 0;
>>                 break;
>>         }
>>         DPRINTF("Eject CD command status: %s\n", usbd_errstr(err));
>>
>
> I don't know about the top one, but the bottom two are the safer way to
> code, and should not have been changed.  Unless we feel guaranteed the
> compiler can detect all uninitialized use and will break the build, an
> early initialization to a sane value is absolutely the right thing to do,
> even if it will be overwritten.  If the compiler feels sure the
> initialization isn't needed, it does not have to emit the code.  But any
> coding change after the (missing) initialization can create a bug now
> (well, it depends on how the code is structured, but from the three lines
> of context svn diff provides it's not clear a bug couldn't easily be
> introduced).

No, initializing a variable early to a sane value obfuscates the code
and makes it impossible for the compiler to detect that the variable
is not properly intialized.  Initializing early to an insane value
that will be overwritten in all cases is not so bad.  This makes it
clear to human readers that the initial value should not be used, and
gives runtime errors if it is used (best an immediate trap), but still
prevents the compiler detecting that the variable is not properly
initialized.

Hmm, it would be useful to have a compiler flag for initializing all
local variables to trap representations on entry to functions.  This
gives the runtime check in addition to the compiler check, without
writing huge code to initialize all the variables.  Then early
initialization would break to sane values would break this feature.

Of course, in practical code, you often reuse a variable without
uninitializing it (by setting it to an insane value) after each of its
uses becomes dead.  Then you lose the compiler check.  If the uses are
unrelated, then it is a style bug (optimization for 30 year old
compilers with no lifetime analysis) to use the same variable for them
all.  Otherwise, it is too painful to uninitialize variables or use
block scope for them to make their lifetimes more obvious to all readers.
One exception is when pointer variables are set to NULL after they are
freed even when the pointers are not expected to be reused.  This is done
mainly for non-local variables.

Bruce



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20130526122502.P847>