Skip to content

Commit

Permalink
[sancov] blacklist support.
Browse files Browse the repository at this point in the history
Summary:
Using the blacklist the user can filter own unwanted functions
from all outputs. By default blacklist contains "fun:__sancov*" line.

Differential Revision: http://reviews.llvm.org/D15364

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@255732 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
aizatsky-chromium committed Dec 16, 2015
1 parent 53252a1 commit bca907f
Show file tree
Hide file tree
Showing 9 changed files with 65 additions and 15 deletions.
1 change: 1 addition & 0 deletions test/tools/sancov/Inputs/blacklist.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
fun:bar*
Binary file modified test/tools/sancov/Inputs/test-linux_x86_64
Binary file not shown.
Binary file modified test/tools/sancov/Inputs/test-linux_x86_64-1.sancov
Binary file not shown.
Binary file modified test/tools/sancov/Inputs/test-linux_x86_64.sancov
Binary file not shown.
2 changes: 1 addition & 1 deletion test/tools/sancov/Inputs/test.cpp
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
// compile & generate coverage data using:
// clang++ -g -o test-linux_x86_64 -fsanitize=address -fsanitize-coverage=edge *.cpp
// clang++ -g -o test-linux_x86_64 -fsanitize=address -fsanitize-coverage=bb test.cpp foo.cpp
// ASAN_OPTIONS="coverage=1" ./test-linux_x86_64 && mv test-linux_x86_64.*.sancov test-linux_x86_64.sancov
// ASAN_OPTIONS="coverage=1" ./test-linux_x86_64 1 && mv test-linux_x86_64.*.sancov test-linux_x86_64-1.sancov

Expand Down
5 changes: 5 additions & 0 deletions test/tools/sancov/blacklist.test
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
REQUIRES: x86_64-linux
RUN: sancov -obj %p/Inputs/test-linux_x86_64 -covered-functions -blacklist %p/Inputs/blacklist.txt %p/Inputs/test-linux_x86_64.sancov | FileCheck %s

CHECK-NOT: Inputs{{[/\\]}}test.cpp:12 bar(std::string)
CHECK: Inputs{{[/\\]}}test.cpp:14 main
3 changes: 2 additions & 1 deletion test/tools/sancov/not_covered_functions.test
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,6 @@ RUN: sancov -obj %p/Inputs/test-linux_x86_64 -not-covered-functions %p/Inputs/te
RUN: sancov -obj %p/Inputs/test-linux_x86_64 -not-covered-functions %p/Inputs/test-linux_x86_64-1.sancov | FileCheck --check-prefix=CHECK1 --allow-empty %s

CHECK: Inputs{{[/\\]}}foo.cpp:5 foo()
CHECK1-NOT: {{.}}*
CHECK-NOT: {{.*__sanitizer.*}}
CHECK1-NOT: {{.+}}

16 changes: 8 additions & 8 deletions test/tools/sancov/print.test
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
REQUIRES: x86_64-linux
RUN: sancov -obj %p/Inputs/test-linux_x86_64 -print %p/Inputs/test-linux_x86_64.sancov | FileCheck %s

CHECK: 0x4db18b
CHECK: 0x4db2d2
CHECK: 0x4db322
CHECK: 0x4db376
CHECK: 0x4db3bd
CHECK: 0x4db3f4
CHECK: 0x4db427
CHECK: 0x4db45a
CHECK: 0x4dbe2b
CHECK: 0x4dbf72
CHECK: 0x4dbfec
CHECK: 0x4dc033
CHECK: 0x4dc06a
CHECK: 0x4dc09d
CHECK: 0x4dc0d0

53 changes: 48 additions & 5 deletions tools/sancov/sancov.cc
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
#include "llvm/Support/Path.h"
#include "llvm/Support/PrettyStackTrace.h"
#include "llvm/Support/Signals.h"
#include "llvm/Support/SpecialCaseList.h"
#include "llvm/Support/TargetRegistry.h"
#include "llvm/Support/TargetSelect.h"
#include "llvm/Support/ToolOutputFile.h"
Expand Down Expand Up @@ -80,6 +81,16 @@ static cl::opt<std::string> ClStripPathPrefix(
"strip_path_prefix", cl::init(""),
cl::desc("Strip this prefix from file paths in reports."));

static cl::opt<std::string>
ClBlacklist("blacklist", cl::init(""),
cl::desc("Blacklist file (sanitizer blacklist format)."));

static cl::opt<bool> ClUseDefaultBlacklist(
"use_default_blacklist", cl::init(true), cl::Hidden,
cl::desc("Controls if default blacklist should be used."));

static const char *const DefaultBlacklist = "fun:__sanitizer_*";

// --------- FORMAT SPECIFICATION ---------

struct FileHeader {
Expand Down Expand Up @@ -169,8 +180,8 @@ computeFunctionsMap(const std::set<uint64_t> &Addrs) {
for (auto Addr : Addrs) {
auto InliningInfo = Symbolizer.symbolizeInlinedCode(ClBinaryName, Addr);
FailIfError(InliningInfo);
for (uint32_t i = 0; i < InliningInfo->getNumberOfFrames(); ++i) {
auto FrameInfo = InliningInfo->getFrame(i);
for (uint32_t I = 0; I < InliningInfo->getNumberOfFrames(); ++I) {
auto FrameInfo = InliningInfo->getFrame(I);
SmallString<256> FileName(FrameInfo.FileName);
sys::path::remove_dots(FileName, /* remove_dot_dot */ true);
FileLoc Loc = {FileName.str(), FrameInfo.Line};
Expand All @@ -186,7 +197,7 @@ computeFunctionsMap(const std::set<uint64_t> &Addrs) {
std::set<FunctionLoc> computeFunctionLocs(const std::set<uint64_t> &Addrs) {
std::map<FileLoc, std::string> Fns = computeFunctionsMap(Addrs);

std::set<FunctionLoc> result;
std::set<FunctionLoc> Result;
std::string LastFileName;
std::set<std::string> ProcessedFunctions;

Expand All @@ -201,10 +212,10 @@ std::set<FunctionLoc> computeFunctionLocs(const std::set<uint64_t> &Addrs) {
if (!ProcessedFunctions.insert(FunctionName).second)
continue;

result.insert(FunctionLoc{P.first, P.second});
Result.insert(FunctionLoc{P.first, P.second});
}

return result;
return Result;
}

// Locate __sanitizer_cov* function addresses that are used for coverage
Expand Down Expand Up @@ -346,9 +357,41 @@ std::set<uint64_t> getCoveragePoints(std::string FileName) {
return Result;
}

static std::unique_ptr<SpecialCaseList> createDefaultBlacklist() {
if (!ClUseDefaultBlacklist)
return std::unique_ptr<SpecialCaseList>();
std::unique_ptr<MemoryBuffer> MB =
MemoryBuffer::getMemBuffer(DefaultBlacklist);
std::string Error;
auto Blacklist = SpecialCaseList::create(MB.get(), Error);
FailIfNotEmpty(Error);
return Blacklist;
}

static std::unique_ptr<SpecialCaseList> createUserBlacklist() {
if (ClBlacklist.empty())
return std::unique_ptr<SpecialCaseList>();

return SpecialCaseList::createOrDie({{ClBlacklist}});
}

static void printFunctionLocs(const std::set<FunctionLoc> &FnLocs,
raw_ostream &OS) {
std::unique_ptr<SpecialCaseList> DefaultBlacklist = createDefaultBlacklist();
std::unique_ptr<SpecialCaseList> UserBlacklist = createUserBlacklist();

for (const FunctionLoc &FnLoc : FnLocs) {
if (DefaultBlacklist &&
DefaultBlacklist->inSection("fun", FnLoc.FunctionName))
continue;
if (DefaultBlacklist &&
DefaultBlacklist->inSection("src", FnLoc.Loc.FileName))
continue;
if (UserBlacklist && UserBlacklist->inSection("fun", FnLoc.FunctionName))
continue;
if (UserBlacklist && UserBlacklist->inSection("src", FnLoc.Loc.FileName))
continue;

OS << stripPathPrefix(FnLoc.Loc.FileName) << ":" << FnLoc.Loc.Line << " "
<< FnLoc.FunctionName << "\n";
}
Expand Down

0 comments on commit bca907f

Please sign in to comment.