Skip to content

Commit 1d48a78

Browse files
committed
Use bit_cast instead of pointer bullshit that breaks strict aliasing
1 parent 76517e9 commit 1d48a78

File tree

3 files changed

+7
-8
lines changed

3 files changed

+7
-8
lines changed

bitreader/include/bitreader/bitreader.hpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -85,10 +85,9 @@ namespace brcpp {
8585
{
8686
using FT = fitting_integral<T>;
8787
_validate_read_dynamic<T>(bits);
88-
T ret = zero<T>;
89-
auto& raw = reinterpret_cast<FT&>(ret);
88+
auto raw = zero<FT>;
9089
_read(_state, bits, raw);
91-
return _sign_extend(ret, bits);
90+
return _sign_extend(std::bit_cast<T>(raw), bits);
9291
}
9392

9493
template<binary_codec T>

bitreader/include/bitreader/bitwriter.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ namespace brcpp {
5959
size_t to_write = bits;
6060

6161
using FT = fitting_integral<T>;
62-
const auto bit_data = *reinterpret_cast<const FT*>(&data);
62+
const auto bit_data = std::bit_cast<FT>(data);
6363

6464
while (written < bits) {
6565
size_t post = std::min<uint64_t>(_state.avail, to_write);

bitreader/test/bitreader_gtest.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -425,7 +425,7 @@ TEST(bitreaderTest, read_float_aligned)
425425
bitreader<source_t> br(source);
426426

427427
const uint32_t raw_expected = 0x4148F5C3;
428-
const auto expected = *reinterpret_cast<const float*>(&raw_expected);
428+
const auto expected = std::bit_cast<float>(raw_expected);
429429
EXPECT_EQ(expected, br.read<float>(32));
430430
EXPECT_EQ(32, br.position());
431431
EXPECT_EQ(0, br.available());
@@ -439,7 +439,7 @@ TEST(bitreaderTest, read_double_aligned)
439439
bitreader<source_t> br(source);
440440

441441
const uint64_t raw_expected = 0x4005BF0A8B145762;
442-
const auto expected = *reinterpret_cast<const double*>(&raw_expected);
442+
const auto expected = std::bit_cast<double>(raw_expected);
443443
EXPECT_EQ(expected, br.read<double>(64));
444444
EXPECT_EQ(64, br.position());
445445
EXPECT_EQ(0, br.available());
@@ -455,7 +455,7 @@ TEST(bitreaderTest, read_float_unaligned)
455455
br.skip(4);
456456

457457
const uint32_t raw_expected = 0x02030405;
458-
const auto expected = *reinterpret_cast<const float*>(&raw_expected);
458+
const auto expected = std::bit_cast<float>(raw_expected);
459459
EXPECT_EQ(expected, br.read<float>(32)); // exact eq
460460
EXPECT_EQ(36, br.position());
461461
EXPECT_EQ(4, br.available());
@@ -471,7 +471,7 @@ TEST(bitreaderTest, read_double_unaligned)
471471
br.skip(4);
472472

473473
const uint64_t raw_expected = 0x0203'0405'0607'0809;
474-
const auto expected = *reinterpret_cast<const double*>(&raw_expected);
474+
const auto expected = std::bit_cast<double>(raw_expected);
475475
EXPECT_EQ(expected, br.read<double>(64));
476476
EXPECT_EQ(68, br.position());
477477
EXPECT_EQ(4, br.available());

0 commit comments

Comments
 (0)