mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-27 14:14:24 +08:00
ppdev: Distribute switch variables for initialization
Variables declared in a switch statement before any case statements cannot be automatically initialized with compiler instrumentation (as they are not part of any execution flow). With GCC's proposed automatic stack variable initialization feature, this triggers a warning (and they don't get initialized). Clang's automatic stack variable initialization (via CONFIG_INIT_STACK_ALL=y) doesn't throw a warning, but it also doesn't initialize such variables[1]. Note that these warnings (or silent skipping) happen before the dead-store elimination optimization phase, so even when the automatic initializations are later elided in favor of direct initializations, the warnings remain. To avoid these problems, move such variables into the "case" where they're used or lift them up into the main function body. drivers/char/ppdev.c: In function ‘pp_do_ioctl’: drivers/char/ppdev.c:516:25: warning: statement will never be executed [-Wswitch-unreachable] 516 | struct ieee1284_info *info; | ^~~~ [1] https://bugs.llvm.org/show_bug.cgi?id=44916 Signed-off-by: Kees Cook <keescook@chromium.org> Link: https://lore.kernel.org/r/20200220062311.69121-1-keescook@chromium.org Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
06e33595e9
commit
78856f2551
@ -355,14 +355,19 @@ static int pp_do_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
|
||||
struct pp_struct *pp = file->private_data;
|
||||
struct parport *port;
|
||||
void __user *argp = (void __user *)arg;
|
||||
struct ieee1284_info *info;
|
||||
unsigned char reg;
|
||||
unsigned char mask;
|
||||
int mode;
|
||||
s32 time32[2];
|
||||
s64 time64[2];
|
||||
struct timespec64 ts;
|
||||
int ret;
|
||||
|
||||
/* First handle the cases that don't take arguments. */
|
||||
switch (cmd) {
|
||||
case PPCLAIM:
|
||||
{
|
||||
struct ieee1284_info *info;
|
||||
int ret;
|
||||
|
||||
if (pp->flags & PP_CLAIMED) {
|
||||
dev_dbg(&pp->pdev->dev, "you've already got it!\n");
|
||||
return -EINVAL;
|
||||
@ -513,15 +518,6 @@ static int pp_do_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
|
||||
|
||||
port = pp->pdev->port;
|
||||
switch (cmd) {
|
||||
struct ieee1284_info *info;
|
||||
unsigned char reg;
|
||||
unsigned char mask;
|
||||
int mode;
|
||||
s32 time32[2];
|
||||
s64 time64[2];
|
||||
struct timespec64 ts;
|
||||
int ret;
|
||||
|
||||
case PPRSTATUS:
|
||||
reg = parport_read_status(port);
|
||||
if (copy_to_user(argp, ®, sizeof(reg)))
|
||||
|
Loading…
Reference in New Issue
Block a user