Replace pointer casting with safe memcpy helpers

This commit is contained in:
Andrea Mazzoleni 2026-08-18 22:52:46 +02:00
parent b4634578ba
commit cc91392803
2 changed files with 98 additions and 84 deletions

View file

@ -56,19 +56,33 @@ static __always_inline uint8_t A(int p, int d)
}
/*
* Dereference as uint8_t
* Safe memory read/write helpers avoiding strict-aliasing and unaligned access UB.
*/
#define v_8(p) (*(uint8_t *)&(p))
static __always_inline uint32_t v_read32(const void *ptr)
{
uint32_t v;
/*
* Dereference as uint32_t
*/
#define v_32(p) (*(uint32_t *)&(p))
memcpy(&v, ptr, sizeof(v));
return v;
}
/*
* Dereference as uint64_t
*/
#define v_64(p) (*(uint64_t *)&(p))
static __always_inline uint64_t v_read64(const void *ptr)
{
uint64_t v;
memcpy(&v, ptr, sizeof(v));
return v;
}
static __always_inline void v_write32(void *ptr, uint32_t v)
{
memcpy(ptr, &v, sizeof(v));
}
static __always_inline void v_write64(void *ptr, uint64_t v)
{
memcpy(ptr, &v, sizeof(v));
}
/*
* Galois field reduction polynomials.

View file

@ -21,14 +21,14 @@ void raid_gen1_int32(int nd, size_t size, void **vv)
p = v[nd];
for (i = 0; i < size; i += 8) {
p0 = v_32(v[l][i]);
p1 = v_32(v[l][i + 4]);
p0 = v_read32(&v[l][i]);
p1 = v_read32(&v[l][i + 4]);
for (d = l - 1; d >= 0; --d) {
p0 ^= v_32(v[d][i]);
p1 ^= v_32(v[d][i + 4]);
p0 ^= v_read32(&v[d][i]);
p1 ^= v_read32(&v[d][i + 4]);
}
v_32(p[i]) = p0;
v_32(p[i + 4]) = p1;
v_write32(&p[i], p0);
v_write32(&p[i + 4], p1);
}
}
@ -49,14 +49,14 @@ void raid_gen1_int64(int nd, size_t size, void **vv)
p = v[nd];
for (i = 0; i < size; i += 16) {
p0 = v_64(v[l][i]);
p1 = v_64(v[l][i + 8]);
p0 = v_read64(&v[l][i]);
p1 = v_read64(&v[l][i + 8]);
for (d = l - 1; d >= 0; --d) {
p0 ^= v_64(v[d][i]);
p1 ^= v_64(v[d][i + 8]);
p0 ^= v_read64(&v[d][i]);
p1 ^= v_read64(&v[d][i + 8]);
}
v_64(p[i]) = p0;
v_64(p[i + 8]) = p1;
v_write64(&p[i], p0);
v_write64(&p[i + 8], p1);
}
}
@ -80,11 +80,11 @@ void raid_gen2_int32(int nd, size_t size, void **vv)
q = v[nd + 1];
for (i = 0; i < size; i += 8) {
q0 = p0 = v_32(v[l][i]);
q1 = p1 = v_32(v[l][i + 4]);
q0 = p0 = v_read32(&v[l][i]);
q1 = p1 = v_read32(&v[l][i + 4]);
for (d = l - 1; d >= 0; --d) {
d0 = v_32(v[d][i]);
d1 = v_32(v[d][i + 4]);
d0 = v_read32(&v[d][i]);
d1 = v_read32(&v[d][i + 4]);
p0 ^= d0;
p1 ^= d1;
@ -95,10 +95,10 @@ void raid_gen2_int32(int nd, size_t size, void **vv)
q0 ^= d0;
q1 ^= d1;
}
v_32(p[i]) = p0;
v_32(p[i + 4]) = p1;
v_32(q[i]) = q0;
v_32(q[i + 4]) = q1;
v_write32(&p[i], p0);
v_write32(&p[i + 4], p1);
v_write32(&q[i], q0);
v_write32(&q[i + 4], q1);
}
}
@ -122,11 +122,11 @@ void raid_gen2_int64(int nd, size_t size, void **vv)
q = v[nd + 1];
for (i = 0; i < size; i += 16) {
q0 = p0 = v_64(v[l][i]);
q1 = p1 = v_64(v[l][i + 8]);
q0 = p0 = v_read64(&v[l][i]);
q1 = p1 = v_read64(&v[l][i + 8]);
for (d = l - 1; d >= 0; --d) {
d0 = v_64(v[d][i]);
d1 = v_64(v[d][i + 8]);
d0 = v_read64(&v[d][i]);
d1 = v_read64(&v[d][i + 8]);
p0 ^= d0;
p1 ^= d1;
@ -137,10 +137,10 @@ void raid_gen2_int64(int nd, size_t size, void **vv)
q0 ^= d0;
q1 ^= d1;
}
v_64(p[i]) = p0;
v_64(p[i + 8]) = p1;
v_64(q[i]) = q0;
v_64(q[i + 8]) = q1;
v_write64(&p[i], p0);
v_write64(&p[i + 8], p1);
v_write64(&q[i], q0);
v_write64(&q[i + 8], q1);
}
}
@ -167,11 +167,11 @@ void raid_genz_int32(int nd, size_t size, void **vv)
r = v[nd + 2];
for (i = 0; i < size; i += 8) {
r0 = q0 = p0 = v_32(v[l][i]);
r1 = q1 = p1 = v_32(v[l][i + 4]);
r0 = q0 = p0 = v_read32(&v[l][i]);
r1 = q1 = p1 = v_read32(&v[l][i + 4]);
for (d = l - 1; d >= 0; --d) {
d0 = v_32(v[d][i]);
d1 = v_32(v[d][i + 4]);
d0 = v_read32(&v[d][i]);
d1 = v_read32(&v[d][i + 4]);
p0 ^= d0;
p1 ^= d1;
@ -188,12 +188,12 @@ void raid_genz_int32(int nd, size_t size, void **vv)
r0 ^= d0;
r1 ^= d1;
}
v_32(p[i]) = p0;
v_32(p[i + 4]) = p1;
v_32(q[i]) = q0;
v_32(q[i + 4]) = q1;
v_32(r[i]) = r0;
v_32(r[i + 4]) = r1;
v_write32(&p[i], p0);
v_write32(&p[i + 4], p1);
v_write32(&q[i], q0);
v_write32(&q[i + 4], q1);
v_write32(&r[i], r0);
v_write32(&r[i + 4], r1);
}
}
@ -220,11 +220,11 @@ void raid_genz_int64(int nd, size_t size, void **vv)
r = v[nd + 2];
for (i = 0; i < size; i += 16) {
r0 = q0 = p0 = v_64(v[l][i]);
r1 = q1 = p1 = v_64(v[l][i + 8]);
r0 = q0 = p0 = v_read64(&v[l][i]);
r1 = q1 = p1 = v_read64(&v[l][i + 8]);
for (d = l - 1; d >= 0; --d) {
d0 = v_64(v[d][i]);
d1 = v_64(v[d][i + 8]);
d0 = v_read64(&v[d][i]);
d1 = v_read64(&v[d][i + 8]);
p0 ^= d0;
p1 ^= d1;
@ -241,12 +241,12 @@ void raid_genz_int64(int nd, size_t size, void **vv)
r0 ^= d0;
r1 ^= d1;
}
v_64(p[i]) = p0;
v_64(p[i + 8]) = p1;
v_64(q[i]) = q0;
v_64(q[i + 8]) = q1;
v_64(r[i]) = r0;
v_64(r[i + 8]) = r1;
v_write64(&p[i], p0);
v_write64(&p[i + 8], p1);
v_write64(&q[i], q0);
v_write64(&q[i + 8], q1);
v_write64(&r[i], r0);
v_write64(&r[i + 8], r1);
}
}
@ -277,7 +277,7 @@ void raid_gen3_int8(int nd, size_t size, void **vv)
for (i = 0; i < size; i += 1) {
p0 = q0 = r0 = 0;
for (d = l; d > 0; --d) {
d0 = v_8(v[d][i]);
d0 = v[d][i];
p0 ^= d0;
q0 ^= raid_gfmul[d0][raid_gfgen[1][d]];
@ -285,15 +285,15 @@ void raid_gen3_int8(int nd, size_t size, void **vv)
}
/* first disk with all coefficients at 1 */
d0 = v_8(v[0][i]);
d0 = v[0][i];
p0 ^= d0;
q0 ^= d0;
r0 ^= d0;
v_8(p[i]) = p0;
v_8(q[i]) = q0;
v_8(r[i]) = r0;
p[i] = p0;
q[i] = q0;
r[i] = r0;
}
}
@ -326,7 +326,7 @@ void raid_gen4_int8(int nd, size_t size, void **vv)
for (i = 0; i < size; i += 1) {
p0 = q0 = r0 = s0 = 0;
for (d = l; d > 0; --d) {
d0 = v_8(v[d][i]);
d0 = v[d][i];
p0 ^= d0;
q0 ^= raid_gfmul[d0][raid_gfgen[1][d]];
@ -335,17 +335,17 @@ void raid_gen4_int8(int nd, size_t size, void **vv)
}
/* first disk with all coefficients at 1 */
d0 = v_8(v[0][i]);
d0 = v[0][i];
p0 ^= d0;
q0 ^= d0;
r0 ^= d0;
s0 ^= d0;
v_8(p[i]) = p0;
v_8(q[i]) = q0;
v_8(r[i]) = r0;
v_8(s[i]) = s0;
p[i] = p0;
q[i] = q0;
r[i] = r0;
s[i] = s0;
}
}
@ -380,7 +380,7 @@ void raid_gen5_int8(int nd, size_t size, void **vv)
for (i = 0; i < size; i += 1) {
p0 = q0 = r0 = s0 = t0 = 0;
for (d = l; d > 0; --d) {
d0 = v_8(v[d][i]);
d0 = v[d][i];
p0 ^= d0;
q0 ^= raid_gfmul[d0][raid_gfgen[1][d]];
@ -390,7 +390,7 @@ void raid_gen5_int8(int nd, size_t size, void **vv)
}
/* first disk with all coefficients at 1 */
d0 = v_8(v[0][i]);
d0 = v[0][i];
p0 ^= d0;
q0 ^= d0;
@ -398,11 +398,11 @@ void raid_gen5_int8(int nd, size_t size, void **vv)
s0 ^= d0;
t0 ^= d0;
v_8(p[i]) = p0;
v_8(q[i]) = q0;
v_8(r[i]) = r0;
v_8(s[i]) = s0;
v_8(t[i]) = t0;
p[i] = p0;
q[i] = q0;
r[i] = r0;
s[i] = s0;
t[i] = t0;
}
}
@ -439,7 +439,7 @@ void raid_gen6_int8(int nd, size_t size, void **vv)
for (i = 0; i < size; i += 1) {
p0 = q0 = r0 = s0 = t0 = u0 = 0;
for (d = l; d > 0; --d) {
d0 = v_8(v[d][i]);
d0 = v[d][i];
p0 ^= d0;
q0 ^= raid_gfmul[d0][raid_gfgen[1][d]];
@ -450,7 +450,7 @@ void raid_gen6_int8(int nd, size_t size, void **vv)
}
/* first disk with all coefficients at 1 */
d0 = v_8(v[0][i]);
d0 = v[0][i];
p0 ^= d0;
q0 ^= d0;
@ -459,12 +459,12 @@ void raid_gen6_int8(int nd, size_t size, void **vv)
t0 ^= d0;
u0 ^= d0;
v_8(p[i]) = p0;
v_8(q[i]) = q0;
v_8(r[i]) = r0;
v_8(s[i]) = s0;
v_8(t[i]) = t0;
v_8(u[i]) = u0;
p[i] = p0;
q[i] = q0;
r[i] = r0;
s[i] = s0;
t[i] = t0;
u[i] = u0;
}
}