2012-03-29 12 views
4
geben

ich eine ausführbare Datei für ein Embedded-Gerät (ein STM32) in C. schreibe funktioniert Nach einigen Debuggen, ich habe es auf diese Funktion reduziert:verderbte Argumente

char * parse(char * start) 
{ 
    int i = 0; 
    char command[20]; 
    print(start); 
} 

Aus irgendeinem Grunde, wenn ich rufe Mit dieser Funktion ist das Argument start fehlerhaft. Jetzt kann ich es arbeiten, wenn ich die command Initialisierung auf Kommentar:

char * parse(char * start) 
{ 
    int i = 0; 
    // char command[20]; 
    print(start); 
} 

Mit command kommentierte heraus, es funktioniert gut. Ich dachte mir, dass mir vielleicht der Arbeitsspeicher ausgehen würde. Aber das Programm ist winzig, und nach dem Überprüfen des Stack-Pointer-Registers kann ich bestätigen, dass ich noch viel RAM-Speicher übrig habe.

Was könnte hier schiefgehen? Ein gebrochener Compiler? (Ich verwende eine neu kompilierte Version von GCC für den ARM namens Yagarto.)

+0

Was macht 'print()'? Ich vermute, dass Ihr Bug stattdessen darin enthalten sein könnte (oder es wird gefüttert Eingabe kann es nicht behandeln). – pmdj

+0

'print' druckt nur die Zeichenfolge, die bei' start' beginnt. Aber das ist irrelevant. GDB zeigt mir, dass "Start" in beiden Fällen einen anderen Wert hat, wenn ich einen Breakpoint setze. – Randomblue

+0

Was genau GCC-Version und Compiler/Linker Flags verwenden Sie? –

Antwort

2

zeigte auf die Adresse des Stapels Ihrer Funktion im Speicher finden mehr als wahrscheinlich, dass Sie im Bereich der undefinierten Verhalten sind weil du etwas falsch gemacht hast woanders in deinem Programm. Die Tatsache, dass es unter bestimmten Umständen funktioniert, macht unbestimmtes Verhalten in keiner Weise akzeptabel :-)

Möglicherweise haben Sie Speicher überschrieben oder Ihre Zeichenfolge ist nicht null terminiert, oder einer der hundert anderen Gründe.

0

Sie haben irgendwie den parse Stack zerstört. Wenn Sie die Deklaration der command Variable auskommentieren, wird die Zuweisung auf den 20 Bytes in Ihrem Stack entfernt, was implizit passiert, wenn Sie sie behalten.

Können Sie versuchen, Valgrind auf Ihrem Programm, um herauszufinden, wo die Korruption passiert?

Auch, was ist die print Funktion? Drucken Sie den Wert von start in beiden Fällen mit

printf("%p\n", start); 

Sie können parse

+0

Ich habe kein 'printf'. Aus diesem Grund habe ich meinen eigenen "Print" gemacht. Ich habe Valgrind nicht, aber ich habe GDB, wenn das helfen könnte. – Randomblue

+0

Ändert sich der Wert von 'start' zwischen _vor dem Aufruf von' parse' und _inside_ 'parse'? – Eregrith