mirror of
https://github.com/Ponce/slackbuilds
synced 2024-11-16 19:50:19 +01:00
49853566bb
Signed-off-by: Willy Sudiarto Raharjo <willysr@slackbuilds.org>
320 lines
11 KiB
Diff
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";
|