diff options
Diffstat (limited to 'development/csmith/compiler_test.diff')
-rw-r--r-- | development/csmith/compiler_test.diff | 320 |
1 files changed, 320 insertions, 0 deletions
diff --git a/development/csmith/compiler_test.diff b/development/csmith/compiler_test.diff new file mode 100644 index 0000000000..5351e2f4c3 --- /dev/null +++ b/development/csmith/compiler_test.diff @@ -0,0 +1,320 @@ +diff -Naur csmith-csmith-2.3.0/scripts/compiler_test.pl csmith-csmith-2.3.0.patched/scripts/compiler_test.pl +--- csmith-csmith-2.3.0/scripts/compiler_test.pl 2017-06-21 16:50:24.000000000 -0400 ++++ csmith-csmith-2.3.0.patched/scripts/compiler_test.pl 2023-06-10 17:08:54.342868470 -0400 +@@ -29,7 +29,7 @@ + + ################################################################# + +-use strict; ++use strict; + use File::stat; + + ################################################################# +@@ -39,7 +39,7 @@ + my $MIN_PROGRAM_SIZE = 8000; + + # kill Csmith after this many seconds +-my $CSMITH_TIMEOUT = 90; ++my $CSMITH_TIMEOUT = 90; + + # kill a compiler after this many seconds + my $COMPILER_TIMEOUT = 120; +@@ -48,7 +48,7 @@ + my $PROG_TIMEOUT = 8; + + # extra options here +-my $CSMITH_USER_OPTIONS = " --bitfields --packed-struct"; ++my $CSMITH_USER_OPTIONS = " --bitfields --packed-struct"; + + ################# end user-configurable stuff ################### + ################################################################# +@@ -56,7 +56,7 @@ + ################################################################# + # TODO + # +-# - make it easy to plugin an emulator for testing embedded compilers ++# - make it easy to plugin an emulator for testing embedded compilers + # - automatically fire up a reducer when a bug is found + # - support "reference compilers" that supply checksums but that we're + # not testing +@@ -66,14 +66,13 @@ + + my $RUN_PROGRAM = 0; + +-my $CSMITH_HOME = $ENV{"CSMITH_HOME"}; +-my $good = 0; ++my $good = 0; + my $crash_bug = 0; + my $wrongcode_bug = 0; + my $csmith_bug = 0; + +-my $HEADER = "-I$CSMITH_HOME/runtime"; +-my $CYGWIN_HEADER = "-I`cygpath -d ${CSMITH_HOME}/runtime`"; ++my $HEADER = "-I/usr/include/csmith"; ++my $CYGWIN_HEADER = "-I`cygpath -d /usr/include/csmith`"; + my $COMPILE_OPTIONS = ""; + my @COMPILERS; + +@@ -81,11 +80,11 @@ + my ($fn, $match) = @_; + open INF, "<$fn" or die; + while (my $line = <INF>) { +- $line =~ s/\r?\n?$//; # get rid of LF/CR ++ $line =~ s/\r?\n?$//; # get rid of LF/CR + if ($line =~ /$match/) { + close INF; + return $1; +- } ++ } + } + close INF; + return ""; +@@ -100,14 +99,14 @@ + + # properly parse the return value from system() + sub runit ($$$) { +- my ($cmd, $timeout, $out) = @_; ++ my ($cmd, $timeout, $out) = @_; + my $res; + if ($RUN_PROGRAM) { + $res = system "timeout $timeout $cmd > $out 2>&1"; + } else { + $res = system "$cmd > $out 2>&1"; + } +- my $success = 0; ++ my $success = 0; + if ($? == -1) { + print "can't execute $cmd\n"; + } +@@ -129,36 +128,36 @@ + } + + # compile a program and execute +-# return code 0: normal; +-# 1: compiler crashes; +-# 2: compiler hangs; +-# 3: executable crashes; ++# return code 0: normal; ++# 1: compiler crashes; ++# 2: compiler hangs; ++# 3: executable crashes; + # 4: executable hangs + sub compile_and_run($$$$) { +- my ($compiler, $src_file, $exe, $out) = @_; +- my $command = "$compiler $src_file $COMPILE_OPTIONS $HEADER -o $exe"; ++ my ($compiler, $src_file, $exe, $out) = @_; ++ my $command = "$compiler $src_file $COMPILE_OPTIONS $HEADER -o $exe"; + + my @a = split(" ", $compiler); + # special treatment of MS compiler: convert header path to unix-style + if ($a[0] =~ /cl$/) { +- $command = "$compiler $src_file $COMPILE_OPTIONS $CYGWIN_HEADER -o $exe"; +- } ++ $command = "$compiler $src_file $COMPILE_OPTIONS $CYGWIN_HEADER -o $exe"; ++ } + + # compile random program +- my ($res, $exit_value) = runit($command, $COMPILER_TIMEOUT, "compiler.out"); ++ my ($res, $exit_value) = runit($command, $COMPILER_TIMEOUT, "compiler.out"); + # print "after run compiler: $res, $exit_value\n"; + if (($res == 0) || (!(-e $exe))) { + # exit code 124 means time out +- return ($exit_value == 124 ? 2 : 1); ++ return ($exit_value == 124 ? 2 : 1); + } + +- # run random program ++ # run random program + if ($RUN_PROGRAM) { + ($res, $exit_value) = runit("./$exe", $PROG_TIMEOUT, $out); + # print "after run program: $res, $exit_value\n"; + if (($res == 0) || (!(-e $out))) { + # exit code 124 means time out +- return ($exit_value == 124 ? 4 : 3); ++ return ($exit_value == 124 ? 4 : 3); + } + } + return 0; +@@ -169,35 +168,35 @@ + # -1: hangs (not interesting) + # 0: normal, but found no compiler error (not interesting) + # 1: found compiler crash error(s) +-# 2: found compiler wrong code error(s) ++# 2: found compiler wrong code error(s) + sub evaluate_program ($) { +- my ($test_file) = @_; ++ my ($test_file) = @_; + my @checksums; +- my @tested_compilers; ++ my @tested_compilers; + my $interesting = 0; +- my $i = 0; +- foreach my $compiler (@COMPILERS) { ++ my $i = 0; ++ foreach my $compiler (@COMPILERS) { + my $out = "out$i.log"; + my $exe = "a.out$i"; +- $i++; ++ $i++; + my $res = compile_and_run($compiler, $test_file, $exe, $out); + + if ($res) { +- if ($res == 1 || $res == 2) { +- write_bug_desc_to_file($test_file, +- "Compiler error! Can't compile with $compiler $COMPILE_OPTIONS $HEADER"); ++ if ($res == 1 || $res == 2) { ++ write_bug_desc_to_file($test_file, ++ "Compiler error! Can't compile with $compiler $COMPILE_OPTIONS $HEADER"); + $interesting = 1; + } +- elsif ($res == 3) { +- write_bug_desc_to_file($test_file, "random program crashed!"); ++ elsif ($res == 3) { ++ write_bug_desc_to_file($test_file, "random program crashed!"); + # random program crashes, a likely wrong-code bug, but + # can't rule out the probablity of a Csmith bug +- $interesting = -2; ++ $interesting = -2; + last; + } else { +- print "random program hangs!\n"; ++ print "random program hangs!\n"; + # program hangs, not interesting +- $interesting = -1; ++ $interesting = -1; + last; + } + } +@@ -205,23 +204,23 @@ + if ($RUN_PROGRAM) { + die "cannot find $out.\n" if (!(-e $out)); + my $sum = read_value_from_file($out, "checksum = (.*)"); +- $interesting = 2 if +- (scalar(@checksums) > 0 && $sum ne $checksums[0]); ++ $interesting = 2 if ++ (scalar(@checksums) > 0 && $sum ne $checksums[0]); + push @checksums, $sum; + push @tested_compilers, "$compiler $COMPILE_OPTIONS"; +- } ++ } + } +- } ++ } + if ($interesting >= 1) { +- if ($interesting == 2) { +- write_bug_desc_to_file ($test_file, +- "Found checksum difference between compiler implementations"); ++ if ($interesting == 2) { ++ write_bug_desc_to_file ($test_file, ++ "Found checksum difference between compiler implementations"); + for (my $i=0; $i < scalar (@checksums); $i++) { +- write_bug_desc_to_file ($test_file, ++ write_bug_desc_to_file ($test_file, + "$tested_compilers[$i]: $checksums[$i]"); + } + } +- write_bug_desc_to_file($test_file, ++ write_bug_desc_to_file($test_file, + "please refer to http://embed.cs.utah.edu/csmith/using.html on how to report a bug"); + } + system "rm -f out*.log a.out* test*.obj compiler.out csmith.out"; +@@ -237,30 +236,30 @@ + # run Csmith until generate a big enough program + while (1) { + unlink $cfile; +- my $cmd = "$CSMITH_HOME/src/csmith $CSMITH_USER_OPTIONS --output $cfile"; +- my ($res, $exitcode) = runit($cmd, $CSMITH_TIMEOUT, "csmith.out"); ++ my $cmd = "csmith $CSMITH_USER_OPTIONS --output $cfile"; ++ my ($res, $exitcode) = runit($cmd, $CSMITH_TIMEOUT, "csmith.out"); + # print "after run csmith: $res, $exitcode\n"; +- +- $seed = read_value_from_file($cfile, "Seed:\\s+([0-9]+)"); +- die "Random program $cfile has no seed information!\n" if (!$seed); ++ ++ $seed = read_value_from_file($cfile, "Seed:\\s+([0-9]+)"); ++ die "Random program $cfile has no seed information!\n" if (!$seed); + + if ($res == 0) { + print "CSMITH BUG FOUND: number $csmith_bug\n"; + $csmith_bug++; +- system "cp $cfile csmith_bug_${csmith_bug}.c"; +- next; ++ system "cp $cfile csmith_bug_${csmith_bug}.c"; ++ next; + } +- else { ++ else { + $filesize = stat("$cfile")->size; +- # print "$cfile is $filesize bytes\n"; ++ # print "$cfile is $filesize bytes\n"; + last if ($filesize >= $MIN_PROGRAM_SIZE); + } + } + + print "seed= $seed, size= $filesize\n"; +- ++ + # test if the random program is interesting +- my $ret = evaluate_program($cfile); ++ my $ret = evaluate_program($cfile); + if ($ret >= 0) { + $good++; + print "GOOD PROGRAM: number $good\n"; +@@ -273,27 +272,21 @@ + print "LIKELY WRONG CODE ERROR FOUND: number $wrongcode_bug\n"; + $wrongcode_bug++; + system "cp $cfile wrong${wrongcode_bug}.c"; +- } +- } else { ++ } ++ } else { + print "BAD PROGRAM: doesn't count towards goal.\n"; +- } ++ } + unlink $cfile; + return $ret; + } + + sub usage () { +- print "usage: compiler_test.pl <test_case_count>(0 for unlimited) <config-file>\n"; ++ print "usage: compiler_test <test_case_count>(0 for unlimited) <config-file>\n"; + exit -1; + } + + ########################### main ################################## + +-if (!(-f "$CSMITH_HOME/runtime/csmith.h")) { +- print "Please point the environment variable CSMITH_HOME to the top-level\n"; +- print "directory of your Csmith tree before running this script.\n"; +- exit(-1); +-} +- + my $nargs = scalar(@ARGV); + + if ($nargs == 2) { +@@ -323,12 +316,12 @@ + open INF, "<$infile" or die "Cannot read configuration file ${infile}.\n"; + while (my $line = <INF>) { + chomp $line; +- if ($line && !($line =~ /^\s*#/)) { +- my $res = system ("echo \"int main() { return 0;}\" > foo.c ; $line foo.c > /dev/null 2>&1"); ++ if ($line && !($line =~ /^\s*#/)) { ++ my $res = system ("echo \"int main() { return 0;}\" > foo.c ; $line foo.c > /dev/null 2>&1"); + unlink "foo.c", "a.out"; +- die "cannot execute compiler $line\n" if ($res); ++ die "cannot execute compiler $line\n" if ($res); + push @COMPILERS, $line; +- } ++ } + } + close INF; + +@@ -339,7 +332,7 @@ + $i++; + } + print "\n"; +-} ++} + + print "Total csmith errors found: $csmith_bug\n"; + print "Total crash errors found: $crash_bug\n"; |