slackbuilds_ponce/development/csmith/compiler_test.diff
B. Watson 49853566bb
development/csmith: Added (generates random C programs).
Signed-off-by: Willy Sudiarto Raharjo <willysr@slackbuilds.org>
2023-06-17 07:52:18 +07:00

320 lines
11 KiB
Diff

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";