optimin: support afl-cmin crash mode

This commit is contained in:
Adrian Herrera
2021-07-26 02:11:21 +00:00
parent 33f9f911c1
commit cc933bcc0c

View File

@ -212,9 +212,14 @@ static Error getAFLCoverage(const StringRef Seed, AFLCoverageVector &Cov,
// Run afl-showmap
const int RC = sys::ExecuteAndWait(AFLShowmapPath, AFLShowmapArgs,
/*env=*/None, Redirects);
if (RC)
if (RC && !CrashMode) {
ErrMsg() << "Exit code " << RC << " != 0 received from afl-showmap";
sys::fs::remove(TracePath);
return createStringError(inconvertibleErrorCode(), "afl-showmap failed");
}
// Parse afl-showmap output
const auto CovOrErr = MemoryBuffer::getFile(TracePath);
if (const auto EC = CovOrErr.getError()) {
@ -287,6 +292,8 @@ int main(int argc, char *argv[]) {
SkipBinCheck = !!std::getenv("AFL_SKIP_BIN_CHECK");
const auto AFLPath = std::getenv("AFL_PATH");
if (CrashMode) ::setenv("AFL_CMIN_CRASHES_ONLY", "1", /*overwrite=*/true);
for (const auto &Arg : TargetArgs)
if (Arg == "@@") TargetArgsHasAtAt = true;
@ -354,8 +361,8 @@ int main(int argc, char *argv[]) {
if ((EC = sys::fs::create_directories(TraceDir))) {
ErrMsg() << "Failed to create output directory `" << OutputDir << "`: "
<< EC.message() << '\n';
ErrMsg() << "Failed to create output directory `" << OutputDir
<< "`: " << EC.message() << '\n';
return 1;
}
@ -421,7 +428,8 @@ int main(int argc, char *argv[]) {
if (auto Err = getAFLCoverage(SeedFiles.front(), Cov, /*BinCheck=*/true)) {
ErrMsg() << "No instrumentation output detected (perhaps crash or timeout)";
ErrMsg()
<< "No instrumentation output detected (perhaps crash or timeout)";
return 1;
}
@ -456,8 +464,8 @@ int main(int argc, char *argv[]) {
Cov.clear();
if (auto Err = getAFLCoverage(SeedFile, Cov)) {
ErrMsg() << "Failed to get coverage for seed `" << SeedFile << "`: "
<< Err << '\n';
ErrMsg() << "Failed to get coverage for seed `" << SeedFile
<< "`: " << Err << '\n';
return 1;
}