From: Kostya Serebryany Date: Wed, 30 Nov 2016 21:53:32 +0000 (+0000) Subject: [libFuzzer] extend -print_coverage to print the comma-separated list of covered dirs... X-Git-Tag: android-x86-7.1-r4~23876 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=297c443f76906262eda8a13715e56c8ea6e8f6df;p=android-x86%2Fexternal-llvm.git [libFuzzer] extend -print_coverage to print the comma-separated list of covered dirs. Note: the Windows stub for DirName is left unimplemented git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@288276 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Fuzzer/FuzzerIO.h b/lib/Fuzzer/FuzzerIO.h index b1ac69c8088..39634f93fec 100644 --- a/lib/Fuzzer/FuzzerIO.h +++ b/lib/Fuzzer/FuzzerIO.h @@ -33,6 +33,9 @@ void ReadDirToVectorOfUnits(const char *Path, std::vector *V, std::string DirPlusFile(const std::string &DirPath, const std::string &FileName); +// Returns the name of the dir, similar to the 'dirname' utility. +std::string DirName(const std::string &FileName); + void DupAndCloseStderr(); void CloseStdout(); diff --git a/lib/Fuzzer/FuzzerIOPosix.cpp b/lib/Fuzzer/FuzzerIOPosix.cpp index 740d52d0b1d..a4290face97 100644 --- a/lib/Fuzzer/FuzzerIOPosix.cpp +++ b/lib/Fuzzer/FuzzerIOPosix.cpp @@ -18,8 +18,9 @@ #include #include #include -#include +#include #include +#include #include namespace fuzzer { @@ -74,5 +75,13 @@ void DeleteFile(const std::string &Path) { unlink(Path.c_str()); } +std::string DirName(const std::string &FileName) { + char *Tmp = new char[FileName.size() + 1]; + memcpy(Tmp, FileName.c_str(), FileName.size() + 1); + std::string Res = dirname(Tmp); + delete [] Tmp; + return Res; +} + } // namespace fuzzer #endif // LIBFUZZER_POSIX diff --git a/lib/Fuzzer/FuzzerIOWindows.cpp b/lib/Fuzzer/FuzzerIOWindows.cpp index f19353c96cb..aaa2e34fb35 100644 --- a/lib/Fuzzer/FuzzerIOWindows.cpp +++ b/lib/Fuzzer/FuzzerIOWindows.cpp @@ -139,5 +139,9 @@ void DeleteFile(const std::string &Path) { _unlink(Path.c_str()); } +std::string DirName(const std::string &FileName) { + assert(0 && "Unimplemented"); +} + } // namespace fuzzer #endif // LIBFUZZER_WINDOWS diff --git a/lib/Fuzzer/FuzzerTracePC.cpp b/lib/Fuzzer/FuzzerTracePC.cpp index eabf0d087f4..8d58a6d3a91 100644 --- a/lib/Fuzzer/FuzzerTracePC.cpp +++ b/lib/Fuzzer/FuzzerTracePC.cpp @@ -131,7 +131,8 @@ void TracePC::PrintCoverage() { } std::map> CoveredPCsPerModule; std::map ModuleOffsets; - std::set CoveredFiles, CoveredFunctions, CoveredLines; + std::set CoveredDirs, CoveredFiles, CoveredFunctions, + CoveredLines; Printf("COVERAGE:\n"); for (size_t i = 1; i < GetNumPCs(); i++) { if (!PCs[i]) continue; @@ -150,12 +151,21 @@ void TracePC::PrintCoverage() { CoveredPCsPerModule[Module].push_back(PcOffset); CoveredFunctions.insert(FunctionStr); CoveredFiles.insert(FileStr); + CoveredDirs.insert(DirName(FileStr)); if (!CoveredLines.insert(FileStr + ":" + LineStr).second) continue; Printf("COVERED: %s %s:%s\n", FunctionStr.c_str(), FileStr.c_str(), LineStr.c_str()); } + std::string CoveredDirsStr; + for (auto &Dir : CoveredDirs) { + if (!CoveredDirsStr.empty()) + CoveredDirsStr += ","; + CoveredDirsStr += Dir; + } + Printf("COVERED_DIRS: %s\n", CoveredDirsStr.c_str()); + for (auto &M : CoveredPCsPerModule) { std::set UncoveredFiles, UncoveredFunctions; std::map > UncoveredLines; // Func+File => lines diff --git a/lib/Fuzzer/test/coverage.test b/lib/Fuzzer/test/coverage.test index b41a262c462..a5420bba23b 100644 --- a/lib/Fuzzer/test/coverage.test +++ b/lib/Fuzzer/test/coverage.test @@ -3,6 +3,7 @@ CHECK-DAG: COVERED: {{.*}}in LLVMFuzzerTestOneInput {{.*}}NullDerefTest.cpp:13 CHECK-DAG: COVERED: {{.*}}in LLVMFuzzerTestOneInput {{.*}}NullDerefTest.cpp:14 CHECK-DAG: COVERED: {{.*}}in LLVMFuzzerTestOneInput {{.*}}NullDerefTest.cpp:16 CHECK-DAG: COVERED: {{.*}}in LLVMFuzzerTestOneInput {{.*}}NullDerefTest.cpp:19 +CHECK: COVERED_DIRS: {{.*}}lib/Fuzzer/test RUN: not LLVMFuzzer-NullDerefTest-TracePC -print_coverage=1 2>&1 | FileCheck %s RUN: LLVMFuzzer-DSOTest -print_coverage=1 -runs=0 2>&1 | FileCheck %s --check-prefix=DSO