Ich verstehe nicht, warum ich diese Warnung bezüglich der Konvertierung zwischen signiert und nicht signiert erhalte. Ist mein Compiler falsch? [Duplikat]

Nov 26 2020

Ich habe diesen Code:

#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;
}

Bei der -Wsign-Konvertierung wird dies ohne Warnung auf meinem Linux-Laptop kompiliert, aber unter dem eingebetteten Linux, auf dem es ausgeführt werden soll, wird die folgende Warnung angezeigt:

temp.cpp: In der Funktion 'int main ()': temp.cpp: 10: 33: Warnung: Die Konvertierung von 'int' in 'std :: deque :: size_type {aka long unsigned int}' kann das Vorzeichen von ändern Ergebnis [-Wsign-Konvertierung]

 if (receivedBytes.size() >= static_cast<size_t>(nbExpectedBytes))
                             ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Ich verstehe einfach nicht:

  • Ich habe -Wsign-Konvertierung sowohl auf meinem Linux-Laptop als auch auf dem eingebetteten Linux aktiviert. Warum erhalte ich die Warnung nur auf dem eingebetteten Linux?
  • Ich wandle explizit von intnach size_t(was keine Warnung erzeugen sollte, da die Besetzung explizit ist) und vergleiche dann a size_tmit a std::deque<unsigned char>::size_type. Wo ist also die implizite Konvertierung von signiert nach vorzeichenlos, die die Warnung auslöst?

Ich kann nicht anders, als zu denken, dass der Compiler unter dem eingebetteten Linux hier falsch ist. Vermisse ich etwas

Bearbeiten: Auf meinem Linux-Laptop verwende ich g ++ Version 9.3.0, während ich auf dem eingebetteten Linux g ++ Version 6.3.0 verwende (wahrscheinlich nicht die übliche Binärdatei, da es sich um eine ARM64-Architektur handelt).

Antworten

4 AdrianMole Nov 26 2020 at 18:22

Dies ist zweifellos ein Fehler im eingebetteten Compiler. Durch das Trennen static_castvon vom >=Vergleich wird die Warnung entfernt, wie aus dem Testen des folgenden Codes im Compiler Explorer bei ausgewähltem ARM64 gcc 6.3.0 (Linux) hervorgeht:

#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;
}

Außerdem verschwindet die Warnung auch beim Wechsel zum (32-Bit) ARM gcc 6.3.0 (Linux) Compiler.