File: //scripts.20110531.215904.25158/typocheck
#!/usr/bin/perl
my $line = 0;
open(SCRIPT,"<",$ARGV[0]);
while(<SCRIPT>) {
$line++;
if ($line == 1 && !/perl/) {
die "$ARGV[0] is missing #!/usr/bin/perl";
}
if (/safeclose/ && !/SafeFile/) {
print "SafeFile:: explicit missing at line ${line}: $_";
next();
}
if (/safeopen/ && !/SafeFile/) {
print "SafeFile:: explicit missing at line ${line}: $_";
next();
}
if (!/SafeFile/ && /[\s\t]+open[\s\t\(]+[\s\t]*([^\,]+)*[\s\t]*/) {
my $fd = $1;
if ($OPENFILE{$fd} ne "") {
print "File handle leak ($fd) on line ${line} opened on line $OPENFILE{$fd}: $_";
}
$OPENFILE{$fd} = $line;
}
if (!/SafeFile/ && /^open[\s\t\(]+[\s\t]*([^\,]+)*[\s\t]*/) {
my $fd = $1;
if ($OPENFILE{$fd} ne "") {
print "File handle leak ($fd) on line ${line} opened on line $OPENFILE{$fd}: $_";
}
$OPENFILE{$fd} = $line;
}
if (/(\S+)[\s\t]*\=[\s\t]*SafeFile::safeopen[\s\t]*\([\s\t]*([^\,]+)[\s\t]*/) {
my $lock = $1;
my $fd = $2;
if ($fd !~ /\\\*/) {
$fd = '\*' . $fd;
print "File Handle ${fd} not escaped in safeopen call line ${line}: $_";
}
$SAFEOPENFILE{$fd} = $line;
$SAFEOPENFILE{$fd}{$lock} = $line;
}
if (!/SafeFile/ && /close[\s\t]*\(*[\s\t]*([^\;)]+)*/) {
my $fd = $1;
if ($OPENFILE{$fd} eq "") {
print "Close called on filehandle $fd when not open at line ${line}: $_";
}
delete $OPENFILE{$fd};
}
if (/SafeFile::safeclose[\s\t]*\([\s\t]*([^\,]+)[\s\t]*\,[\s\t]*([^\)]+)/) {
my $fd = $1;
my $lock = $2;
if ($fd !~ /\\\*/) {
$fd = '\*' . $fd;
print "File Handle ${fd} not escaped in safeclose call line ${line}: $_";
}
if ($SAFEOPENFILE{$fd}{$lock} eq "") {
print "Lock var ${lock} mismatch for safeclose call at line ${line}: $_";
}
if ($SAFEOPENFILE{$fd} eq "") {
print "safeclose called on filehandle $fd when not open at line ${line}: $_";
}
delete $SAFEOPENFILE{$fd};
}
}
foreach my $fd (keys %SAFEOPENFILE) {
foreach my $lock (keys %{$SAFEOPENFILE{$fd}}) {
print "safeopen never closed for $fd ($lock) at line $SAFEOPENFILE{$fd}{$lock}\n";
}
}
foreach my $fd (keys %OPENFILE) {
print "open never closed for $fd at line $OPENFILE{$fd}\n";
}