PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Fehler bei dynamisch typisierten Sprachen finden


rotalever
2008-09-10, 14:37:25
Wenn ich in C sowas schreibe:

int test;
test = 3;
test = 4;
test = 5;
tesst = 6;

bekomme ich einen Fehler ausgespuckt, weil ich mich beim letzten "test" verschrieben habe. Bei Scriptsprachen wie z.B. PHP würde ich keinen Fehler bekommen, weil test nicht deklariert wurde. Der Fehler würde möglicherweise unentdeckt sein. Es besteht leider immer eine gewisse Wahrscheinlichkeit, dass man mal so etwas übersieht. Gibt es irgendwelche Programme (insb. für PHP), die einem bei der Fehlersuche behilflich sein können?

Man könnte zum Beispiel die Häufigkeit der einzelnen Variablennamen automatisch untersuchen. Wenn ich also 20x"test" habe und 1x"tesst", dann könnte das Programm einen Warnung ausgeben, dass man mal nachschaut.

Coda
2008-09-10, 15:12:32
Mir ist nichts bekannt. Eine Möglichkeit ist aber Unit-Tests zu schreiben damit sowas sofort auffällt. Das ist eh generell eine gute Idee.

samm
2008-09-10, 15:21:07
Hilft in Bezug auf PHP dieser kleine Text zu expliziter Variablendeklaration (http://www.faqts.com/knowledge_base/view.phtml/aid/725) vielleicht? Andererseits spiegelt das nicht die mir bekannte Funktionalität von E_STRICT wieder.

Bei VB(Script?) kannst du Option Explicit setzen, dann musst du alle Variablen mit Dim deklarieren.

darph
2008-09-10, 15:23:50
Man könnte zum Beispiel die Häufigkeit der einzelnen Variablennamen automatisch untersuchen. Wenn ich also 20x"test" habe und 1x"tesst", dann könnte das Programm einen Warnung ausgeben, dass man mal nachschaut.
Also PHP gibt bei nichtdeklarierten Variablen eine Warnung aus und deklariert sie danach.

Leider ist PHP meist so konfiguriert, daß die Warnungen unterdrückt sind. Da sind sie aber.

€dit: Ja, E_STRICT, wie oben beschrieben.

rotalever
2008-09-10, 15:26:38
Also PHP gibt bei nichtdeklarierten Variablen eine Warnung aus und deklariert sie danach.

Leider ist PHP meist so konfiguriert, daß die Warnungen unterdrückt sind. Da sind sie aber.

€dit: Ja, E_STRICT, wie oben beschrieben.

Wusste ich noch gar nicht. Das heißt, man kann in PHP alle Variablen explizit deklarieren? Also

int test;
string bla;
...

? Das geht irgendwie nicht.

darph
2008-09-10, 15:56:41
gha. Ich hab dich falsch verstanden. Es ging mit darum, ob eine Variable überhaupt gesetzt ist, nicht um die Typisierung. Mein Fehler.

Typen erzwingen kannst du nur bei Methodensignaturen.

public function setUser(User $user) {
$this->user = $user;
}

Funktioniert aber nur mit Klassen.

rotalever
2008-09-10, 16:01:22
Ja ich habe mich auch wenig missverständlich ausgedrückt...

Trap
2008-09-10, 16:13:19
Dein Beispiel hat 2 Komponenten:
a) tesst=6 wird unnötigerweise ausgeführt
b) test=6 wird nicht ausgeführt

Den fehlenden nötigen Code wird man bei vollständigem Funktionstest oder Programm-Verifikation sofort entdecken. Den zusätzlichen unnötigen Code zu entdecken ist dead code removal, das machen die meisten Compiler sowieso.

Wenn man davon ausgeht, dass die Fehler immer aus beiden teilen bestehen, würde ein dead code Suchtool reichen. Ein Funktionstest oder eine Programmverifikation würde aber noch mehr Fehler finden (allerdings bei deutlich höherem Aufwand).

Coda
2008-09-10, 17:01:35
Den zusätzlichen unnötigen Code zu entdecken ist dead code removal, das machen die meisten Compiler sowieso.
Wir reden von PHP Trap :biggrin:

Marscel
2008-09-10, 17:18:36
Entweder E_STRICT, das undefined variables findet oder eine gängige IDE wie z.B. Eclipse.

rotalever
2008-09-10, 21:41:46
Okay E_STRICT bringt schon mal was. Zwar nicht direkt das was ich gesucht habe, aber durchaus nützlich.

Scheinbar scheint es so ein einfaches Analyseprogramm von Variablen nicht zu geben. Und dafür extra eine IDE benutzen - das geht zu weit ;)

Ich werd mir jetzt wohl einfach ein kleines Script schreiben, dass die Variablen aus einem PHP-Script extrahiert und dann eine Statistik erstellt. Da kann man dann ja mit einem Blick sehen, wenn was außer der Reihe tanzt. Dankbarer Weise fangen ja auch alle PHP-Variablen mit $ an. Da sollte sich das Parsen recht einfach gestalten :smile: