Bug 43053 - gcc12: очевидно неверное предупреждение "dangling pointer may be used"
Summary: gcc12: очевидно неверное предупреждение "dangling pointer may be used"
Status: NEW
Alias: None
Product: Sisyphus
Classification: Development
Component: gcc12 (show other bugs)
Version: unstable
Hardware: all Linux
: P5 normal
Assignee: Gleb F-Malinovskiy
QA Contact: qa-sisyphus
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2022-06-23 16:25 MSK by Alexey Sheplyakov
Modified: 2022-06-23 16:25 MSK (History)
2 users (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Alexey Sheplyakov 2022-06-23 16:25:18 MSK
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" - заведомо ложное.