var-checker 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. #!/usr/bin/perl
  2. # This script checks the *.c files for extraneous "extern" variables,
  3. # for vars that are defined but not used, and for inconsistent array
  4. # sizes. Run it from inside the main rsync directory.
  5. use strict;
  6. use warnings;
  7. my %add_syscall_c = map { $_ => 1 } qw( t_stub.c t_unsafe.c tls.c trimslash.c );
  8. my %add_compat_c = map { $_ => 1 } qw( t_stub.c tls.c trimslash.c wildtest.c );
  9. my %add_util_c = map { $_ => 1 } qw( t_stub.c t_unsafe.c );
  10. my %sizes;
  11. open(IN, '<', 'syscall.c') or die $!;
  12. undef $/; my $syscall_c = <IN>; $/ = "\n";
  13. close IN;
  14. $syscall_c =~ s/^extern\s.*//mg;
  15. open(IN, '<', 'lib/compat.c') or die $!;
  16. undef $/; my $compat_c = <IN>; $/ = "\n";
  17. close IN;
  18. $compat_c =~ s/^extern\s.*//mg;
  19. open(IN, '<', 'util.c') or die $!;
  20. undef $/; my $util_c = <IN>; $/ = "\n";
  21. close IN;
  22. $util_c =~ s/^extern\s.*//mg;
  23. my @files = glob('*.c');
  24. foreach my $fn (@files) {
  25. open(IN, '<', $fn) or die $!;
  26. undef $/; $_ = <IN>; $/ = "\n";
  27. close IN;
  28. my @vars = /^(?!(?:extern|enum)\s)([a-zA-Z]\S*\s+.*);/mg;
  29. my @externs = /^extern\s+(.*);/mg;
  30. $_ .= $syscall_c if $add_syscall_c{$fn};
  31. $_ .= $compat_c if $add_compat_c{$fn};
  32. $_ .= $util_c if $add_util_c{$fn};
  33. s/INFO_GTE/info_levels/g;
  34. s/DEBUG_GTE/debug_levels/g;
  35. check_vars($fn, 'var', @vars);
  36. check_vars($fn, 'extern', @externs);
  37. }
  38. exit;
  39. # The file's contents are in $_.
  40. sub check_vars
  41. {
  42. my $fn = shift;
  43. my $type = shift;
  44. foreach my $line (@_) {
  45. $line =~ s/\s*\{.*\}//;
  46. $line =~ s/\s*\(.*\)//;
  47. foreach my $item (split(/\s*,\s*/, $line)) {
  48. $item =~ s/\s*=.*//;
  49. my $sz = $item =~ s/(\[.*?\])// ? $1 : '';
  50. my($var) = $item =~ /([^*\s]+)$/;
  51. if (!defined $var) {
  52. print "Bogus match? ($item)\n";
  53. next;
  54. }
  55. if ($sz) {
  56. if (defined $sizes{$var}) {
  57. if ($sizes{$var} ne $sz) {
  58. print $fn, ' has inconsistent size for "', $var,
  59. "\": $sizes{$var} vs $sz\n";
  60. }
  61. } else {
  62. $sizes{$var} = $sz;
  63. }
  64. }
  65. my @matches = /(?<!\sstruct )\b(\Q$var\E)(?!\w)/g;
  66. push(@matches, /(\QSIGACTION(\E)/g) if $var eq 'sigact';
  67. print $fn, " has extraneous $type: \"", $var, "\"\n" if @matches == 1;
  68. }
  69. }
  70. }