mirror of
https://github.com/ldc-developers/ldc.git
synced 2025-05-06 19:06:02 +03:00
Add automatic libFuzzer linking + fuzz test
This commit is contained in:
parent
4f5bd4a9bc
commit
800dc5a97f
3 changed files with 139 additions and 0 deletions
|
@ -45,6 +45,8 @@ public:
|
|||
private:
|
||||
virtual void addSanitizers();
|
||||
virtual void addASanLinkFlags();
|
||||
virtual void addFuzzLinkFlags();
|
||||
virtual void addCppStdlibLinkFlags();
|
||||
|
||||
virtual void addUserSwitches();
|
||||
void addDefaultLibs();
|
||||
|
@ -260,11 +262,61 @@ void ArgsBuilder::addASanLinkFlags() {
|
|||
}
|
||||
}
|
||||
|
||||
// Adds all required link flags for -fsanitize=fuzzer when libFuzzer library is
|
||||
// found.
|
||||
void ArgsBuilder::addFuzzLinkFlags() {
|
||||
std::string searchPaths[] = {
|
||||
exe_path::prependLibDir("libFuzzer.a"),
|
||||
exe_path::prependLibDir("libLLVMFuzzer.a"),
|
||||
};
|
||||
|
||||
for (const auto &filepath : searchPaths) {
|
||||
if (llvm::sys::fs::exists(filepath)) {
|
||||
args.push_back(filepath);
|
||||
|
||||
// libFuzzer requires the C++ std library, but only add the link flags
|
||||
// when libFuzzer was found.
|
||||
addCppStdlibLinkFlags();
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void ArgsBuilder::addCppStdlibLinkFlags() {
|
||||
switch (global.params.targetTriple->getOS()) {
|
||||
case llvm::Triple::Linux:
|
||||
if (global.params.targetTriple->getEnvironment() == llvm::Triple::Android) {
|
||||
args.push_back("-lc++");
|
||||
} else {
|
||||
args.push_back("-lstdc++");
|
||||
}
|
||||
break;
|
||||
case llvm::Triple::Solaris:
|
||||
case llvm::Triple::NetBSD:
|
||||
case llvm::Triple::OpenBSD:
|
||||
case llvm::Triple::DragonFly:
|
||||
args.push_back("-lstdc++");
|
||||
break;
|
||||
case llvm::Triple::Darwin:
|
||||
case llvm::Triple::MacOSX:
|
||||
case llvm::Triple::FreeBSD:
|
||||
args.push_back("-lc++");
|
||||
break;
|
||||
default:
|
||||
// Don't know: do nothing so the user can step in
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void ArgsBuilder::addSanitizers() {
|
||||
if (opts::isSanitizerEnabled(opts::AddressSanitizer)) {
|
||||
addASanLinkFlags();
|
||||
}
|
||||
|
||||
if (opts::isSanitizerEnabled(opts::FuzzSanitizer)) {
|
||||
addFuzzLinkFlags();
|
||||
}
|
||||
|
||||
// TODO: instead of this, we should link with our own sanitizer libraries
|
||||
// because LDC's LLVM version could be different from the system clang.
|
||||
if (opts::isSanitizerEnabled(opts::MemorySanitizer)) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue