Message ID | 88882e496f70a7f606eabfd8b6183cc2b148c222.1671628158.git.marcel@holtmann.org |
---|---|
State | New |
Headers | show |
Series | Compiler warning fixes for libvhost-user,libvduse | expand |
On 12/21/22 14:10, Marcel Holtmann wrote: > static inline void vring_set_avail_event(VduseVirtq *vq, uint16_t val) > { > - *((uint16_t *)&vq->vring.used->ring[vq->vring.num]) = htole16(val); > + uint16_t *avail; > + > + avail = (uint16_t *)&vq->vring.used->ring[vq->vring.num]; > + *avail = htole16(val); That this doesn't warn is basically a compiler bug. Please use memcpy instead, i.e. uint16_t val_le = htole16(val); memcpy(&vq->vring.used->ring[vq->vring.num]), &val_le, sizeof(uint16_t)); Paolo
Hi Paolo, >> static inline void vring_set_avail_event(VduseVirtq *vq, uint16_t val) >> { >> - *((uint16_t *)&vq->vring.used->ring[vq->vring.num]) = htole16(val); >> + uint16_t *avail; >> + >> + avail = (uint16_t *)&vq->vring.used->ring[vq->vring.num]; >> + *avail = htole16(val); > > That this doesn't warn is basically a compiler bug. > > Please use memcpy instead, i.e. > > uint16_t val_le = htole16(val); > memcpy(&vq->vring.used->ring[vq->vring.num]), &val_le, sizeof(uint16_t)); excellent. Thanks for this. I included a version that fixes this for libvhost-user as well. Regards Marcel
diff --git a/subprojects/libvduse/libvduse.c b/subprojects/libvduse/libvduse.c index 338ad5e352e7..25359e1fc0e2 100644 --- a/subprojects/libvduse/libvduse.c +++ b/subprojects/libvduse/libvduse.c @@ -582,7 +582,10 @@ void vduse_queue_notify(VduseVirtq *vq) static inline void vring_set_avail_event(VduseVirtq *vq, uint16_t val) { - *((uint16_t *)&vq->vring.used->ring[vq->vring.num]) = htole16(val); + uint16_t *avail; + + avail = (uint16_t *)&vq->vring.used->ring[vq->vring.num]; + *avail = htole16(val); } static bool vduse_queue_map_single_desc(VduseVirtq *vq, unsigned int *p_num_sg,
Since the assignment is causing a compiler warning, do exactly what is done in libvhost-user.c to avoid the warning. CC libvduse.o libvduse.c: In function ‘vring_set_avail_event’: libvduse.c:603:7: error: dereferencing type-punned pointer will break strict-aliasing rules [-Werror=strict-aliasin] 603 | *((uint16_t *)&vq->vring.used->ring[vq->vring.num]) = htole16(val); | ~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Signed-off-by: Marcel Holtmann <marcel@holtmann.org> Suggested-by: Xie Yongji <xieyongji@bytedance.com> --- subprojects/libvduse/libvduse.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)