|
@@ -29,8 +29,14 @@ def usage():
|
|
|
crash by setting CRASH_TOKEN=
|
|
|
""".format((sys.argv[0])))
|
|
|
|
|
|
+deduplication_note = """\n\
|
|
|
+Note: While trimming the input, sometimes the mutated trace triggers a different
|
|
|
+type crash but indicates the same bug. Under this situation, our minimizer is
|
|
|
+incapable of recognizing and stopped from removing it. In the future, we may
|
|
|
+use a more sophisticated crash case deduplication method.
|
|
|
+\n"""
|
|
|
+
|
|
|
def check_if_trace_crashes(trace, path):
|
|
|
- global CRASH_TOKEN
|
|
|
with open(path, "w") as tracefile:
|
|
|
tracefile.write("".join(trace))
|
|
|
|
|
@@ -41,18 +47,31 @@ def check_if_trace_crashes(trace, path):
|
|
|
trace_path=path),
|
|
|
shell=True,
|
|
|
stdin=subprocess.PIPE,
|
|
|
- stdout=subprocess.PIPE)
|
|
|
- stdo = rc.communicate()[0]
|
|
|
- output = stdo.decode('unicode_escape')
|
|
|
- if rc.returncode == 137: # Timed Out
|
|
|
- return False
|
|
|
- if len(output.splitlines()) < 2:
|
|
|
- return False
|
|
|
-
|
|
|
+ stdout=subprocess.PIPE,
|
|
|
+ encoding="utf-8")
|
|
|
+ global CRASH_TOKEN
|
|
|
if CRASH_TOKEN is None:
|
|
|
- CRASH_TOKEN = output.splitlines()[-2]
|
|
|
-
|
|
|
- return CRASH_TOKEN in output
|
|
|
+ try:
|
|
|
+ outs, _ = rc.communicate(timeout=5)
|
|
|
+ CRASH_TOKEN = " ".join(outs.splitlines()[-2].split()[0:3])
|
|
|
+ except subprocess.TimeoutExpired:
|
|
|
+ print("subprocess.TimeoutExpired")
|
|
|
+ return False
|
|
|
+ print("Identifying Crashes by this string: {}".format(CRASH_TOKEN))
|
|
|
+ global deduplication_note
|
|
|
+ print(deduplication_note)
|
|
|
+ return True
|
|
|
+
|
|
|
+ for line in iter(rc.stdout.readline, ""):
|
|
|
+ if "CLOSED" in line:
|
|
|
+ return False
|
|
|
+ if CRASH_TOKEN in line:
|
|
|
+ return True
|
|
|
+
|
|
|
+ print("\nWarning:")
|
|
|
+ print(" There is no 'CLOSED'or CRASH_TOKEN in the stdout of subprocess.")
|
|
|
+ print(" Usually this indicates a different type of crash.\n")
|
|
|
+ return False
|
|
|
|
|
|
|
|
|
def minimize_trace(inpath, outpath):
|
|
@@ -66,7 +85,6 @@ def minimize_trace(inpath, outpath):
|
|
|
print("Crashed in {} seconds".format(end-start))
|
|
|
TIMEOUT = (end-start)*5
|
|
|
print("Setting the timeout for {} seconds".format(TIMEOUT))
|
|
|
- print("Identifying Crashes by this string: {}".format(CRASH_TOKEN))
|
|
|
|
|
|
i = 0
|
|
|
newtrace = trace[:]
|