Não entendo porque recebo este aviso sobre a conversão entre assinados e não assinados. Meu compilador está errado? [duplicado]
Eu tenho este código:
#include <cstdint>
#include <deque>
#include <iostream>
int main()
{
std::deque<uint8_t> receivedBytes;
int nbExpectedBytes = 1;
if (receivedBytes.size() >= static_cast<size_t>(nbExpectedBytes))
{
std::cout << "here" << std::endl;
}
return 0;
}
Com -Wsign-conversion, ele compila sem aviso no meu laptop Linux, mas no Linux embutido no qual ele deve ser executado, recebo o seguinte aviso:
temp.cpp: Na função 'int main ()': temp.cpp: 10: 33: aviso: conversão para 'std :: deque :: size_type {aka long unsigned int}' de 'int' pode mudar o sinal do resultado [-Wsign-conversão]
if (receivedBytes.size() >= static_cast<size_t>(nbExpectedBytes)) ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Eu simplesmente não entendo:
- Eu tenho o -Wsign-conversion habilitado no meu laptop Linux e no Linux embutido, então por que eu só recebo o aviso no Linux embutido?
- Estou convertendo explicitamente de
int
parasize_t
(o que não deve produzir um aviso porque a conversão é explícita) e, em seguida, comparando asize_t
com astd::deque<unsigned char>::size_type
, então onde está a conversão implícita de assinado para não assinado que dispara o aviso ??!
Não posso deixar de pensar que o compilador do Linux embarcado está errado aqui. Estou esquecendo de algo?
Edit: No meu laptop Linux estou usando g ++ versão 9.3.0, enquanto no Linux embutido estou usando g ++ versão 6.3.0 (provavelmente não é o binário usual, pois é uma arquitetura ARM64)
Respostas
Este é sem dúvida um bug / erro no compilador embutido. Separar o static_cast
da >=
comparação remove o aviso, como pode ser visto no teste do seguinte código no Compiler Explorer , com ARM64 gcc 6.3.0 (linux) selecionado:
#include <deque>
#include <cstddef>
#include <cstdint>
int main()
{
std::deque<uint8_t> receivedBytes;
int nbExpectedBytes = 1;
// Warning generated ...
while (receivedBytes.size() >= static_cast<size_t>(nbExpectedBytes))
{
break;
}
// Warning NOT generated ...
size_t blob = static_cast<size_t>(nbExpectedBytes);
while (receivedBytes.size() >= blob)
{
break;
}
return 0;
}
Além disso, o aviso também desaparece ao mudar para o compilador ARM gcc 6.3.0 (linux) (32 bits).