From c81165d99221b3b3bc05b22946fc3de13956a132 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Igor=20Mi=C5=A1i=C4=87?= Date: Mon, 25 Sep 2023 17:26:36 +0200 Subject: [PATCH] test for MISRA --- Inc/crc/crc32_variants/crc32.h | 3 ++- Src/crc/crc32_variants/crc32.c | 21 ++++++++++++++++++--- Tests/test_crc32.c | 21 ++++++++++++++------- 3 files changed, 34 insertions(+), 11 deletions(-) diff --git a/Inc/crc/crc32_variants/crc32.h b/Inc/crc/crc32_variants/crc32.h index bb5d561..1f9da99 100644 --- a/Inc/crc/crc32_variants/crc32.h +++ b/Inc/crc/crc32_variants/crc32.h @@ -57,7 +57,8 @@ uint32_t Crc32( const uint8_t* crc_data_ptr, uint32_t crc_length, - bool final_xor + bool final_crc, + const uint32_t* last_crc_value ); #endif /* UTILITY_CRC32_H_ */ diff --git a/Src/crc/crc32_variants/crc32.c b/Src/crc/crc32_variants/crc32.c index 5a94414..6c421af 100644 --- a/Src/crc/crc32_variants/crc32.c +++ b/Src/crc/crc32_variants/crc32.c @@ -40,12 +40,14 @@ #define FINAL_XOR_VALUE (0xFFFFFFFFU) #define REFLECTED_OUTPUT (true) #define REFLECTED_INPUT (true) +#define FINAL_XOR (true) uint32_t Crc32( const uint8_t* crc_data_ptr, uint32_t crc_length, - bool final_xor) { + bool final_crc, + const uint32_t* last_crc_value) { /* CRC32 also know as Ethernet CRC (Polynomial 0x4C11DB7) */ static const uint32_t crc_table[256] = { @@ -83,13 +85,26 @@ Crc32( 0xAFB010B1U, 0xAB710D06U, 0xA6322BDFU, 0xA2F33668U, 0xBCB4666DU, 0xB8757BDAU, 0xB5365D03U, 0xB1F740B4U }; + bool reflect_output = false; + bool final_xor = false; + uint32_t crc_initial_value = INITIAL_CRC32_VALUE; + + if (NULL_PTR != last_crc_value) { + crc_initial_value = *last_crc_value; + } + + if (final_crc) { + reflect_output = REFLECTED_OUTPUT; + final_xor = FINAL_XOR; + } + return Crc32Base( crc_table, crc_data_ptr, crc_length, - INITIAL_CRC32_VALUE, + crc_initial_value, FINAL_XOR_VALUE, - REFLECTED_OUTPUT, + reflect_output, REFLECTED_INPUT, final_xor ); diff --git a/Tests/test_crc32.c b/Tests/test_crc32.c index 7529f90..89e99db 100644 --- a/Tests/test_crc32.c +++ b/Tests/test_crc32.c @@ -162,13 +162,20 @@ TEST(Crc32, CRC32Base_Without_finish_xor) { } TEST(Crc32, Crc32) { - TEST_ASSERT_EQUAL_HEX32(0x2144DF1CU, Crc32(message1, sizeof(message1), true)); - TEST_ASSERT_EQUAL_HEX32(0x24AB9D77U, Crc32(message2, sizeof(message2), true)); - TEST_ASSERT_EQUAL_HEX32(0xB6C9B287U, Crc32(message3, sizeof(message3), true)); - TEST_ASSERT_EQUAL_HEX32(0x32A06212U, Crc32(message4, sizeof(message4), true)); - TEST_ASSERT_EQUAL_HEX32(0xB0AE863DU, Crc32(message5, sizeof(message5), true)); - TEST_ASSERT_EQUAL_HEX32(0x9CDEA29BU, Crc32(message6, sizeof(message6), true)); - TEST_ASSERT_EQUAL_HEX32(0xFFFFFFFFU, Crc32(message7, sizeof(message7), true)); + TEST_ASSERT_EQUAL_HEX32(0x2144DF1CU, Crc32(message1, sizeof(message1), true, NULL_PTR)); + TEST_ASSERT_EQUAL_HEX32(0x24AB9D77U, Crc32(message2, sizeof(message2), true, NULL_PTR)); + TEST_ASSERT_EQUAL_HEX32(0xB6C9B287U, Crc32(message3, sizeof(message3), true, NULL_PTR)); + TEST_ASSERT_EQUAL_HEX32(0x32A06212U, Crc32(message4, sizeof(message4), true, NULL_PTR)); + TEST_ASSERT_EQUAL_HEX32(0xB0AE863DU, Crc32(message5, sizeof(message5), true, NULL_PTR)); + TEST_ASSERT_EQUAL_HEX32(0x9CDEA29BU, Crc32(message6, sizeof(message6), true, NULL_PTR)); + TEST_ASSERT_EQUAL_HEX32(0xFFFFFFFFU, Crc32(message7, sizeof(message7), true, NULL_PTR)); + + // CRC when message is in chunks + uint32_t crc_result = Crc32(&message5[0], 2U, false, NULL_PTR); + crc_result = Crc32(&message5[2], 5U, false, &crc_result); + crc_result = Crc32(&message5[7], 2U, true, &crc_result); + + TEST_ASSERT_EQUAL_HEX32(0xB0AE863DU, crc_result); } TEST(Crc32, Crc32_bzip2) {