libsdl-org / SDL_net

A simple, cross-platform wrapper over TCP/IP sockets.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

strict aliasing warnings from voipchat.c

sezero opened this issue · comments

@icculus: I get strict-aliasing warnings from voipchat.c from gcc <= 4.9:

voipchat.c: In function 'SendClientAudioToServer':
voipchat.c:94:9: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]
         ((Uint64 *) scratch_area)[0] = SDL_SwapLE64(0);  /* just being nice and leaving space in the buffer for the server to replace. */
         ^
voipchat.c: In function 'mainloop':
voipchat.c:228:17: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]
                 ((Uint64 *) scratch_area)[0] = SDL_SwapLE64(0);
                 ^

The following fixes it for me, and the asm output from gcc-7.5 before and after are identical.
(Asm outputs from gcc 4.4 are also identical if I use -fno-strict-aliasing.) OK to apply?

diff --git a/examples/voipchat.c b/examples/voipchat.c
index 145e2ea..8952fc1 100644
--- a/examples/voipchat.c
+++ b/examples/voipchat.c
@@ -36,9 +36,9 @@ static SDL_Renderer *renderer = NULL;
 static SDL_AudioDeviceID audio_device = 0;
 static SDL_AudioDeviceID capture_device = 0;
 static SDL_AudioStream *capture_stream = NULL;
 static const SDL_AudioSpec audio_spec = { SDL_AUDIO_S16LE, 1, 8000 };
-static Uint8 scratch_area[4096];
+static Uint64 scratch_area[512];
 
 static Voice *FindVoiceByAddr(const SDLNet_Address *addr, const Uint16 port)
 {
     Voice *i;
@@ -88,12 +88,12 @@ static void ClearOldVoices(const Uint64 now)
 
 static const int extra = (int) (sizeof (Uint64) * 2);
 static void SendClientAudioToServer(void)
 {
-    const int br = SDL_GetAudioStreamData(capture_stream, scratch_area + extra, max_datagram - extra);
+    const int br = SDL_GetAudioStreamData(capture_stream, scratch_area + (extra / sizeof(Uint64)), max_datagram - extra);
     if (br > 0) {
-        ((Uint64 *) scratch_area)[0] = SDL_SwapLE64(0);  /* just being nice and leaving space in the buffer for the server to replace. */
-        ((Uint64 *) scratch_area)[1] = SDL_SwapLE64(++next_idnum);
+        scratch_area[0] = SDL_SwapLE64(0);  /* just being nice and leaving space in the buffer for the server to replace. */
+        scratch_area[1] = SDL_SwapLE64(++next_idnum);
         SDL_Log("CLIENT: Sending %d new bytes to server at %s:%d...", br + extra, SDLNet_GetAddressString(server_addr), (int) server_port);
         SDLNet_SendDatagram(sock, server_addr, server_port, scratch_area, br + extra);
     }
 }
@@ -224,10 +224,10 @@ static void mainloop(void)
                 }
             }
 
             if (!last_send_ticks || ((now - last_send_ticks) > 5000)) {  /* send a keepalive packet if we haven't transmitted for a bit. */
-                ((Uint64 *) scratch_area)[0] = SDL_SwapLE64(0);
-                ((Uint64 *) scratch_area)[1] = SDL_SwapLE64(++next_idnum);
+                scratch_area[0] = SDL_SwapLE64(0);
+                scratch_area[1] = SDL_SwapLE64(++next_idnum);
                 SDL_Log("CLIENT: Sending %d keepalive bytes to server at %s:%d...", extra, SDLNet_GetAddressString(server_addr), (int) server_port);
                 SDLNet_SendDatagram(sock, server_addr, server_port, scratch_area, extra);
                 last_send_ticks = now;
             }