Forum: PC-Programmierung Compiler Warnung in temporärer Datei


von StinkyWinky (Gast)


Lesenswert?

Ich verwende Code:Blocks auf WinXP und programmiere in C.

Seit ich mein Projekt mit dem meines Kollegen zusammengeführt habe, 
erhalte ich neuerdings dutzende Warnungen dieser Art:
1
C:\DOKUME~1\Username\LOKALE~1\Temp\cc69aaaa.s|6795|Warning: value 0x190 truncated to 0x90|
2
C:\DOKUME~1\Username\LOKALE~1\Temp\cc69aaaa.s|6811|Warning: value 0x191 truncated to 0x91|
3
C:\DOKUME~1\Username\LOKALE~1\Temp\cc69aaaa.s|6827|Warning: value 0x192 truncated to 0x92|
4
(...)

Wie finde ich heraus, woher das kommt? Der Dateiname "cc69aaaa.s" ändert 
bei jedem Durchgang. Es ist mir nicht gelungen, die Datei im Ordner 
"C:\DOKUME~1\Username\LOKALE~1\Temp\" zu betrachten.

Danke für Hinweise.

von Klaus W. (mfgkw)


Lesenswert?

1. gibt es nicht eine gcc-Option, um temporäre Dateien zu behalten?
   -save-temps

2. Möglicherweise ist ein Quelltext als Mehrbytecode bzw. Unicode
   gespeichert?

von StinkyWinky (Gast)


Lesenswert?

Danke. Der Tipp mit dem -save-temps bringt mich weiter!

Anscheinend wird in einer grossen, konstanten Struktur versucht, Werte 
grösser als 255 in einem Byte zu speichern...

von Peter II (Gast)


Lesenswert?

StinkyWinky schrieb:
> Anscheinend wird in einer grossen, konstanten Struktur versucht, Werte
> grösser als 255 in einem Byte zu speichern...

zeige uns doch mal die so eine Zeile.

von StinkyWinky (Gast)


Lesenswert?

Der Datentyp:
1
typedef struct
2
{
3
  uint16_t  ParaNo;
4
  uint16_t  EeprAddr;
5
  int32_t  Min;
6
  int32_t  Max;
7
  int32_t  Default;
8
  uint16_t  Factor:14;
9
  uint16_t  ValPropSrc:1;
10
  uint16_t  Sign: 1;
11
  uint16_t  Visibility: 2;
12
  uint16_t  Fct: 3;
13
  uint16_t  Belong: 3;
14
  uint16_t  PwLvl: 3;
15
  uint16_t  PBoxMenu: 3;
16
  uint16_t  Direction: 2;
17
  uint16_t  MenuOrder: 8;
18
  uint16_t  MenuAuxInfo 8;
19
  uint16_t  IWPosition;
20
  uint16_t  NameIdx;
21
  uint16_t  UnitIdx;
22
  uint16_t  NbListItems;
23
  uint16_t  SinceParaVersion;
24
} T_ParaProperties;

Initialisierungsdaten des Records [400]:
1
{400,4224,  55536,10000,65436,100,  0,SIGN_SIGNED,eVisibility_Normal,0 |FCT_V | 0,eParaBelongType_Install,1,MENU_PARA_PID,eDir_Up,400,AUX_INFO_NONE,1300,TXT_V_START_OFFS,TXT_PERCENT,0,4},

Das Problem wird von "MenuOrder: 8" mit Wert 400 verursacht.
Der Compiler merkt wegen uint16_t nicht, dass 400 den Wertebereich für 8 
Bit übersteigt. Ich ändere das jetzt auf uint8_t, dann gibt es eine 
vernünftige Fehlermeldung.

Übrigens wurde das mit den Bitbreiten gemacht, um den Platzbedarf für 
die knapp 500 Parameter zu optimieren. Zielsystem ist ein Cortex-M3.

von Klaus W. (mfgkw)


Lesenswert?

StinkyWinky schrieb:
> Das Problem wird von "MenuOrder: 8" mit Wert 400 verursacht.
> Der Compiler merkt wegen uint16_t nicht, dass 400 den Wertebereich für 8
> Bit übersteigt. Ich ändere das jetzt auf uint8_t, dann gibt es eine
> vernünftige Fehlermeldung.

Das macht m.E. keinen Sinn.
Mit uint8_t gibt man eine Breite vor, ebenso mit :8.

Bitfelder sollte man generell als signed oder unsigned deklarieren, 
zusammen mit dem :...
In deinem Fall also unsigned MenuOrder: 8

Analog natürlich die anderen, uint16_t  ValPropSrc:1 beispielsweise ist 
im besten Fall verwirrend, ggf. aber auch nicht portabel.

von Yalu X. (yalu) (Moderator)


Lesenswert?

Das ist aber ein komisches Verhalten des Compilers. Die GCCs für x86 und 
AVR melden
1
warning: large integer implicitly truncated to unsigned type

und schneiden den Wert von sich aus auf 0x90 ab, so dass es vom 
Assembler nichts mehr zu meckern gibt. Entsprechendes gilt auch für 
kleinere Bitfelder. Es wird immer geprüft, ob der Wert mit der 
jeweiligen Bitzahl überhaupt darstellbar ist.

Könnte das ein Bug im ARM-GCC sein?

von Klaus W. (mfgkw)


Lesenswert?

Ist doch nur eine Warnung, die liest nicht jeder :-)

von StinkyWinky (Gast)


Lesenswert?

@Yalu
Ich übersetze den Code auf dem PC, Zielsystem PC (gcc 3.4.5). Zusätzlich 
sind da noch ein paar Unit-Tests dabei. Erst wenn das erfolgreich 
durchgelaufen ist, wird es mit uVision (ARM-GCC) für den Cortex-M3 
übersetzt. Letzterer hatte auch nichts angemeckert.

von Kindergärtner (Gast)


Lesenswert?

StinkyWinky schrieb:
> Zielsystem PC (gcc 3.4.5)
Aah, bitte einmal auf was nicht-steinzeitliches updaten bevor man über 
eventuelle Bugs spekuliert...

von StinkyWinky (Gast)


Lesenswert?

@Klaus
Ursprünglich waren alle Felder 32-bittig, bis die Grösse explodiert ist. 
Dann wurde versucht die Grösse der Struktur zu verkleinern. Um Problemen 
mit dem Alignement aus dem Weg zu gehen, kam jemand auf die seltsame 
Idee, es so zu lösen, wie es jetzt ist.

von amateur (Gast)


Lesenswert?

Kann es sein, dass Du zu großzügig zusammen geführt hast?

Also das Du irgendein Make-File oder eine Datei mit Pfaden, die nur bei 
Deinem Kollegen existieren, oder auf die nur er Zugriff hat, mit kopiert 
hast.

Compiler haben relativ komplexe Verfahren bei der Suche nach Dateien 
oder nach Ablagemöglichkeiten für ihren Output.

Wenn mich nicht alles täuscht lautet eins: "Im Zweifelsfalle ins 
Temp-Verzeichnis" - das gibt's doch immer.

von Yalu X. (yalu) (Moderator)


Lesenswert?

StinkyWinky schrieb:
> Ich übersetze den Code auf dem PC, Zielsystem PC (gcc 3.4.5).

Ok, der älteste Compiler, auf dem ich das getestet habe, ist 4.2.4, und 
der ist auch schon uralt ;-)

Der 3.4.5 wurde übrigens am 30.11.2005 herausgegeben.

von StinkyWinky (Gast)


Lesenswert?

Sorry, dass ich eure Zeit vergeudet habe.
Mit gcc 4.7.2 wärs nicht passiert, der spuckt folgendes aus:
1
paramProps.c|411|warning: large integer implicitly truncated to unsigned type [-Woverflow]|

Danke für eure Hinweise!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.