2016-01-10 3 views
6

Ich habe meinen eigenen kleinen Perl-Debugger geschrieben, der für jede ausgeführte Zeile den aktuellen Dateinamen und die entsprechende Zeilennummer ausgibt. Wie kann ich feststellen, ob die aktuelle Perl-Anweisung fehlerhafte Daten enthält?Wie überprüft man, ob die aktuelle Perl-Anweisung fehlerhafte Daten enthält?

Ich weiß, es gibt eine Funktion "verdorben" aus dem Modul Scalar :: Util. Es akzeptiert jedoch nur einen Variablennamen als Parameter und keine Perl-Anweisung.

Ich habe Taint an eine lexikalische Variable angehängt, um es zu verfolgen. Wenn ich sehen kann, ob eine Aussage verdorben ist oder nicht, kann ich nur die Zeilen drucken, die meine verdorbene Variable enthalten. Hier ist meine Gewohnheit taint Skript:

Taint.pl

use strict; 
use warnings; 

use Taint::Runtime qw(taint_start taint); 
taint_start(); 

my $data = taint("abc"); --> interesting 
my $noise = "noise"; --> not interesting 
my $evil = $data . " evil"; --> interesting 

Debugger.pl

sub DB::DB{ 

    my($package, $filename, $line) = caller; 

    print $filename . ":" . $line . " "; 
    scalar <STDIN>; 

} 

1; 
+2

Ausnahme abfangen mit eval()? –

+0

Ich habe diesen Code gefunden, der eval verwendet, um die Ausnahme abzufangen, aber ich weiß nicht, wie ich eine Perl-Anweisung an ihn weiterleiten soll. lokale $ @; zurück! eval {eval ("#". substr (join ("", @_), 0, 0)); 1}; – Silence

+0

Was genau möchten Sie testen und warum können Sie keine Variable verwenden? –

Antwort

0

Wie in der POD Documentation for Taint::Runtime beschrieben ein Unter is_tainted genannt, die zurück true, wenn Sie einen fehlerhaften Wert übergeben und andernfalls falsch.

Sie wollen werden Ihre relevanten Verwendungs- Linie ändern, um diese Funktion zu importieren:

use Taint::Runtime qw(taint_start taint is_tainted);

In Ihrem Beispiel Taint.pl Skript, sobald dies geschehen ist, würde is_tainted($data) auf true bewerten, is_tainted($noise) wäre false, und is_tainted($evil) wäre wahr.

Wenn Sie einen komplexeren Ausdruck haben, um nach Unreinheit zu suchen, bewerten Sie ihn einfach in einen Skalar und wenn irgendwelche Eingaben zu dieser Bewertung verdorben sind, wird der Ausdruck und somit der Skalar ebenfalls als verdorben angesehen. Die Überprüfung, ob dieser Skalar verdorben ist, entspricht der Überprüfung des Ausdrucks. Wenn der Ausdruck einen Listenwert erzeugt, passt etwas wie "join" in einen Skalar, der ausreicht, um einen Fehler zu erkennen.

Verwandte Themen