Estou executando o CppCheck em algum legado e tentando consertar todos os problemas relatados. Tenho alguns avisos de portabilidade relacionados à transmissão que não consigo descobrir como consertar.
Eu isolei o código em um MVCE, basicamente, recebemos um char*
(lido de um driver USB). Este array representa double
valores. Para interpretá-los, usamos um cast from char*
to double*
, funciona bem para todas as nossas plataformas suportadas, mas o CppCheck não gosta disso.
Existe uma maneira melhor de fazer isso em C++? Ou devo simplesmente silenciar o aviso para essas linhas?
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;
}
}
Relatórios CppCheckportability: Casting between char * and double * which have an incompatible binary data representation.
cppcheck está certo em sinalizar esse código, mas não por esse motivo. A conversão de
char *
paradouble *
só é segura se o ponteiro char estiver alinhado paradouble
. Caso contrário, você terá um comportamento indefinido ao tentar executar um carregamento desalinhado do ponteiro convertido.Você pode usar memcpy para carregar os dados como doubles:
A maioria dos compiladores otimizará o memcpy em uma carga apropriada (ou múltiplas cargas), dependendo do suporte da sua CPU para cargas desalinhadas.