diff mbox series

[v3,10/10] libvduse: Fix assignment in vring_set_avail_event

Message ID 88882e496f70a7f606eabfd8b6183cc2b148c222.1671628158.git.marcel@holtmann.org
State New
Headers show
Series Compiler warning fixes for libvhost-user,libvduse | expand

Commit Message

Marcel Holtmann Dec. 21, 2022, 1:10 p.m. UTC
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(-)

Comments

Paolo Bonzini Dec. 22, 2022, 8:09 a.m. UTC | #1
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
Marcel Holtmann Dec. 22, 2022, 8:38 p.m. UTC | #2
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 mbox series

Patch

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,