rosenberg: handle bit fields better
[smatch.git] / smatch_scripts / new_bugs.pl
blobfbcbfa8e08b49b26d9e5cf4476c3c0fcb075f36e
1 #!/usr/bin/perl
3 use strict;
5 my $store = 0;
6 my $unstore = 0;
7 my $warns_file = shift;
8 if ($warns_file =~ /--store/) {
9 $store = 1;
10 $warns_file = shift;
12 if ($warns_file =~ /--unstore/) {
13 $unstore = 1;
14 $warns_file = shift;
17 my $du = `du $warns_file`;
18 $du =~ s/([0-9]+).*/$1/;
19 $du =~ s/\n//;
21 if (int($du) > 100000) {
22 print "$warns_file is too big\n";
23 exit(1);
26 open(WARNS, $warns_file);
28 my ($orig, $file, $line, $msg);
29 while (<WARNS>) {
31 if (!($_ =~ /(error|warn|info)/)) {
32 next;
35 $orig = $_;
36 ($file, $line, $msg) = split(/[: ]/, $_, 3);
38 $msg =~ s/^.*?:\d+(|:\d+:) .*? //;
39 $msg =~ s/[us](16|32|64)(min|max)//g;
40 $msg =~ s/[01234567890]//g;
41 if ($msg =~ /can't/) {
42 $msg =~ s/(.*can't.*').*?('.*)/$1 $2/;
43 } elsif ($msg =~ /don't/) {
44 $msg =~ s/(.*don't.*').*?('.*)/$1 $2/;
45 } else {
46 $msg =~ s/'.*?'/''/g;
48 $msg =~ s/,//g;
49 $msg =~ s/\(\w+ returns null\)/(... returns null)/;
50 $msg =~ s/dma on the stack \(.*?\)/dma on the stack (...)/;
51 $msg =~ s/possible ERR_PTR '' to .*/possible ERR_PTR '' to .../;
52 $msg =~ s/inconsistent returns ([^ ]+?) locked \(\)/inconsistent returns ... locked ()/;
53 $msg =~ s/(.*) [^ ]* (too large for) [^ ]+ (.*)/$1 $2 $3/;
54 $msg =~ s/\n//;
55 $msg =~ s/ /_/g;
56 $msg =~ s/[\(\)]//g;
58 $file =~ s/\//./g;
59 $msg =~ s/\//./g;
61 if ($store) {
62 unless(-e "old_warnings/" or mkdir "old_warnings/") {
63 die "Unable to create old_warnings/";
65 open(TMP, '>', "old_warnings/$file.$msg") or
66 die "Error opening: old_warnings/$file.$msg\n";
67 close(TMP);
68 next;
71 if ($unstore) {
72 unlink("old_warnings/$file.$msg") and
73 print "removed: old_warnings/$file.$msg\n";
74 next;
77 unless (-e "old_warnings/$file.$msg") {
78 print "$orig";
82 close(WARNS);