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 = ) { - $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 (0 for unlimited) \n"; + print "usage: compiler_test (0 for unlimited) \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 = ) { 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";