PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Warum überprüft der gcc nicht Feldgrenzen?



Silver
07-08-2003, 13:57
Hi!

Also was mich schon seit längerer Zeit wundert ist wenn ich nun zb ein Array defieniere mit 5 Elementen und ich will nun auf den Index 8 eine Zahl schreiben, wäre es doch nicht technisch schwer zu realisieren, diese Feldgrenze zu überprüfen, oder? Warum macht das dann nicht der gcc, sogar bei -Wall?

Ein Freund von mir hatte nämlich mal so einen Fehler welcher dann seine Rücksprungadresse überschrieb u. dies ziemlich lange dauert bis wir den Fehler fanden (weil wir auf untersch. gcc -versionen kompilierten und daher der fehler einmal auftrat u. einmal nicht)!!!

mfG

wraith
07-08-2003, 14:39
Wenn du den Zugriff hardcodest,also ein array[8] schreibst,wäre es sicherlich möglich zur Compilezeit eine Warnung zu generieren.
Aber auch nur wenn array ein Array ist,was der Compiler sehen kann.
Bsp,um das klar zu machen


void foo(char *array)
{
array[100] = 'm'; //<--Huh? Korrekt oder nicht?
}
...
char buf[10];
foo(buf);

Der Compiler kann,wenn er foo übersetzt nicht sehen,auf was array zeigt.

Zur Compilezeit lassen sich von allen diesen Fällen,die man sich ausdenken kann vielleicht 0.1 % erkennen.
Der denkbare Nachteil wäre,daß ein Programmierer sich darauf verlassen würde,daß sowas vom Compiler entdeckt wird,obwohl er nur einen kleinen Teil erkennen kann.

Prüfung zur Laufzeit wäre denkbar,ist aber mit Overhead verbunden.
Wer diesen Overhead in Kauf nehmen will kann ja gerne Container wie std::vector benutzen (at führt eine Bereichsprüfung durch),machen aber die wenigsten.

Es gibt aber auch Compiler,die für native Arrays eine Prüfung zur Laufzeit anbieten,die man zuschalten kann (tcc z.B.).
Ansonsten gilt aber für C und C++ Programme,die Zero-Overhead Doktrine.

tuxipuxi
07-08-2003, 16:13
ausserdem kannst du bei so etwas auch einen guten debugger fragen, der sollte dich auf so etwas aufmerksam machen.

Silver
08-08-2003, 08:35
Original geschrieben von tuxipuxi
ausserdem kannst du bei so etwas auch einen guten debugger fragen, der sollte dich auf so etwas aufmerksam machen.

dieser wäre? zb der gdb bzw. ddd?

anda_skoa
08-08-2003, 18:17
Valgrind kann sehr hilfreich sein, wenn man Speicherbenutzung kontrollieren will:
http://developer.kde.org/~sewardj/

Ciao,
_

nobody0
23-08-2003, 16:29
Mit Semantik-Checkern wie Splint (dazu gibt´s z. B. zwei Artikel im Linuxmagazin) findet man die meisten Fehler dieser Art.

Zur Laufzeit kann man Bereichsüberschreitungen mit efence als Fehlermeldung angezeigt bekommen.
Deshalb verwende ich zum Entwickeln diese Funktion in .profile:

# Funktion zum Kompilieren mit lefence u. zus. gdb-Informationen.
# Bsp.: "d bsp" kompiliert bsp.c und produziert bsp.
# Version von function c zum auffinden von Bereichsüberschreitungen (Segmentation faults).
# Benötigt: efence (Electric Fence). # -lvga -lz
function d {
gcc -O3 -D__SMP__ -D_REENTRANT -lm -lz -Wall -pedantic -ggdb -lefence -o $1 $1.c
}