negative integer implicitly converted to unsigned type

OP #5144534
Hallo zusammen,

ich verbringe meinen Nachmittag mit Fehlersuche, und eine Fehlerursache 
habe ich gerade gefunden: In zwei C-Dateien ist folgendes definiert:

Datei 1:
1
extern volatile uint16_t gl_step_soll;

Datei 2:
1
volatile uint32_t gl_step_soll;

Ich nutze den ARM-GCC ( arm-none-eabi-gcc ). Daß mir der Compiler trotz 
pedantischer Flags keine Fehlermeldung geben kann, verstehe ich. Aber
offensichtlich ergibt dieser Fehler auch keine Linker-Warnung oder gar 
einen Linker-Fehler.

Warum? Kann man das ändern?

Viele Grüße
W.T.
Persönliche Seite #5144553
Das lässt sich nur mit sauberer Programmierung umgehen.

Die /extern/-Deklaration gehört in eine *.h-Datei, und diese muss in 
beide *.c-Dateien eingebunden werden.

Dann nämlich kann der Compiler beim Übersetzen der *.c-Datei, in der die 
Variable tatsächlich definiert wird, herausfinden, daß da ein 
Widerspruch besteht.

Beim von Dir beschriebenen Verfahren aber ist der Compiler beim 
Übersetzen beider *.c-Dateien glücklich, und der Linker bekommt nur 
einen Symbolnamen ohne Typinformationen vorgesetzt, so daß er das 
Problem nicht erkennen kann.


Anders sähe es aus, würde man die beien *.c-Dateien mit einem 
C++-Compiler übersetzen, dann nämlich erzeugt der Compiler "dekorierte 
Namen" für die Symbole, und beim Linken kracht es dann, weil die Namen 
sich unterscheiden.
Persönliche Seite #5144590
Rufus Τ. F. schrieb:
> Anders sähe es aus, würde man die beien *.c-Dateien mit einem
> C++-Compiler übersetzen, dann nämlich erzeugt der Compiler "dekorierte
> Namen" für die Symbole, und beim Linken kracht es dann, weil die Namen
> sich unterscheiden.
Aber nur bei Funktionen. Variablen kann man schließlich nicht überladen, 
daher ist der Symbolname sowohl von einem "int foo;" als auch von einem 
"float foo;" beide Male einfach nur "foo". Daher findet C++ hier auch 
keine Fehler.
#5144599
Nop schrieb:
> Walter T. schrieb:
>
>> Warum? Kann man das ändern?
>
> GCC 6.3.0 (MingW) erkennt das, ebenso wie GCC ARM-NONE_EABI 6.3.1,
> gerade getestet. Aber nur, sofern man -flto nutzt.

Weil mit LTO (stark vereinfacht dargestellt) alle .c-Files erst mal 
geparst werden und der Linker dann den Compiler ruft, um das ganze als 
eine einzige Compilation Unit zu behandeln. Eigentlich um übergreifend 
zu optimieren, aber der Zwischencode enthält auch genügend 
Typinformation, um diese Art von Fehlern zu finden.
Persönliche Seite #5144610
Rufus Τ. F. schrieb:
> Bleibt also nur das saubere Programmieren übrig.
So ist es... Prototypen gehören in Header-Dateien (außer die 
Funktion/Variable wird nur innerhalb einer Source-Datei definiert & 
genutzt). Wobei die Nutzung globaler Variablen, dann auch noch über 
mehrere Dateien hinweg, ohnehin "kontrovers" ist.

Rufus Τ. F. schrieb:
> Anstrengend, kann nicht ein Automat die Fehler wegmachen?
DWIM? ;-) Aber ja, Java-Programmierer haben es einfacher, die brauchen 
keine Header und Forward Declarations...

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.