@@ -52,7 +52,8 @@ static const uint16_t crc_lut[256] = {
5252static uint16_t crc16_ccitt (uint16_t crc, const uint_least8_t * data, size_t len)
5353{
5454 for (size_t i = 0 ; i < len; i++) {
55- crc = static_cast <uint16_t >((crc << 8U ) ^ crc_lut[((crc >> 8U ) ^ data[i]) & 0xFFU ]);
55+ crc = static_cast <uint16_t >((static_cast <unsigned >(crc) << 8U ) ^
56+ crc_lut[(static_cast <unsigned >(crc) >> 8U ) ^ data[i]]);
5657 }
5758 return crc;
5859}
@@ -232,7 +233,7 @@ static void test_rx_v1_multiframe_2frame_classic()
232233 const uint_least8_t padding[4 ] = { 0 , 0 , 0 , 0 };
233234 crc = crc16_ccitt (0xFFFFU , payload, 8U );
234235 crc = crc16_ccitt (crc, padding, 4U );
235- const uint_least8_t crc_hi = static_cast <uint_least8_t >((crc >> 8U ) & 0xFFU );
236+ const uint_least8_t crc_hi = static_cast <uint_least8_t >((static_cast < unsigned >( crc) >> 8U ) & 0xFFU );
236237 const uint_least8_t crc_lo = static_cast <uint_least8_t >(crc & 0xFFU );
237238
238239 uint_least8_t frame2[8 ];
@@ -296,7 +297,7 @@ static void test_rx_v1_multiframe_3frame()
296297 const uint_least8_t pad[4 ] = { 0 , 0 , 0 , 0 };
297298 uint16_t crc = crc16_ccitt (0xFFFFU , payload, 15U );
298299 crc = crc16_ccitt (crc, pad, 4U );
299- const uint_least8_t crc_hi = static_cast <uint_least8_t >((crc >> 8U ) & 0xFFU );
300+ const uint_least8_t crc_hi = static_cast <uint_least8_t >((static_cast < unsigned >( crc) >> 8U ) & 0xFFU );
300301 const uint_least8_t crc_lo = static_cast <uint_least8_t >(crc & 0xFFU );
301302
302303 uint_least8_t frame1[8 ];
@@ -370,7 +371,7 @@ static void test_rx_v1_multiframe_fd()
370371 const uint_least8_t pad[52 ] = {};
371372 uint16_t crc = crc16_ccitt (0xFFFFU , payload, 70U );
372373 crc = crc16_ccitt (crc, pad, 52U );
373- const uint_least8_t crc_hi = static_cast <uint_least8_t >((crc >> 8U ) & 0xFFU );
374+ const uint_least8_t crc_hi = static_cast <uint_least8_t >((static_cast < unsigned >( crc) >> 8U ) & 0xFFU );
374375 const uint_least8_t crc_lo = static_cast <uint_least8_t >(crc & 0xFFU );
375376
376377 // Frame 1 (64 bytes).
@@ -407,7 +408,7 @@ static void test_rx_v1_multiframe_fd()
407408
408409 // Recompute CRC without padding.
409410 crc = crc16_ccitt (0xFFFFU , payload, 70U );
410- const uint_least8_t crc_hi2 = static_cast <uint_least8_t >((crc >> 8U ) & 0xFFU );
411+ const uint_least8_t crc_hi2 = static_cast <uint_least8_t >((static_cast < unsigned >( crc) >> 8U ) & 0xFFU );
411412 const uint_least8_t crc_lo2 = static_cast <uint_least8_t >(crc & 0xFFU );
412413
413414 // Frame 2 (10 bytes): 7 payload + CRC(2) + tail.
@@ -456,7 +457,7 @@ static void test_rx_multiframe_crc_error()
456457 crc = crc16_ccitt (crc, pad, 4U );
457458
458459 // Corrupt the CRC by flipping the low byte.
459- const uint_least8_t bad_crc_hi = static_cast <uint_least8_t >((crc >> 8U ) & 0xFFU );
460+ const uint_least8_t bad_crc_hi = static_cast <uint_least8_t >((static_cast < unsigned >( crc) >> 8U ) & 0xFFU );
460461 const uint_least8_t bad_crc_lo = static_cast <uint_least8_t >((crc & 0xFFU ) ^ 0x01U ); // flipped bit
461462
462463 uint_least8_t frame1[8 ];
@@ -507,7 +508,7 @@ static void test_rx_multiframe_single_bit_flip()
507508 const uint_least8_t pad[4 ] = {};
508509 uint16_t crc = crc16_ccitt (0xFFFFU , payload, 8U );
509510 crc = crc16_ccitt (crc, pad, 4U );
510- const uint_least8_t crc_hi = static_cast <uint_least8_t >((crc >> 8U ) & 0xFFU );
511+ const uint_least8_t crc_hi = static_cast <uint_least8_t >((static_cast < unsigned >( crc) >> 8U ) & 0xFFU );
511512 const uint_least8_t crc_lo = static_cast <uint_least8_t >(crc & 0xFFU );
512513
513514 // Frame 1 with a single bit flip in byte 3.
@@ -596,7 +597,7 @@ static void test_rx_extent_truncation_multiframe()
596597 const uint_least8_t pad[4 ] = {};
597598 uint16_t crc = crc16_ccitt (0xFFFFU , payload, 8U );
598599 crc = crc16_ccitt (crc, pad, 4U );
599- const uint_least8_t crc_hi = static_cast <uint_least8_t >((crc >> 8U ) & 0xFFU );
600+ const uint_least8_t crc_hi = static_cast <uint_least8_t >((static_cast < unsigned >( crc) >> 8U ) & 0xFFU );
600601 const uint_least8_t crc_lo = static_cast <uint_least8_t >(crc & 0xFFU );
601602
602603 uint_least8_t frame1[8 ];
@@ -789,7 +790,7 @@ static void test_rx_priority_preemption()
789790 uint_least8_t frame2_lo[8 ];
790791 frame2_lo[0 ] = payload_lo[7 ];
791792 std::memset (&frame2_lo[1 ], 0 , 4 );
792- frame2_lo[5 ] = static_cast <uint_least8_t >((crc_lo_full >> 8U ) & 0xFFU );
793+ frame2_lo[5 ] = static_cast <uint_least8_t >((static_cast < unsigned >( crc_lo_full) >> 8U ) & 0xFFU );
793794 frame2_lo[6 ] = static_cast <uint_least8_t >(crc_lo_full & 0xFFU );
794795 frame2_lo[7 ] = make_v1_tail (false , true , false , 0U );
795796
@@ -805,7 +806,7 @@ static void test_rx_priority_preemption()
805806 uint_least8_t frame2_hi[8 ];
806807 frame2_hi[0 ] = payload_hi[7 ];
807808 std::memset (&frame2_hi[1 ], 0 , 4 );
808- frame2_hi[5 ] = static_cast <uint_least8_t >((crc_hi_full >> 8U ) & 0xFFU );
809+ frame2_hi[5 ] = static_cast <uint_least8_t >((static_cast < unsigned >( crc_hi_full) >> 8U ) & 0xFFU );
809810 frame2_hi[6 ] = static_cast <uint_least8_t >(crc_hi_full & 0xFFU );
810811 frame2_hi[7 ] = make_v1_tail (false , true , false , 1U );
811812
@@ -855,21 +856,24 @@ static void test_rx_priority_preemption_interleaved()
855856 uint16_t crc_lo = crc16_ccitt (crc16_ccitt (0xFFFFU , payload_lo, 8U ), pad, 4U );
856857 uint16_t crc_hi = crc16_ccitt (crc16_ccitt (0xFFFFU , payload_hi, 8U ), pad, 4U );
857858
858- uint_least8_t f1_lo[8 ], f2_lo[8 ], f1_hi[8 ], f2_hi[8 ];
859+ uint_least8_t f1_lo[8 ];
860+ uint_least8_t f2_lo[8 ];
861+ uint_least8_t f1_hi[8 ];
862+ uint_least8_t f2_hi[8 ];
859863
860864 std::memcpy (f1_lo, payload_lo, 7U );
861865 f1_lo[7 ] = make_v1_tail (true , false , true , 0U );
862866 f2_lo[0 ] = payload_lo[7 ];
863867 std::memset (&f2_lo[1 ], 0 , 4 );
864- f2_lo[5 ] = static_cast <uint_least8_t >((crc_lo >> 8U ) & 0xFFU );
868+ f2_lo[5 ] = static_cast <uint_least8_t >((static_cast < unsigned >( crc_lo) >> 8U ) & 0xFFU );
865869 f2_lo[6 ] = static_cast <uint_least8_t >(crc_lo & 0xFFU );
866870 f2_lo[7 ] = make_v1_tail (false , true , false , 0U );
867871
868872 std::memcpy (f1_hi, payload_hi, 7U );
869873 f1_hi[7 ] = make_v1_tail (true , false , true , 1U );
870874 f2_hi[0 ] = payload_hi[7 ];
871875 std::memset (&f2_hi[1 ], 0 , 4 );
872- f2_hi[5 ] = static_cast <uint_least8_t >((crc_hi >> 8U ) & 0xFFU );
876+ f2_hi[5 ] = static_cast <uint_least8_t >((static_cast < unsigned >( crc_hi) >> 8U ) & 0xFFU );
873877 f2_hi[6 ] = static_cast <uint_least8_t >(crc_hi & 0xFFU );
874878 f2_hi[7 ] = make_v1_tail (false , true , false , 1U );
875879
@@ -1015,7 +1019,7 @@ static void test_rx_wrong_toggle_rejected()
10151019 const uint_least8_t pad[4 ] = {};
10161020 uint16_t crc = crc16_ccitt (0xFFFFU , payload, 8U );
10171021 crc = crc16_ccitt (crc, pad, 4U );
1018- const uint_least8_t crc_hi = static_cast <uint_least8_t >((crc >> 8U ) & 0xFFU );
1022+ const uint_least8_t crc_hi = static_cast <uint_least8_t >((static_cast < unsigned >( crc) >> 8U ) & 0xFFU );
10191023 const uint_least8_t crc_lo = static_cast <uint_least8_t >(crc & 0xFFU );
10201024
10211025 // Frame 1 (SOT): toggle=1 (correct for v1).
@@ -1063,7 +1067,7 @@ static void test_rx_interface_affinity()
10631067 const uint_least8_t pad[4 ] = {};
10641068 uint16_t crc = crc16_ccitt (0xFFFFU , payload, 8U );
10651069 crc = crc16_ccitt (crc, pad, 4U );
1066- const uint_least8_t crc_hi = static_cast <uint_least8_t >((crc >> 8U ) & 0xFFU );
1070+ const uint_least8_t crc_hi = static_cast <uint_least8_t >((static_cast < unsigned >( crc) >> 8U ) & 0xFFU );
10671071 const uint_least8_t crc_lo = static_cast <uint_least8_t >(crc & 0xFFU );
10681072
10691073 uint_least8_t frame1[8 ];
@@ -1183,10 +1187,10 @@ static void test_rx_v0_multiframe_roundtrip()
11831187 // = crc_lo | (crc_hi << 8) = v0crc. Correct!
11841188
11851189 uint_least8_t frame1[8 ];
1186- frame1[0 ] = static_cast <uint_least8_t >(v0crc & 0xFFU ); // crc_lo
1187- frame1[1 ] = static_cast <uint_least8_t >((v0crc >> 8U ) & 0xFFU ); // crc_hi
1188- std::memcpy (&frame1[2 ], payload, 5U ); // first 5 payload bytes
1189- frame1[7 ] = make_v0_tail (true , false , false , 2U ); // SOT=1, EOT=0, toggle=0 (v0 starts toggle=0)
1190+ frame1[0 ] = static_cast <uint_least8_t >(v0crc & 0xFFU ); // crc_lo
1191+ frame1[1 ] = static_cast <uint_least8_t >((static_cast < unsigned >( v0crc) >> 8U ) & 0xFFU ); // crc_hi
1192+ std::memcpy (&frame1[2 ], payload, 5U ); // first 5 payload bytes
1193+ frame1[7 ] = make_v0_tail (true , false , false , 2U ); // SOT=1, EOT=0, toggle=0 (v0 starts toggle=0)
11901194
11911195 uint_least8_t frame2[4 ];
11921196 std::memcpy (frame2, &payload[5 ], 3U ); // remaining 3 payload bytes
0 commit comments