drivers/staging/rtl8192u/r8180_93cx6.c: In function 'eprom_w': drivers/staging/rtl8192u/r8180_93cx6.c:69:17: error: dangling pointer to 'cmdreg' may be used [-Werror=dangling-pointer=] 69 | write_nic_byte_E(dev, EPROM_CMD, cmdreg | EPROM_W_BIT); | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ drivers/staging/rtl8192u/r8180_93cx6.c:62:12: note: 'cmdreg' declared here 62 | u8 cmdreg; | ^~~~~~ 60 static void eprom_w(struct net_device *dev, short bit) 61 { 62 u8 cmdreg; 63 int err; 64 65 err = read_nic_byte_E(dev, EPROM_CMD, &cmdreg); 66 if (err) 67 return; 68 if (bit) 69 write_nic_byte_E(dev, EPROM_CMD, cmdreg | EPROM_W_BIT); 70 else 71 write_nic_byte_E(dev, EPROM_CMD, cmdreg & ~EPROM_W_BIT); 72 73 force_pci_posting(dev); 74 udelay(EPROM_DELAY); 75 } где read_nic_byte_E вот такая: int read_nic_byte_E(struct net_device *dev, int indx, u8 *data) { int status; struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev); struct usb_device *udev = priv->udev; u8 *usbdata = kzalloc(sizeof(u8), GFP_KERNEL); if (!usbdata) return -ENOMEM; status = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), RTL8187_REQ_GET_REGS, RTL8187_REQT_READ, indx | 0xfe00, 0, usbdata, 1, 500); *data = *usbdata; kfree(usbdata); if (status < 0) { netdev_err(dev, "%s failure status: %d\n", __func__, status); return status; } return 0; } read_nic_byte_E cmdreg не читает, а только пишет туда (содержимое регистра устройства). В случае ошибки в cmdreg действительно остаётся изначальное значение (мусор, который был в стеке). Но при ошибке 69-я строка никогда не выполняется. Таким образом значение cmdreg в строке 69 всегда проинициализировано, а предупреждение "dangling pointer to 'cmdreg' may be used" - заведомо ложное.