// compile & generate coverage data using:
-// 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
+// clang++ -g -o test-linux_x86_64 -fsanitize=address -fsanitize-coverage=bb test.cpp ../Inputs/foo.cpp
+// ASAN_OPTIONS="coverage=1" ./test-linux_x86_64 && mv test-linux_x86_64.??*.sancov test-linux_x86_64.0.sancov
+// ASAN_OPTIONS="coverage=1" ./test-linux_x86_64 1 && mv test-linux_x86_64.??*.sancov test-linux_x86_64.1.sancov
#include <stdio.h>
#include <string>
REQUIRES: x86_64-linux
-RUN: sancov -covered-functions -blacklist %p/Inputs/blacklist.txt %p/Inputs/test-linux_x86_64 %p/Inputs/test-linux_x86_64.0.sancov | FileCheck %s
+RUN: sancov -covered-functions -blacklist %p/Inputs/fun_blacklist.txt %p/Inputs/test-linux_x86_64 %p/Inputs/test-linux_x86_64.0.sancov | FileCheck %s
+RUN: sancov -covered-functions -blacklist %p/Inputs/src_blacklist.txt %p/Inputs/test-linux_x86_64 %p/Inputs/test-linux_x86_64.1.sancov | FileCheck --check-prefix=CHECK1 %s
CHECK-NOT: Inputs{{[/\\]}}test.cpp:12 bar(std::string)
CHECK: Inputs{{[/\\]}}test.cpp:14 main
+
+CHECK1-NOT: foo
+CHECK1: Inputs{{[/\\]}}test.cpp:12 bar(std::string)
+CHECK1: Inputs{{[/\\]}}test.cpp:14 main
: DefaultBlacklist(createDefaultBlacklist()),
UserBlacklist(createUserBlacklist()) {}
- bool isBlacklisted(const DILineInfo &DI) {
- if (DefaultBlacklist && DefaultBlacklist->inSection("fun", DI.FunctionName))
+ // AddrInfo contains normalized filename. It is important to check it rather
+ // than DILineInfo.
+ bool isBlacklisted(const AddrInfo &AI) {
+ if (DefaultBlacklist && DefaultBlacklist->inSection("fun", AI.FunctionName))
return true;
- if (DefaultBlacklist && DefaultBlacklist->inSection("src", DI.FileName))
+ if (DefaultBlacklist && DefaultBlacklist->inSection("src", AI.FileName))
return true;
- if (UserBlacklist && UserBlacklist->inSection("fun", DI.FunctionName))
+ if (UserBlacklist && UserBlacklist->inSection("fun", AI.FunctionName))
return true;
- if (UserBlacklist && UserBlacklist->inSection("src", DI.FileName))
+ if (UserBlacklist && UserBlacklist->inSection("src", AI.FileName))
return true;
return false;
}
for (auto Addr : Addrs) {
auto LineInfo = Symbolizer->symbolizeCode(ObjectFile, Addr);
FailIfError(LineInfo);
- if (B.isBlacklisted(*LineInfo))
+ auto LineAddrInfo = AddrInfo(*LineInfo, Addr);
+ if (B.isBlacklisted(LineAddrInfo))
continue;
- Result.push_back(AddrInfo(*LineInfo, Addr));
+ Result.push_back(LineAddrInfo);
if (InlinedCode) {
auto InliningInfo = Symbolizer->symbolizeInlinedCode(ObjectFile, Addr);
FailIfError(InliningInfo);
for (uint32_t I = 0; I < InliningInfo->getNumberOfFrames(); ++I) {
auto FrameInfo = InliningInfo->getFrame(I);
- if (B.isBlacklisted(FrameInfo))
+ auto FrameAddrInfo = AddrInfo(FrameInfo, Addr);
+ if (B.isBlacklisted(FrameAddrInfo))
continue;
- Result.push_back(AddrInfo(FrameInfo, Addr));
+ Result.push_back(FrameAddrInfo);
}
}
}