Skip to content

Commit f121e0b

Browse files
authored
Merge pull request #2050 from e4t/strict-aliasing
Fix Compiler Strict Aliasing Rule Violations
2 parents 3bf18fb + 329eaaa commit f121e0b

File tree

5 files changed

+33
-27
lines changed

5 files changed

+33
-27
lines changed

libdap4/d4dump.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,12 +48,12 @@ NCD4_dumpbytes(size_t size, const void* data0, int swap)
4848
if(swap) {
4949
swapinline16(v.u16);
5050
swapinline32(v.u32);
51-
swapinline32(v.u64);
51+
swapinline64(v.u64);
5252
swapinline16(v.i16);
5353
swapinline32(v.i32);
54-
swapinline32(v.i64);
54+
swapinline64(v.i64);
5555
swapinline32(v.f32);
56-
swapinline32(v.f64);
56+
swapinline64(v.f64);
5757
}
5858
if(v.s[0] == '\r') strcpy(v.s,"\\r");
5959
else if(v.s[0] == '\n') strcpy(v.s,"\\n");

libdap4/d4util.h

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -25,39 +25,39 @@ typedef struct D4blob {d4size_t size; void* memory;} D4blob;
2525
/* signature: void swapinline16(void* ip) */
2626
#define swapinline16(ip) \
2727
{ \
28-
union {char b[2]; unsigned short i;} u; \
28+
char b[2]; \
2929
char* src = (char*)(ip); \
30-
u.b[0] = src[1]; \
31-
u.b[1] = src[0]; \
32-
*((unsigned short*)ip) = u.i; \
30+
b[0] = src[1]; \
31+
b[1] = src[0]; \
32+
memcpy(ip, b, 2); \
3333
}
3434

3535
/* signature: void swapinline32(void* ip) */
3636
#define swapinline32(ip) \
3737
{ \
38-
union {char b[4]; unsigned int i;} u; \
38+
char b[4]; \
3939
char* src = (char*)(ip); \
40-
u.b[0] = src[3]; \
41-
u.b[1] = src[2]; \
42-
u.b[2] = src[1]; \
43-
u.b[3] = src[0]; \
44-
*((unsigned int*)ip) = u.i; \
40+
b[0] = src[3]; \
41+
b[1] = src[2]; \
42+
b[2] = src[1]; \
43+
b[3] = src[0]; \
44+
memcpy(ip, b, 4); \
4545
}
4646

4747
/* signature: void swapinline64(void* ip) */
4848
#define swapinline64(ip) \
4949
{ \
50-
union {char b[8]; unsigned long long i;} u; \
50+
char b[8]; \
5151
char* src = (char*)(ip); \
52-
u.b[0] = src[7]; \
53-
u.b[1] = src[6]; \
54-
u.b[2] = src[5]; \
55-
u.b[3] = src[4]; \
56-
u.b[4] = src[3]; \
57-
u.b[5] = src[2]; \
58-
u.b[6] = src[1]; \
59-
u.b[7] = src[0]; \
60-
*((unsigned long long*)ip) = u.i; \
52+
b[0] = src[7]; \
53+
b[1] = src[6]; \
54+
b[2] = src[5]; \
55+
b[3] = src[4]; \
56+
b[4] = src[3]; \
57+
b[5] = src[2]; \
58+
b[6] = src[1]; \
59+
b[7] = src[0]; \
60+
memcpy(ip, b, 8); \
6161
}
6262

6363
/***************************************************/

libdispatch/daux.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -704,7 +704,8 @@ filterspec_cvt(const char* txt, size_t* nparamsp, unsigned int* params)
704704
sstat = sscanf(p,"%lf",&vald);
705705
if(sstat != 1) {stat = NC_EINVAL; goto done;}
706706
valf = (float)vald;
707-
params[nparams++] = *(unsigned int*)&valf;
707+
/* avoid type punning */
708+
memcpy(&params[nparams++], &valf, sizeof(unsigned int));
708709
break;
709710
/* The following are 8-byte values, so we must swap pieces if this
710711
is a little endian machine */

libsrc/ncx.m4

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -348,7 +348,9 @@ inline static void
348348
swap4b(void *dst, const void *src)
349349
{
350350
/* copy over, make the below swap in-place */
351-
uint32_t tmp = *(uint32_t*)src;
351+
uint32_t tmp;
352+
/* use memcpy to avoid type punning */
353+
memcpy(&tmp, src, sizeof(tmp));
352354
tmp = SWAP4(tmp);
353355
memcpy(dst, &tmp, 4);
354356

@@ -464,7 +466,9 @@ swap8b(void *dst, const void *src)
464466
op = (uint32_t*)((char*)dst+4);
465467
*op = SWAP4(*op);
466468
#else
467-
uint64_t tmp = *(uint64_t*)src;
469+
uint64_t tmp;
470+
/* use memcpy to avoid type punning */
471+
memcpy(&tmp, src, sizeof(tmp));
468472
tmp = SWAP8(tmp);
469473
memcpy(dst, &tmp, 8);
470474

oc2/xxdr.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -502,7 +502,8 @@ xxdrntohdouble(char* c8, double* dp)
502502
ii[0] = ii[1];
503503
ii[1] = tmp;
504504
}
505-
if(dp) *dp = *(double*)ii;
505+
/* use memcpy avoid type punning */
506+
if(dp) memcpy(dp, ii, sizeof(double));
506507
}
507508

508509
void

0 commit comments

Comments
 (0)