[systemd-devel] initializing _cleanup_* variables [was: [PATCH 01/12] fsckd daemon for inter-fsckd communication]
Zbigniew Jędrzejewski-Szmek
zbyszek at in.waw.pl
Wed Jan 28 08:51:21 PST 2015
On Wed, Jan 28, 2015 at 04:06:30PM +0000, Dimitri John Ledkov wrote:
> On 28 January 2015 at 15:47, Martin Pitt <martin.pitt at ubuntu.com> wrote:
> > Hey Zbyszek,
> >
> > Zbigniew Jędrzejewski-Szmek [2015-01-28 15:37 +0100]:
> >> > +static int handle_requests(int socket_fd) {
> >> > + Clients *first = NULL;
> >> > + usec_t last_activity = 0;
> >> > + int numdevices = 0, clear = 0;
> >> > + double percent = 100;
> >> > + _cleanup_fclose_ FILE *console = NULL;
> >> NULL not necessary (and you don't have it in similar circumstances above ;))
> >
> > How is that not necessary? Just because the very next line initializes
> > it, and there is no exit path before?
Yes.
> > Because in the general case it
> > certainly is necessary, otherwise the _cleanup_ handler will try to
> > free/close/clean up a random pointer value and crash.
Of course, but I think that in this case it is pretty obvious when
that the next line overwrites the NULL.
> > So IMHO it's a good defensive habit to always init _cleanup_* vars
> > with NULL. In the future someone might put some code with "return"
> > before the fopen() below, and then get a crash.
They can screw up in this and a thousand other ways. If there's a bunch
of other code in between, I agree that adding a defensive initialization
is good. In a simple case like this, I'm fine with skipping it.
Please note though, that my initial complaint was that there's an
inconsistency in the patch: one place had it, one didn't.
> > Or is there some gcc magic that I missed? (I thought only global
> > variables were guaranteed to be NULL, not stack vars).
No.
>
> Well, during systemd build there are some -Wmaybe-uninitialized
> warnings.... in most cases it is code similar to the above case or
> like checking r || check uninitialised variable. Shall we fix all of
> them? In most cases it would be of limited gain, but at least it will
> be clear to see when -Wmaybe-uninitalized warnings catches a real
> thing.
gcc issues false positive warnings in two cases:
1. when the same conditional is used twice, and cannot change:
bool cond = ...;
int var;
if (cond)
var = ...;
...
if (cond)
use(var);
2. when there's a loop which must be executed at least one:
int var;
while(true) {
var = ...;
break;
}
use(var);
Adding workarounds is frowned upon, unless they are very simple. We
try not to have warnings in the -O0 compilation mode. There's just too
many false warnings at higher optimization levels to fix all.
> (or is my compiler old and has false positives?)
Hard to say, not knowing the version :)
gcc5 issues approx. 100000 new warnings.
Zbyszek
More information about the systemd-devel
mailing list