Unverified Commit 2e496108 authored by Daniel Stenberg's avatar Daniel Stenberg
Browse files

checksrc: ban snprintf use, add command line flag to override warns

parent dcd6f810
Loading
Loading
Loading
Loading
+27 −0
Original line number Diff line number Diff line
@@ -35,6 +35,7 @@ my $suppressed; # whitelisted problems
my $file;
my $dir=".";
my $wlist="";
my @alist;
my $windows_os = $^O eq 'MSWin32' || $^O eq 'msys' || $^O eq 'cygwin';
my $verbose;
my %whitelist;
@@ -74,6 +75,7 @@ my %warnings = (
    'SEMINOSPACE'      => 'semicolon without following space',
    'MULTISPACE'       => 'multiple spaces used when not suitable',
    'SIZEOFNOPAREN'    => 'use of sizeof without parentheses',
    'SNPRINTF'         => 'use of snprintf',
    );

sub readwhitelist {
@@ -153,6 +155,11 @@ while(1) {
        $file = shift @ARGV;
        next;
    }
    elsif($file =~ /-A(.+)/) {
        push @alist, $1;
        $file = shift @ARGV;
        next;
    }
    elsif($file =~ /-i([1-9])/) {
        $indent = $1 + 0;
        $file = shift @ARGV;
@@ -174,6 +181,7 @@ while(1) {
if(!$file) {
    print "checksrc.pl [option] <file1> [file2] ...\n";
    print " Options:\n";
    print "  -A[rule]  Accept this violation, can be used multiple times\n";
    print "  -D[DIR]   Directory to prepend file names\n";
    print "  -h        Show help output\n";
    print "  -W[file]  Whitelist the given file - ignore all its flaws\n";
@@ -198,6 +206,17 @@ do {

} while($file);

sub accept_violations {
    for my $r (@alist) {
        if(!$warnings{$r}) {
            print "'$r' is not a warning to accept!\n";
            exit;
        }
        $ignore{$r}=999999;
        $ignore_used{$r}=0;
    }
}

sub checksrc_clear {
    undef %ignore;
    undef %ignore_set;
@@ -297,6 +316,7 @@ sub scanfile {
    my $incomment=0;
    my $copyright=0;
    checksrc_clear(); # for file based ignores
    accept_violations();

    while(<R>) {
        $windows_os ? $_ =~ s/\r?\n$// : chomp;
@@ -511,6 +531,13 @@ sub scanfile {
                      "use of $2 is banned");
        }

        # scan for use of snprintf for curl-internals reasons
        if($l =~ /^(.*\W)(v?snprintf)\s*\(/x) {
            checkwarn("SNPRINTF",
                      $line, length($1), $file, $ol,
                      "use of $2 is banned");
        }

        # scan for use of non-binary fopen without the macro
        if($l =~ /^(.*\W)fopen\s*\([^,]*, *\"([^"]*)/) {
            my $mode = $2;