[PATCH 1/4] wt-status: fix possible use of uninitialized variable
- From
Jeff King <peff@peff.net>
- Date
- Mar 21, 2013, 11:05 UTC
- Message-ID
- <20130321110527.GA18819@sigill.intra.peff.net>
- In-Reply-To
- <20130321110338.GA18552@sigill.intra.peff.net>
In wt_status_print_change_data, we accept a change_type flag that is meant to be either WT_STATUS_UPDATED or WT_STATUS_CHANGED. We then switch() on this value to set the local variable "status" for each case, but do not provide a fallback "default" label to the switch statement.
As a result, the compiler realizes that "status" might be unset, and complains with a warning. To silence this warning, we use the "int status = status" trick. This is correct with the current code, as all callers provide one of the two expected change_type flags. However, it's also a maintenance trap, as there is nothing to prevent future callers from passing another flag, nor to document this assumption.
Instead of using the "x = x" hack, let's handle the default case in the switch() statement with a die("BUG"). That tells the compiler and any readers of the code exactly what the function's input assumptions are.
We could also convert the flag to an enum, which would provide a compile-time check on the function input. However, since these flags are part of a larger enum, that would make the code unnecessarily complex (we would have to make a new enum with just the two flags, and then convert it to the old enum for passing to sub-functions).
Signed-off-by: Jeff King <peff@peff.net> --- wt-status.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/wt-status.c b/wt-status.c index ef405d0..7555817 100644 --- a/wt-status.c +++ b/wt-status.c @@ -264,7 +264,7 @@ static void wt_status_print_change_data(struct wt_status *s, { struct wt_status_change_data *d = it->util; const char *c = color(change_type, s); - int status = status; + int status; char *one_name; char *two_name; const char *one, *two; @@ -292,6 +292,9 @@ static void wt_status_print_change_data(struct wt_status *s, } status = d->worktree_status; break; + default: + die("BUG: unhandled change_type %d in wt_status_print_change_data", + change_type); } one = quote_path(one_name, -1, &onebuf, s->prefix);
-- 1.8.2.rc2.8.g2161951