验证动态字节数组的 CRC 时崩溃 | C

Crash when validating the CRC of a dynamic byte array | c

对于嵌入式系统,我正在用 c 语言编写代码,以根据提供的 CRC 验证接收到的字节数组。系统在 RTU Modbus 中处于活动状态。

在我的单元测试中,我有以下(正确的)字节数组:

unsigned char frame[7] = { 0x01, 0x04, 0x02, 0x03, 0xFF, 0x80, 0xF9 }

最后两个字节是我要验证的提供的 CRC 码。

我的做法是将接收到的数组拆分为两个数组。第一个数组的长度为 n-2,第二个数组的长度为 2。然后根据第一个数组创建自己的CRC码,最后想验证第二个数组和自己的CRC码是否相同

这是我现在拥有的代码:

bool validateCrc16ModbusFrame(unsigned char frame[])
{
   // A valid response frame consists of at least 6 bytes.
   size_t size = sizeof frame;  
   if (size < 6) {
       return false;
   }

   // Split the frame into the 'bytes to check' and the 'provided CRC.'
   int newSize = size - 2;
   unsigned char* bytesToCheck = (unsigned char*)_malloca(newSize + 1); // Not sure about this line.
   char providedCrc[2];
   memcpy(bytesToCheck, frame, newSize * sizeof(int));
   memcpy(providedCrc, &frame[newSize], 2 * sizeof(int));

   // Calculate the CRC with the bytes to check.
   uint16_t calculatedCrc = calculateCrc16Modbus(bytesToCheck, newSize); // This function calculates the correct CRC code.
   _freea(bytesToCheck); // Not sure about this line.

   // The CRC is provided as two uint8_t bytes. Convered the two uint8_t to one uint16_t.
   uint8_t firstByteProvidedCrc = providedCrc[0];
   uint8_t secondByteProvidedCrc = providedCrc[1];
   uint16_t uint16ProvidedCrc = ((uint16_t)firstByteProvidedCrc << 8) | secondByteProvidedCrc;

   // Compare the provided CRC and the calculated CRC.
   bool result = uint16ProvidedCrc == calculatedCrc;
   return result;
}

但是当我 运行 测试代码时它崩溃并显示消息 '!!这个测试可能已经崩溃了!!'当我调试测试代码时,我收到消息 'TestProjectName.exe has triggered a breakpoint.' 的异常 我认为问题出在创建 and/or 释放动态字节数组的内存。

有人知道我做错了什么吗?

提前致谢。

亲切的问候,弗伦克

问题是当只分配 newsize+1 个字符时,memcpy 调用将 newsize 乘以 sizeof(int)。它们可能应该是:

   memcpy(bytesToCheck, frame, newSize);       /* no sizeof(int) */
   memcpy(providedCrc, &frame[newSize], 2);    /* no sizeof(int) */

此外,您不需要复制或拆分数组。您可以计算原始数组的 CRC,包括附加的 CRC,如果 CRC 未 post 补码,则生成的 CRC 将为零,或者如果 CRC 为 post 补码,则生成的 CRC 将为零.