1
1
#!/usr/bin/env python3
2
2
"""Calls C-Reduce to create a minimal reproducer for clang crashes.
3
+ Unknown arguments are treated at creduce options.
3
4
4
5
Output files:
5
6
*.reduced.sh -- crash reproducer with minimal arguments
@@ -70,7 +71,7 @@ def write_to_script(text, filename):
70
71
71
72
72
73
class Reduce (object ):
73
- def __init__ (self , crash_script , file_to_reduce , core_number ):
74
+ def __init__ (self , crash_script , file_to_reduce , creduce_flags ):
74
75
crash_script_name , crash_script_ext = os .path .splitext (crash_script )
75
76
file_reduce_name , file_reduce_ext = os .path .splitext (file_to_reduce )
76
77
@@ -83,8 +84,7 @@ def __init__(self, crash_script, file_to_reduce, core_number):
83
84
self .clang_args = []
84
85
self .expected_output = []
85
86
self .needs_stack_trace = False
86
- self .creduce_flags = ["--tidy" ]
87
- self .creduce_flags = ["--n" , str (core_number )]
87
+ self .creduce_flags = ["--tidy" ] + creduce_flags
88
88
89
89
self .read_clang_args (crash_script , file_to_reduce )
90
90
self .read_expected_output ()
@@ -412,13 +412,13 @@ def reduce_clang_args(self):
412
412
print ("Reduced command:" , reduced_cmd )
413
413
414
414
def run_creduce (self ):
415
+ full_creduce_cmd = (
416
+ [creduce_cmd ] + self .creduce_flags + [self .testfile , self .file_to_reduce ]
417
+ )
415
418
print ("\n Running C-Reduce..." )
419
+ verbose_print (quote_cmd (full_creduce_cmd ))
416
420
try :
417
- p = subprocess .Popen (
418
- [creduce_cmd ]
419
- + self .creduce_flags
420
- + [self .testfile , self .file_to_reduce ]
421
- )
421
+ p = subprocess .Popen (full_creduce_cmd )
422
422
p .communicate ()
423
423
except KeyboardInterrupt :
424
424
# Hack to kill C-Reduce because it jumps into its own pgid
@@ -458,26 +458,20 @@ def main():
458
458
help = "The path to the `creduce` executable. "
459
459
"Required if `creduce` is not in PATH environment." ,
460
460
)
461
- parser .add_argument (
462
- "--n" ,
463
- dest = "core_number" ,
464
- type = int ,
465
- default = max (4 , multiprocessing .cpu_count () // 2 ),
466
- help = "Number of cores to use." ,
467
- )
468
461
parser .add_argument ("-v" , "--verbose" , action = "store_true" )
469
- args = parser .parse_args ()
470
-
462
+ args , creduce_flags = parser .parse_known_args ()
471
463
verbose = args .verbose
472
464
llvm_bin = os .path .abspath (args .llvm_bin ) if args .llvm_bin else None
473
465
creduce_cmd = check_cmd ("creduce" , None , args .creduce )
474
466
clang_cmd = check_cmd ("clang" , llvm_bin , args .clang )
475
- core_number = args .core_number
476
467
477
468
crash_script = check_file (args .crash_script [0 ])
478
469
file_to_reduce = check_file (args .file_to_reduce [0 ])
479
470
480
- r = Reduce (crash_script , file_to_reduce , core_number )
471
+ if "--n" not in creduce_flags :
472
+ creduce_flags += ["--n" , str (max (4 , multiprocessing .cpu_count () // 2 ))]
473
+
474
+ r = Reduce (crash_script , file_to_reduce , creduce_flags )
481
475
482
476
r .simplify_clang_args ()
483
477
r .write_interestingness_test ()
0 commit comments