From 444b5725b125e5154a571a1542cbb5a7ca58e29b Mon Sep 17 00:00:00 2001 From: dec05eba Date: Sat, 4 Jul 2020 20:07:20 +0200 Subject: Fix sanitizers (and tests) by allowing to specify which sanitizer to use. Its not possible to use all of them at the same time --- backend/ninja/Ninja.cpp | 65 +++++++++++++++++++++++++++++-------------------- 1 file changed, 39 insertions(+), 26 deletions(-) (limited to 'backend/ninja/Ninja.cpp') diff --git a/backend/ninja/Ninja.cpp b/backend/ninja/Ninja.cpp index bacbd4c..48595bb 100644 --- a/backend/ninja/Ninja.cpp +++ b/backend/ninja/Ninja.cpp @@ -399,15 +399,34 @@ namespace backend return Result::Ok(true); } - static vector getCompilerSanitizerFlags(const SibsConfig &config) + static ninja::NinjaArg getCompilerSanitizerFlag(const SibsConfig &config) { if(config.getCompiler() == Compiler::GCC || config.getCompiler() == Compiler::MINGW_W64) { - return { - ninja::NinjaArg::createRaw("-fsanitize=address"), - ninja::NinjaArg::createRaw("-fsanitize=undefined"), - ninja::NinjaArg::createRaw("-fsanitize=leak") - }; + switch(config.getSanitize()) { + case Sanitize::NONE: + return {}; + case Sanitize::ADDRESS: + return ninja::NinjaArg::createRaw("-fsanitize=address"); + case Sanitize::UNDEFINED: + return ninja::NinjaArg::createRaw("-fsanitize=undefined"); + case Sanitize::LEAK: + return ninja::NinjaArg::createRaw("-fsanitize=leak"); + } + } + return {}; + } + + static ninja::NinjaArg getlinkerSanitizerFlags(const SibsConfig &config) { + switch(config.getSanitize()) { + case Sanitize::NONE: + return {}; + case Sanitize::ADDRESS: + return ninja::NinjaArg::createRaw("-lasan"); + case Sanitize::UNDEFINED: + return ninja::NinjaArg::createRaw("-lubsan"); + case Sanitize::LEAK: + return ninja::NinjaArg::createRaw("-llsan"); } return {}; } @@ -749,9 +768,9 @@ namespace backend if(compilerType == RuntimeCompilerType::NONE) compilerType = cppCompilerType; - bool sanitize = config.getSanitize(); + Sanitize sanitize = config.getSanitize(); if(compilerType == RuntimeCompilerType::EMSCRIPTEN) - sanitize = false; + sanitize = Sanitize::NONE; Result createBuildDirResult = createDirectoryRecursive(savePath); if (!createBuildDirResult) @@ -1028,11 +1047,9 @@ namespace backend vector optimizationFlags = getCompilerOptimizationFlags(config); compileCCommand.insert(compileCCommand.end(), optimizationFlags.begin(), optimizationFlags.end()); - if(sanitize) - { - vector sanitizerFlags = getCompilerSanitizerFlags(config); - compileCCommand.insert(compileCCommand.end(), sanitizerFlags.begin(), sanitizerFlags.end()); - } + ninja::NinjaArg sanitizerFlag = getCompilerSanitizerFlag(config); + if(sanitizerFlag.type != ninja::NinjaArg::Type::NONE) + compileCCommand.push_back(std::move(sanitizerFlag)); compileCppCommand = compileCCommand; compileCppCommand[0] = ninja::NinjaArg::createRaw(cppCompilerName); @@ -1082,11 +1099,9 @@ namespace backend vector optimizationFlags = getCompilerOptimizationFlags(config); compileCCommand.insert(compileCCommand.end(), optimizationFlags.begin(), optimizationFlags.end()); - if(sanitize) - { - vector sanitizerFlags = getCompilerSanitizerFlags(config); - compileCCommand.insert(compileCCommand.end(), sanitizerFlags.begin(), sanitizerFlags.end()); - } + ninja::NinjaArg sanitizerFlag = getCompilerSanitizerFlag(config); + if(sanitizerFlag.type != ninja::NinjaArg::Type::NONE) + compileCCommand.push_back(std::move(sanitizerFlag)); compileCppCommand = compileCCommand; compileCppCommand.push_back(ninja::NinjaArg("/EHs")); @@ -1378,10 +1393,9 @@ namespace backend if(!rpath.empty()) buildExeArgs.push_back(ninja::NinjaArg("-Wl,-rpath," + rpath)); - if(sanitize) - { - buildExeArgs.push_back(ninja::NinjaArg::createRaw("-lasan -lubsan -llsan")); - } + ninja::NinjaArg sanitizeFlag = getlinkerSanitizerFlags(config); + if(sanitizeFlag.type != ninja::NinjaArg::Type::NONE) + buildExeArgs.push_back(std::move(sanitizeFlag)); else if(config.getOptimizationLevel() == OPT_LEV_RELEASE) { // Strip binary @@ -1612,10 +1626,9 @@ namespace backend buildDynamicArgs.push_back(ninja::NinjaArg::createRaw("-s SIDE_MODULE=1")); } - if(sanitize) - { - buildDynamicArgs.push_back(ninja::NinjaArg::createRaw("-lasan -lubsan -llsan")); - } + ninja::NinjaArg sanitizeFlag = getlinkerSanitizerFlags(config); + if(sanitizeFlag.type != ninja::NinjaArg::Type::NONE) + buildDynamicArgs.push_back(std::move(sanitizeFlag)); if(config.getOptimizationLevel() == OPT_LEV_RELEASE) { -- cgit v1.2.3