Não entendo porque recebo este aviso sobre a conversão entre assinados e não assinados. Meu compilador está errado? [duplicado]

Nov 26 2020

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 intpara size_t(o que não deve produzir um aviso porque a conversão é explícita) e, em seguida, comparando a size_tcom a std::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

4 AdrianMole Nov 26 2020 at 18:22

Este é sem dúvida um bug / erro no compilador embutido. Separar o static_castda >=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).