Skip to content

Commit b8527d5

Browse files
peffgitster
authored andcommitted
wt-status: fix possible use of uninitialized variable
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 <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent 3aa99df commit b8527d5

File tree

1 file changed

+4
-1
lines changed

1 file changed

+4
-1
lines changed

wt-status.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -264,7 +264,7 @@ static void wt_status_print_change_data(struct wt_status *s,
264264
{
265265
struct wt_status_change_data *d = it->util;
266266
const char *c = color(change_type, s);
267-
int status = status;
267+
int status;
268268
char *one_name;
269269
char *two_name;
270270
const char *one, *two;
@@ -292,6 +292,9 @@ static void wt_status_print_change_data(struct wt_status *s,
292292
}
293293
status = d->worktree_status;
294294
break;
295+
default:
296+
die("BUG: unhandled change_type %d in wt_status_print_change_data",
297+
change_type);
295298
}
296299

297300
one = quote_path(one_name, -1, &onebuf, s->prefix);

0 commit comments

Comments
 (0)