https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108187
Bug ID: 108187
Summary: False positive -Wfree-nonheap-object on impossible
path with -O1
Product: gcc
Version: 12.2.1
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c
Assignee: unassigned at gcc dot gnu.org
Reporter: i.maximets at ovn dot org
Target Milestone: ---
Created attachment 54132
--> https://gcc.gnu.org/bugzilla/attachment.cgi?id=54132&action=edit
Reproducer
This might be the same issue as 98753, but I'm not sure.
We're getting the following error while trying to build Open vSwitch
with AF_XDP support with GCC:
```
In file included from lib/netdev-linux-private.h:30,
from lib/netdev-afxdp.c:19:
In function ‘dp_packet_delete’,
inlined from ‘dp_packet_delete’ at lib/dp-packet.h:246:1,
inlined from ‘dp_packet_batch_add__’ at lib/dp-packet.h:775:9,
inlined from ‘dp_packet_batch_add’ at lib/dp-packet.h:783:5,
inlined from ‘netdev_afxdp_rxq_recv’ at lib/netdev-afxdp.c:898:9:
lib/dp-packet.h:260:9: warning: ‘free’ called on pointer ‘*umem.xpool.array’
with nonzero offset [8, 2558044588346441168] [-Wfree-nonheap-object]
260 | free(b);
| ^~~~~~~
```
The simplified code flow is following:
```
packet = &umem->xpool.array[index];
packet = &xpacket->packet;
dp_packet_use_afxdp(packet, pkt, FRAME_SIZE - FRAME_HEADROOM,
OVS_XDP_HEADROOM);
--> dp_packet_init__(packet, allocated, DPBUF_AFXDP);
--> packet->source = source;
dp_packet_batch_add(batch, packet);
--> dp_packet_delete(packet);
--> if (b->source == DPBUF_AFXDP) {
free_afxdp_buf(b);
return;
}
dp_packet_uninit(b);
free(b);
```
The 'b->source' is always set unconditionally to DPBUF_AFXDP on that path,
so the free(b) cannot be reached, but compiler doesn't think so.
The issue is seen starting with -O1.
$ gcc --version
gcc (GCC) 12.2.1 20221121 (Red Hat 12.2.1-4)
Attached the file in question after -E. To reproduce run:
$ gcc -O1 -c netdev-afxdp.E.c