Fehler in C-Programmen finden
Hallo, ich frage mich, wie man am bestimmte Programmierfehler findet. Ich mache mal ein Beispiel: int func( char* str, int option ) { char* sub = NULL; if( option & 2 ) { sub = str; } printf("%s\n", sub); return 0; } Wäre sub nicht initialisiert, würde der Compiler (gcc) eine Warnung ausspucken. Aus bestimmten Gründen (die nicht aus diesem Beispiel erkenntlich sind), soll sub aber mit NULL initialisiert sein. Bitte nehmt das Beispiel nicht so wörtlich. Ich habe komplexe Beispiele, ist aber das gleiche Prinzip: sub kann NULL sein, wenn z.B. option 0 ist - und das darf nicht sein. Man könnte natürlich richtig programmieren und ein "if(sub)" vor die printf Anweisung stellen. Aber es geht mir darum, solche Fälle, die zur Laufzeit mit einem Crash enden (außer bei printf), zu finden. Am besten wäre eine Exception, die mir die Codezeile zeigt. Aber bei reinen C-Libraries? Wie würdet ihr das machen? Grüße Manfred --------------------------------------------------------------------- To unsubscribe, e-mail: opensuse-programming-de+unsubscribe@opensuse.org For additional commands, e-mail: opensuse-programming-de+help@opensuse.org
* Manfred Rebentisch
Bitte nehmt das Beispiel nicht so wörtlich. Ich habe komplexe Beispiele, ist aber das gleiche Prinzip: sub kann NULL sein, wenn z.B. option 0 ist - und das darf nicht sein. Man könnte natürlich richtig programmieren und ein "if(sub)" vor die printf Anweisung stellen. Aber es geht mir darum, solche Fälle, die zur Laufzeit mit einem Crash enden (außer bei printf), zu finden.
Naja, wenn das Programm crashed kannst du ja einen Coredump erzeugen lassen (erst 'ulimit -c unlimited') und den dann mit gdb analysieren. Wenn du vorher das Programm mit Debuginformationen (-g) übersetzt hast, bekommst du damit die Codezeile. Außerdem kannst du das Programm direkt im gdb ausführen. Und Tools wie 'valgrind' erleichtern das Finden von Fehlern in der Speicherverwaltung zur Laufzeit. Allerdings muss da natürlich auch der Fehler angesprungen werden. Gute statische Analysetools kenne ich jetzt keine. Also Tools die Programmierfehler schon beim Kompilieren erkennen. Außer eben die Warnungen vom gcc. Gruß, Bernhard
Hallo, Am Donnerstag, 22. Februar 2007 22:23 schrieb Bernhard Walle:
Naja, wenn das Programm crashed kannst du ja einen Coredump erzeugen lassen (erst 'ulimit -c unlimited') und den dann mit gdb analysieren. Wenn du vorher das Programm mit Debuginformationen (-g) übersetzt hast, bekommst du damit die Codezeile.
Außerdem kannst du das Programm direkt im gdb ausführen. Und Tools wie 'valgrind' erleichtern das Finden von Fehlern in der Speicherverwaltung zur Laufzeit. Allerdings muss da natürlich auch der Fehler angesprungen werden.
Nun, es handelt sich um Libraries, die von einem Apache-Modul verwendet werden. Ausführung mit gdb ist aber auch deshalb mühsam, weil Fehler üblicherweise im Echtbetrieb auftreten und nicht beim Durchsteppen über 20000 Codezeilen. valgrind kenne ich nicht. Aber die Speicherverwaltung ist auch nicht das Problem, außer vielleicht noch im Shared-Memory-Bereich (aber da weiß ich, wie ich das angehe).
Gute statische Analysetools kenne ich jetzt keine. Also Tools die Programmierfehler schon beim Kompilieren erkennen. Außer eben die Warnungen vom gcc.
Ja, beim gcc fehlt mir eine Warnung wie "Variable wurde mit NULL initialisiert aber eventuell vor der Derefenzierung nicht auf einen vernünftigen Wert gesetzt" ;-) Grüße Manfred --------------------------------------------------------------------- To unsubscribe, e-mail: opensuse-programming-de+unsubscribe@opensuse.org For additional commands, e-mail: opensuse-programming-de+help@opensuse.org
Moin moin, Am Freitag, 23. Februar 2007 09:34 schrieb Manfred Rebentisch: [...]
Ja, beim gcc fehlt mir eine Warnung wie "Variable wurde mit NULL initialisiert aber eventuell vor der Derefenzierung nicht auf einen vernünftigen Wert gesetzt" ;-)
Na ja, "NULL" ist vernünftig und gewollt. Der Zeiger ist dann "sinnvoll" initialisiert. Darum: Pointer _immer_ auf NULL prüfen, bevor man diese benutzt. Wenn Du vergisst einen Zeiger zu initialisieren merkt das der Kompiler selbstverständlich. ~/c/test> gcc -O -Wuninitialized -o test test.c test.c: In function ‘main’: test.c:12: warning: ‘zi’ is used uninitialized in this function Ciao Andre --------------------------------------------------------------------- To unsubscribe, e-mail: opensuse-programming-de+unsubscribe@opensuse.org For additional commands, e-mail: opensuse-programming-de+help@opensuse.org
On Thu, Feb 22, 2007 at 09:25:23PM +0100, Manfred Rebentisch wrote:
Am besten wäre eine Exception, die mir die Codezeile zeigt. Aber bei reinen C-Libraries?
Wie würdet ihr das machen?
assert ( sub != NULL ); aber ist lange her das ich damit mal zu tun hatte. Peter --------------------------------------------------------------------- To unsubscribe, e-mail: opensuse-programming-de+unsubscribe@opensuse.org For additional commands, e-mail: opensuse-programming-de+help@opensuse.org
participants (4)
-
Andre Heine
-
Bernhard Walle
-
Manfred Rebentisch
-
Peter Wiersig