Skip to content

Commit 03cedee

Browse files
authored
Merge pull request opencv#26547 from mshabunin:fix-type-cast
Fixed several cases of unaligned pointer cast
2 parents 8897002 + c58b6bf commit 03cedee

File tree

3 files changed

+22
-6
lines changed

3 files changed

+22
-6
lines changed

modules/core/src/stat.simd.hpp

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -48,12 +48,16 @@ int normHamming(const uchar* a, int n)
4848
# if defined CV_POPCNT_U64
4949
for(; i <= n - 8; i += 8)
5050
{
51-
result += (int)CV_POPCNT_U64(*(uint64*)(a + i));
51+
uint64_t val;
52+
std::memcpy(&val, a + i, sizeof(val));
53+
result += (int)CV_POPCNT_U64(val);
5254
}
5355
# endif
5456
for(; i <= n - 4; i += 4)
5557
{
56-
result += CV_POPCNT_U32(*(uint*)(a + i));
58+
uint32_t val;
59+
std::memcpy(&val, a + i, sizeof(val));
60+
result += CV_POPCNT_U32(val);
5761
}
5862
}
5963
#endif
@@ -92,12 +96,18 @@ int normHamming(const uchar* a, const uchar* b, int n)
9296
# if defined CV_POPCNT_U64
9397
for(; i <= n - 8; i += 8)
9498
{
95-
result += (int)CV_POPCNT_U64(*(uint64*)(a + i) ^ *(uint64*)(b + i));
99+
uint64_t val_a, val_b;
100+
std::memcpy(&val_a, a + i, sizeof(val_a));
101+
std::memcpy(&val_b, b + i, sizeof(val_b));
102+
result += (int)CV_POPCNT_U64(val_a ^ val_b);
96103
}
97104
# endif
98105
for(; i <= n - 4; i += 4)
99106
{
100-
result += CV_POPCNT_U32(*(uint*)(a + i) ^ *(uint*)(b + i));
107+
uint32_t val_a, val_b;
108+
std::memcpy(&val_a, a + i, sizeof(val_a));
109+
std::memcpy(&val_b, b + i, sizeof(val_b));
110+
result += (int)CV_POPCNT_U32(val_a ^ val_b);
101111
}
102112
}
103113
#endif

modules/imgcodecs/src/utils.hpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,11 @@ uchar* FillGrayRow1( uchar* data, uchar* indices, int len, uchar* palette );
137137

138138
CV_INLINE bool isBigEndian( void )
139139
{
140-
return (((const int*)"\0\x1\x2\x3\x4\x5\x6\x7")[0] & 255) != 0;
140+
#ifdef WORDS_BIGENDIAN
141+
return true;
142+
#else
143+
return false;
144+
#endif
141145
}
142146

143147
} // namespace

modules/imgproc/src/smooth.simd.hpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1324,7 +1324,9 @@ void vlineSmooth3N<uint8_t, ufixedpoint16>(const ufixedpoint16* const * src, con
13241324
ufixedpoint32 val[] = { (m[0] + m[1] + m[2]) * ufixedpoint16((uint8_t)128) };
13251325
v_128_4 = vx_setall_s32(*((int32_t*)val));
13261326
}
1327-
v_int16 v_mul01 = v_reinterpret_as_s16(vx_setall_u32(*((uint32_t*)m)));
1327+
uint32_t val01;
1328+
std::memcpy(&val01, m, sizeof(val01));
1329+
v_int16 v_mul01 = v_reinterpret_as_s16(vx_setall_u32(val01));
13281330
v_int16 v_mul2 = v_reinterpret_as_s16(vx_setall_u16(*((uint16_t*)(m + 2))));
13291331
for (; i <= len - 4*VECSZ; i += 4*VECSZ)
13301332
{

0 commit comments

Comments
 (0)