blob: 53d9b8de1d059904c039653ee3217a29157f3d1a (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
|
#!/usr/bin/env perl
$usage = "Usage:
fuzzer-find-diff.pl reference_binary new_binary [number_of_tests_to_run]
The first two input arguments are the commands to run the test programs
based on fuzzer_test_main() function from 'util.c' (preferably they should
be statically compiled, this can be achieved via '--disable-shared' pixman
configure option). The third optional argument is the number of test rounds
to run (if not specified, then testing runs infinitely or until some problem
is detected).
Usage examples:
fuzzer-find-diff.pl ./blitters-test-with-sse-disabled ./blitters-test 9000000
fuzzer-find-diff.pl ./blitters-test \"ssh ppc64_host /path/to/blitters-test\"
";
$#ARGV >= 1 or die $usage;
$batch_size = 10000;
if ($#ARGV >= 2) {
$number_of_tests = int($ARGV[2]);
} else {
$number_of_tests = -1
}
sub test_range {
my $min = shift;
my $max = shift;
if (`$ARGV[0] $min $max 2>/dev/null` eq `$ARGV[1] $min $max 2>/dev/null`) {
return;
}
while ($max != $min + 1) {
my $avg = int(($min + $max) / 2);
my $res1 = `$ARGV[0] $min $avg 2>/dev/null`;
my $res2 = `$ARGV[1] $min $avg 2>/dev/null`;
if ($res1 ne $res2) {
$max = $avg;
} else {
$min = $avg;
}
}
return $max;
}
$base = 1;
while ($number_of_tests <= 0 || $base <= $number_of_tests) {
printf("testing %-12d\r", $base + $batch_size - 1);
my $res = test_range($base, $base + $batch_size - 1);
if ($res) {
printf("Failure: results are different for test %d:\n", $res);
printf("\n-- ref --\n");
print `$ARGV[0] $res`;
printf("-- new --\n");
print `$ARGV[1] $res`;
printf("The problematic conditions can be reproduced by running:\n");
printf("$ARGV[1] %d\n", $res);
exit(1);
}
$base += $batch_size;
}
printf("Success: %d tests finished\n", $base - 1);
|