Forum: Compiler & IDEs Fehler/Problem mit sprintf


von Mike R. (thesealion)


Lesenswert?

Hallo,

ich versuche gerade einen Parser für ein Projekt zu schreiben,
allerdings habe ich ein Problem mit der Ausgabe von Werten mittels 
sprintf.

Mitlerweile konnte ich das Problem auf einen Reset zurückführen.

1
#include "main.h"
2
3
char buffer[101];
4
5
int main( )
6
   {
7
   PORTH.DIR = 0xFF;    // kompletten Port als Output schalten
8
   PORTH.OUT = 0x55; 
9
10
   for (;;)
11
      {
12
      PORTH.OUT = 0x00;   
13
      test();
14
      }
15
   }

main.h
1
#ifndef __main__
2
   #define __main__
3
4
   #include <stdlib.h>
5
   #include <avr/io.h>
6
   #include <stdlib.h>
7
   #include <avr/interrupt.h>
8
9
   #include <stdio.h>
10
   #include <stdint.h>
11
   #include "test.h"
12
13
14
   extern char buffer[101];
15
16
#endif

test.h
1
#include <stdlib.h>
2
#include <avr/io.h>
3
#include <stdlib.h>
4
#include <avr/interrupt.h>
5
6
#include <stdio.h>
7
#include <stdint.h>
8
9
10
void test(void);

test.c
1
#include "main.h"
2
#include "test.h"
3
4
5
void test(void)
6
{
7
sprintf(buffer, "%d, %d",  0, 6);
8
 
9
}

Eigentlich besteht das Programm nur aus der Hauptschleife und einer 
Unterfunktion in der ich sprintf aufrufe. der Buffer ist dabei als 
globale Variable angelegt.

Mit einem Scop kann man sehen, das das System immer wieder neu startet 
und auch im Debugger zeigt sich dieses Problem. Der Aufruf von sprintf 
verändert den Stack so weit, das das return aus der Funktion test 
fehlschlägt.

von P. S. (Gast)


Lesenswert?

Welcher Controller?

von Mike R. (thesealion)


Lesenswert?

Ups, vergessen:

Xmega128A1

von Karl H. (kbuchegg)


Lesenswert?

Mike S. wrote:
> Ups, vergessen:
>
> Xmega128A1

Der hat nicht zufällig eine M103 Fuse?
Wenn ja: abschalten! Sonst geht jeder Funktionsaufruf in die Hose

von Mike R. (thesealion)


Lesenswert?

Hat er leider nicht. Außerdem bekomme ich den Fehler sogar im Simulator 
reproduziert und zumindestens der sollte keine passenden Fuses haben.

von Karl H. (kbuchegg)


Lesenswert?

Ja, habs gerade bemerkt. Hab das 'X' überlesen.

An deinem Pgm ist so erst mal nichts falsch.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Meine Kristallkugel sagt: Du verwendest die neueste Version von WinAVR?

Da hat's ein paar Bugs drin. Wenn auch in deinem Programm keine Fehler 
generiert werden, so sind doch die Target-Libs damit erstellt (libgcc, 
libc, libm, ...). Du linkst also auch gegen potentiell inkorrekte Libs.

Selbst wenn das bei deinem Projekt nicht das Problem ist, sollte man 
Ärger durch den Compilerbug versuchen auszuschliessen, indem man einen 
funktionierenden Compiler/Libs nimmt.

Johann

von Mike R. (thesealion)


Lesenswert?

OK, ich hab gerade festgestellt, daß es noch eine neure Version als 
meine bisher verwendete gibt.
Mit der 20090313 tritt der Fehler in meinem "Demo"Programm zumindestens 
nicht mehr auf.

Wobei das irgendwie der Aussage von Johann widerspricht, der ja sagt in 
der neuesten Version sind ein paar Fehler drin.

Wie schließe ich die Fehler durch den Compilerbug am besten aus und 
welche Version sollte man benutzen?

Mike

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Mike S. wrote:

> Wobei das irgendwie der Aussage von Johann widerspricht, der ja sagt in
> der neuesten Version sind ein paar Fehler drin.

Nö, Widerspruch ist das keiner. Daß ein Programm (Compiler) fehlerhaft 
ist, bedeutet nicht, daß der Fehler auch auftritt. Kleiner Exkurs in die 
Aussagelogik :-)

Ansonsten wäre es übrigens auch ziemlich simpel, Fehlerfreiheit von 
Software (oder wovon auch immer) nachzuweisen. Wenn man hingegen einen 
Fehler erzeugt bekommt, weiß man, daß das Werkzeug fehlerhaft ist...aber 
das ist wie gesagt was anderes: Es bedeutet nämlich, daß wenn das Tool 
nicht fehlerhaft ist, man damit keine Fehler erzeugen kann.

Der Fehler ist in WinAVR-2009-03-13 und WinAVR-20080512 sowie in der 
zugehörigen libgcc. Ob er in der avr-libc sein könnte weiß Jörg 
wahrscheinlich besser, denn er kennt die gcc-Version mit dem er 
generiert, die Patches die drinne sind und die Verschalterung.

Der Fehler ist nicht in Linux-Versionen, die aus den GCC-Quellen erzeugt 
sind.

Johann

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Mike S. wrote:

> Mit der 20090313 tritt der Fehler in meinem "Demo"Programm zumindestens
> nicht mehr auf.

Es gibt ja nicht nur neue Bugs, sondern auch hin und wieder welche,
die repariert werden. ;-)  Der hier ist ein solcher.  (Wenn ich mich
recht erinnere, wurde falscher Code für Funktionen oberhalb 128 KiB
generiert, wenn mit -fcall-prologue compiliert worden ist, und die
avr-libc compiliert mit diesem Schalter.)

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Jörg Wunsch wrote:
> Mike S. wrote:
>
>> Mit der 20090313 tritt der Fehler in meinem "Demo"Programm zumindestens
>> nicht mehr auf.
>
> Es gibt ja nicht nur neue Bugs, sondern auch hin und wieder welche,
> die repariert werden. ;-)  Der hier ist ein solcher.  (Wenn ich mich
> recht erinnere, wurde falscher Code für Funktionen oberhalb 128 KiB
> generiert, wenn mit -fcall-prologue compiliert worden ist, und die
> avr-libc compiliert mit diesem Schalter.)

Ich meinte eher den hier:
   http://lists.gnu.org/archive/html/avr-gcc-list/2009-03/msg00203.html
   http://lists.gnu.org/archive/html/avr-gcc-list/2009-04/msg00005.html

Die avr-libc wurde wahrscheinlich mit -O* und ohne -fno-split-wide-types 
erzeugt?

Johann

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.