[Mesa-dev] [PATCH 64/75] st/nine: Fix compiler warning

Axel Davy axel.davy at ens.fr
Wed Oct 5 20:09:37 UTC 2016


From: Patrick Rudolph <siro at das-labor.org>

Use strict aliasing in SetPrivateData and struct pheader.
Casting char[1] to IUnknown** isn't allowed in strict aliasing.
Compute pointer to body by adding size of header to header pointer.

Signed-off-by: Patrick Rudolph <siro at das-labor.org>
Reviewed-by: Axel Davy <axel.davy at ens.fr>
---
 src/gallium/state_trackers/nine/iunknown.c   | 14 +++++++++-----
 src/gallium/state_trackers/nine/nine_pdata.h |  4 ++--
 2 files changed, 11 insertions(+), 7 deletions(-)

diff --git a/src/gallium/state_trackers/nine/iunknown.c b/src/gallium/state_trackers/nine/iunknown.c
index 541c528..c0d2b0d 100644
--- a/src/gallium/state_trackers/nine/iunknown.c
+++ b/src/gallium/state_trackers/nine/iunknown.c
@@ -159,6 +159,7 @@ NineUnknown_SetPrivateData( struct NineUnknown *This,
     struct pheader *header;
     const void *user_data = pData;
     char guid_str[64];
+    void *header_data;
 
     DBG("This=%p GUID=%s pData=%p SizeOfData=%u Flags=%x\n",
         This, GUID_sprintf(guid_str, refguid), pData, SizeOfData, Flags);
@@ -167,7 +168,7 @@ NineUnknown_SetPrivateData( struct NineUnknown *This,
         user_assert(SizeOfData == sizeof(IUnknown *), D3DERR_INVALIDCALL);
 
     /* data consists of a header and the actual data. avoiding 2 mallocs */
-    header = CALLOC_VARIANT_LENGTH_STRUCT(pheader, SizeOfData-1);
+    header = CALLOC_VARIANT_LENGTH_STRUCT(pheader, SizeOfData);
     if (!header) { return E_OUTOFMEMORY; }
     header->unknown = (Flags & D3DSPD_IUNKNOWN) ? TRUE : FALSE;
 
@@ -182,12 +183,13 @@ NineUnknown_SetPrivateData( struct NineUnknown *This,
     }
 
     header->size = SizeOfData;
-    memcpy(header->data, user_data, header->size);
+    header_data = (void *)header + sizeof(*header);
+    memcpy(header_data, user_data, header->size);
     memcpy(&header->guid, refguid, sizeof(header->guid));
 
     err = util_hash_table_set(This->pdata, &header->guid, header);
     if (err == PIPE_OK) {
-        if (header->unknown) { IUnknown_AddRef(*(IUnknown **)header->data); }
+        if (header->unknown) { IUnknown_AddRef(*(IUnknown **)header_data); }
         return D3D_OK;
     }
 
@@ -206,6 +208,7 @@ NineUnknown_GetPrivateData( struct NineUnknown *This,
     struct pheader *header;
     DWORD sizeofdata;
     char guid_str[64];
+    void *header_data;
 
     DBG("This=%p GUID=%s pData=%p pSizeOfData=%p\n",
         This, GUID_sprintf(guid_str, refguid), pData, pSizeOfData);
@@ -224,8 +227,9 @@ NineUnknown_GetPrivateData( struct NineUnknown *This,
         return D3DERR_MOREDATA;
     }
 
-    if (header->unknown) { IUnknown_AddRef(*(IUnknown **)header->data); }
-    memcpy(pData, header->data, header->size);
+    header_data = (void *)header + sizeof(*header);
+    if (header->unknown) { IUnknown_AddRef(*(IUnknown **)header_data); }
+    memcpy(pData, header_data, header->size);
 
     return D3D_OK;
 }
diff --git a/src/gallium/state_trackers/nine/nine_pdata.h b/src/gallium/state_trackers/nine/nine_pdata.h
index 0e9a2aa..92e50c8 100644
--- a/src/gallium/state_trackers/nine/nine_pdata.h
+++ b/src/gallium/state_trackers/nine/nine_pdata.h
@@ -7,7 +7,6 @@ struct pheader
     boolean unknown;
     GUID guid;
     DWORD size;
-    char data[1];
 };
 
 static int
@@ -36,8 +35,9 @@ ht_guid_delete( void *key,
                 void *data )
 {
     struct pheader *header = value;
+    void *header_data = (void *)header + sizeof(*header);
 
-    if (header->unknown) { IUnknown_Release(*(IUnknown **)header->data); }
+    if (header->unknown) { IUnknown_Release(*(IUnknown **)header_data); }
     FREE(header);
 
     return PIPE_OK;
-- 
2.10.0



More information about the mesa-dev mailing list