我正在对一些遗留问题运行 CppCheck 并尝试修复所有报告的问题。我收到一些与转换相关的可移植性警告,但我找不到如何修复。
我将代码隔离在 MVCE 中,基本上,我们收到一个
char*
(从 USB 驱动程序读取)。该数组代表 double
值。为了解释它们,我们使用从 char*
到 double*
的转换,它适用于我们所有支持的平台,但 CppCheck 不喜欢这样。
有更好的 C++ 方法吗?或者我应该简单地忽略这些行的警告?
void printAsDouble( char* myData, size_t size )
{
if ( size%sizeof(double) == 0 )
{
double* array = (double*)myData;
for (size_t pos = 0; pos != size/sizeof(double); ++pos)
std::cout << "Value #" << (pos+1) << " is " << array[pos] << std::endl;
}
}
CppCheck 报告
portability: Casting between char * and double * which have an incompatible binary data representation.
cppcheck 标记此代码是正确的,但不是因为这个原因。仅当字符指针与
char *
对齐时,从 double *
到 double
的转换才安全。否则,当您尝试从强制转换的指针执行未对齐的加载时,您会出现未定义的行为。
您可以使用 memcpy 来加载双精度数据:
double value;
memcpy(&value, myData + pos, sizeof(double));
…
pos += sizeof(double);
如果您的 CPU 上允许未对齐的负载,任何像样的编译器都会将 memcpy 优化为适当的负载。