criu/filesystems.c: refactor binfmt_misc_restore_bme
The following error is emitted by clang: > CC criu/filesystems.o > criu/filesystems.c:280:13: error: variable 'ret' is used uninitialized > whenever 'if' condition is false [-Werror,-Wsometimes-uninitialized] > } else if (bme->extension) { > ^~~~~~~~~~~~~~ > criu/filesystems.c:287:6: note: uninitialized use occurs here > if (ret > 0) { > ^~~ > criu/filesystems.c:280:9: note: remove the 'if' if its condition is > always true > } else if (bme->extension) { > ^~~~~~~~~~~~~~~~~~~~ > criu/filesystems.c:272:9: note: initialize the variable 'ret' to silence > this warning > int ret; > ^ > = 0 > 1 error generated. This code was a result of commit 398e7d3. If we look closely, this is a false alarm, as "else if (bme->extension)" is always true as it was checked before. But this is not very clear, and the issue with clangs still needs to be fixed. There are many ways to do so: 1. Initialize ret to 0. This is what initial version of this patch did. 2. Remove the always-true condition, like this: - } else if (bme->extension) { + } else { In my opinion this would hurt readability. 3. Change the code flow, improving readability at the same time. I believe that #3 is what this patch does. In addition, it fixes handling of a few corner cases: - an overflow in snprintf(); - a case when bme->name is NULL (as it is used for strlen/snprintf, there is a potential for SIGSEGV); - a case of ret == 0 (currently there is no code flow that results in ret being 0, so it's just for the future). [v2: use linux kernel style for 'else' after a block] [xemul: Fix // comments ] Cc: Kirill Tkhai <ktkhai@virtuozzo.com> Signed-off-by:Kir Kolyshkin <kir@openvz.org> Acked-by:
Kirill Tkhai <ktkhai@virtuozzo.com> Signed-off-by:
Pavel Emelyanov <xemul@virtuozzo.com>
Showing
Please
register
or
sign in
to comment