1 #!/usr/bin/perl 2 3 # This script is supposed to help use the param_mapper output. 4 # Give it a function and parameter and it lists the functions 5 # and parameters which are basically equivalent. 6 7 use strict; 8 9 sub usage() 10 { 11 print ("trace_params.pl <smatch output file> <function> <parameter>\n"); 12 exit(1); 13 } 14 15 my %param_map; 16 17 my $UNKNOWN = 1; 18 my $NOTFOUND = 2; 19 my $FOUND = 3; 20 21 sub recurse($$) 22 { 23 my $link = shift; 24 my $target = shift; 25 my $found = 0; 26 27 if ($link =~ /$target/) { 28 $param_map{$link}->{found} = $FOUND; 29 return 1; 30 } 31 32 if ($param_map{$link}->{found} == $FOUND) { 33 return 1; 34 } 35 if ($param_map{$link}->{found} == $NOTFOUND) { 36 return 0; 37 } 38 39 $param_map{$link}->{found} = $NOTFOUND; 40 foreach my $l (@{$param_map{$link}->{links}}){ 41 $found = recurse($l, $target); 42 if ($found) { 43 $param_map{$link}->{found} = $FOUND; 44 return 1; 45 } 46 } 47 48 return 0; 49 } 50 51 sub compress_all($$) 52 { 53 my $f = shift; 54 my $p = shift; 55 my $target = "$f%$p"; 56 57 foreach my $link (keys %param_map){ 58 recurse($link, $target); 59 } 60 } 61 62 sub add_link($$) 63 { 64 my $one = shift; 65 my $two = shift; 66 67 if (!defined($param_map{$one})) { 68 $param_map{$one} = {found => $UNKNOWN, links => []}; 69 } 70 push @{$param_map{$one}->{links}}, $two; 71 } 72 73 sub load_all($) 74 { 75 my $file = shift; 76 77 open(FILE, "<$file"); 78 while (<FILE>) { 79 if (/.*?:\d+ (.*?)\(\) info: param_mapper (\d+) => (.*?) (\d+)/) { 80 add_link("$1%$2", "$3%$4"); 81 } 82 } 83 } 84 85 sub print_found() 86 { 87 foreach my $func (keys %param_map){ 88 my $tmp = $param_map{$func}; 89 90 if ($tmp->{found} == $FOUND) { 91 my ($f, $p) = split(/%/, $func); 92 print("$f $p\n"); 93 } 94 } 95 } 96 97 my $file = shift(); 98 my $func = shift(); 99 my $param = shift(); 100 101 if (!$file or !$func or !defined($param)) { 102 usage(); 103 } 104 105 if (! -e $file) { 106 printf("Error: $file does not exist.\n"); 107 exit(1); 108 } 109 110 load_all($file); 111 compress_all($func, $param); 112 print_found();