如何修复 cppcheck“可移植性:在具有不兼容的二进制数据表示形式的 unsigned char * 和 double * 之间进行转换。”

问题描述 投票:0回答:1

我正在对一些遗留问题运行 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.

c++ casting cppcheck
1个回答
0
投票

cppcheck 标记此代码是正确的,但不是因为这个原因。仅当字符指针与

char *
对齐时,从
double *
double
的转换才安全。否则,当您尝试从强制转换的指针执行未对齐的加载时,您会出现未定义的行为。

您可以使用 memcpy 来加载双精度数据:

double value;
memcpy(&value, myData + pos, sizeof(double));
…
pos += sizeof(double);

如果您的 CPU 上允许未对齐的负载,任何像样的编译器都会将 memcpy 优化为适当的负载。

© www.soinside.com 2019 - 2024. All rights reserved.