diff options
| author | Avra Sengupta <asengupt@redhat.com> | 2014-07-14 13:07:08 +0000 | 
|---|---|---|
| committer | Krishnan Parthasarathi <kparthas@redhat.com> | 2014-07-21 10:26:20 -0700 | 
| commit | f6ddb4675c096dc81420ed84fb2a6fefa9fea563 (patch) | |
| tree | f30bc40d63483a62da05c98d723b3a8bcdfbb468 /extras/check_goto.pl | |
| parent | 5b8de971a4b81bc2bd6de0ffc6386587226295c6 (diff) | |
gluster: Fix the recursive goto outs in the source code.
Added a script check_goto.pl, that when run from
the source code root, will scan all .c files to match
the following pattern:
label:
        if (condition)
            goto label;
On finding such a pattern the script will print the file name
and the line number. There are certain cases where the above
recursive pattern is intended. Hence adding those labels to
ignore-labels. Thanks Vijaikumar Mallikarjuna for the perl
script.
Also fixed all such existing errors
Change-Id: I1b821d0a8c296f16e40faff20bd029bdc880c2e9
BUG: 1119256
Signed-off-by: Vijaikumar Mallikarjuna <vmallika@redhat.com>
Signed-off-by: Avra Sengupta <asengupt@redhat.com>
Reviewed-on: http://review.gluster.org/8307
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Jeff Darcy <jdarcy@redhat.com>
Reviewed-by: Krishnan Parthasarathi <kparthas@redhat.com>
Tested-by: Krishnan Parthasarathi <kparthas@redhat.com>
Diffstat (limited to 'extras/check_goto.pl')
| -rwxr-xr-x | extras/check_goto.pl | 45 | 
1 files changed, 45 insertions, 0 deletions
diff --git a/extras/check_goto.pl b/extras/check_goto.pl new file mode 100755 index 00000000000..fa71bfc6683 --- /dev/null +++ b/extras/check_goto.pl @@ -0,0 +1,45 @@ +#!/usr/bin/env perl + +use strict; +use warnings; + +my @ignore_labels = qw (TODO retry fetch_data again try_again sp_state_read_proghdr redo disabled_loop fd_alloc_try_again); +my @ignore_files  = qw (y.tab.c lex.c); +my @c_files; +my $line; +my @labels; +my $in_comments; + +{ +        local $" = "|"; +        my $cmd = "find . -type f -name '*.c' | grep -vE '(@ignore_files)'"; +        @c_files = `$cmd`; +} + +foreach my $file (@c_files) { +        chomp ($file); +        open FD, $file or die ("Failed to read file $file: $!"); +        @labels = (); +        $in_comments = 0; +        while ($line = <FD>) { +                chomp ($line); + +                next if $line =~ /^\s*(#|\/\/)/; +                $in_comments = 1 if ($line =~ /\/\*/); +                $in_comments = 0 if ($line =~ /\*\//); + +                next if $in_comments; +                if ($line =~ /^\s*(([a-zA-Z]|_)\w*)\s*:/) { +                        push (@labels, $1) unless grep (/$1/, @ignore_labels); +                } +                @labels = () if $line =~ /^}/; + +                next unless @labels; +                if ($line =~ /^\s*goto\s*(\w+)/) { +                        print "$file:$.: $line\n" if grep /^$1$/, @labels; +                } +        } + +        close FD; +} +  | 
