diff --git a/include/phasar/PhasarLLVM/TaintConfig/TaintConfigData.h b/include/phasar/PhasarLLVM/TaintConfig/TaintConfigData.h index 317e9751d..d9546ae1b 100644 --- a/include/phasar/PhasarLLVM/TaintConfig/TaintConfigData.h +++ b/include/phasar/PhasarLLVM/TaintConfig/TaintConfigData.h @@ -11,7 +11,7 @@ #define PHASAR_PHASARLLVM_TAINTCONFIG_TAINTCONFIGDATA_H #include -#include +#include namespace psr { class TaintConfigData; @@ -22,32 +22,37 @@ class TaintConfigData { TaintConfigData() = default; explicit TaintConfigData(const std::string &Filepath); - const std::unordered_set &getAllFunctionRets() const; - const std::unordered_set &getAllFunctionParamsSources() const; - const std::unordered_set &getAllFunctionParamsSinks() const; - const std::unordered_set &getAllFunctionParamsSanitizers() const; + [[nodiscard]] const std::vector &getAllFunctionNames() const; + [[nodiscard]] const std::vector &getAllFunctionRets() const; + [[nodiscard]] const std::vector & + getAllFunctionParamsSources() const; + [[nodiscard]] const std::vector & + getAllFunctionParamsSinks() const; + [[nodiscard]] const std::vector & + getAllFunctionParamsSanitizers() const; - const std::unordered_set &getAllVariableScopes() const; - const std::unordered_set &getAllVariableLines() const; - const std::unordered_set &getAllVariableCats() const; - const std::unordered_set &getAllVariableNames() const; + [[nodiscard]] const std::vector &getAllVariableScopes() const; + [[nodiscard]] const std::vector &getAllVariableLines() const; + [[nodiscard]] const std::vector &getAllVariableCats() const; + [[nodiscard]] const std::vector &getAllVariableNames() const; - const std::unordered_set &getAllFunctions() const; - const std::unordered_set &getAllVariables() const; + [[nodiscard]] const std::vector &getAllFunctions() const; + [[nodiscard]] const std::vector &getAllVariables() const; private: - std::unordered_set Functions; - std::unordered_set Variables; - - std::unordered_set FunctionRets; - std::unordered_set FunctionParamsSources; - std::unordered_set FunctionParamsSinks; - std::unordered_set FunctionParamsSanitizers; - - std::unordered_set VariableScopes; - std::unordered_set VariableLines; - std::unordered_set VariableCats; - std::unordered_set VariableNames; + std::vector Functions; + std::vector Variables; + + std::vector FunctionNames; + std::vector FunctionRets; + std::vector FunctionParamSources; + std::vector FunctionParamSinks; + std::vector FunctionParamSanitizers; + + std::vector VariableScopes; + std::vector VariableLines; + std::vector VariableCats; + std::vector VariableNames; }; } // namespace psr diff --git a/lib/PhasarLLVM/TaintConfig/LLVMTaintConfig.cpp b/lib/PhasarLLVM/TaintConfig/LLVMTaintConfig.cpp index dd1604389..ccba790c3 100644 --- a/lib/PhasarLLVM/TaintConfig/LLVMTaintConfig.cpp +++ b/lib/PhasarLLVM/TaintConfig/LLVMTaintConfig.cpp @@ -11,16 +11,17 @@ #include "phasar/PhasarLLVM/DB/LLVMProjectIRDB.h" #include "phasar/PhasarLLVM/TaintConfig/TaintConfigBase.h" -#include "phasar/PhasarLLVM/TaintConfig/TaintConfigData.h" #include "phasar/PhasarLLVM/Utils/Annotation.h" #include "phasar/PhasarLLVM/Utils/LLVMShorthands.h" #include "phasar/Utils/Logger.h" +#include "phasar/Utils/NlohmannLogging.h" #include "llvm/IR/DebugInfo.h" #include "llvm/IR/Function.h" #include "llvm/IR/InstIterator.h" #include "llvm/IR/IntrinsicInst.h" -#include "llvm/IR/Value.h" + +#include namespace psr { @@ -60,145 +61,75 @@ findAllFunctionDefs(const LLVMProjectIRDB &IRDB, llvm::StringRef Name) { void LLVMTaintConfig::addAllFunctions(const LLVMProjectIRDB &IRDB, const TaintConfigData &Config) { - for (const auto &Source : Config.getAllFunctionParamsSources()) { - auto FnDefs = findAllFunctionDefs(IRDB, Source); - } - + int Counter = -1; for (const auto &FunDesc : Config.getAllFunctions()) { - auto FnDefs = findAllFunctionDefs(IRDB, FunDesc); + Counter++; + auto Name = Config.getAllFunctionNames()[Counter]; + + auto FnDefs = findAllFunctionDefs(IRDB, Name); if (FnDefs.empty()) { - llvm::errs() << "WARNING: Cannot retrieve function " << FunDesc << "\n"; + llvm::errs() << "WARNING: Cannot retrieve function " << Name << "\n"; continue; } const auto *Fun = FnDefs[0]; - // handle a function's parameters - if (FunDesc.contains("params")) { - auto Params = FunDesc["params"]; - if (Params.contains("source")) { - for (unsigned Idx : Params["source"]) { - if (Idx >= Fun->arg_size()) { - llvm::errs() - << "ERROR: The source-function parameter index is out of " - "bounds: " - << Idx << "\n"; - // Use 'continue' instead of 'break' to get error messages for the - // remaining parameters as well - continue; - } - addTaintCategory(Fun->getArg(Idx), TaintCategory::Source); - } + // handle a function's source parameters + for (const auto &Param : Config.getAllFunctionParamsSources()) { + unsigned Idx = std::stoi(Param); + + if (Idx >= Fun->arg_size()) { + llvm::errs() << "ERROR: The source-function parameter index is out of " + "bounds: " + << Idx << "\n"; + // Use 'continue' instead of 'break' to get error messages for the + // remaining parameters as well + continue; } - if (Params.contains("sink")) { - for (const auto &Idx : Params["sink"]) { - if (Idx.is_number()) { - if (Idx >= Fun->arg_size()) { - llvm::errs() - << "ERROR: The source-function parameter index is out of " - "bounds: " - << Idx << "\n"; - continue; - } - addTaintCategory(Fun->getArg(Idx), TaintCategory::Sink); - } else if (Idx.is_string()) { - const auto Sinks = Idx.get(); - if (Sinks == "all") { - for (const auto &Arg : Fun->args()) { - addTaintCategory(&Arg, TaintCategory::Sink); - } - } - } + addTaintCategory(Fun->getArg(Idx), TaintCategory::Source); + } + for (const auto &Param : Config.getAllFunctionParamsSinks()) { + char *Check; + long Converted = strtol(Param.c_str(), &Check, Param.size()); + + if (!Check) { + unsigned Idx = std::stoi(Param); + if (Idx >= Fun->arg_size()) { + llvm::errs() + << "ERROR: The source-function parameter index is out of " + "bounds: " + << Idx << "\n"; + continue; } - } - if (Params.contains("sanitizer")) { - for (unsigned Idx : Params["sanitizer"]) { - if (Idx >= Fun->arg_size()) { - llvm::errs() - << "ERROR: The source-function parameter index is out of " - "bounds: " - << Idx << "\n"; - continue; + addTaintCategory(Fun->getArg(Idx), TaintCategory::Sink); + } else { + if (Param == "all") { + for (const auto &Arg : Fun->args()) { + addTaintCategory(&Arg, TaintCategory::Sink); } - addTaintCategory(Fun->getArg(Idx), TaintCategory::Sanitizer); } } } - // handle a function's return value - if (FunDesc.contains("ret")) { - for (const auto &User : Fun->users()) { - addTaintCategory(User, FunDesc["ret"].get()); - } - } - } -} - -LLVMTaintConfig::LLVMTaintConfig(const psr::LLVMProjectIRDB &Code, - const psr::TaintConfigData &Config) { - // handle functions - if (Config.hasFunctions()) { - addAllFunctions(Code, Config); - } - - // handle variables - if (Config.hasVariables()) { - // scope can be a function name or a struct. - std::unordered_map - StructConfigMap; - - // read all struct types from config - for (const auto &VarDesc : Config.getAllVariables()) { - llvm::DebugInfoFinder DIF; - const auto *M = Code.getModule(); - - DIF.processModule(*M); - for (const auto &Ty : DIF.types()) { - if (Ty->getTag() == llvm::dwarf::DW_TAG_structure_type && - Ty->getName().equals(VarDesc["scope"].get())) { - for (const auto &LlvmStructTy : M->getIdentifiedStructTypes()) { - StructConfigMap.insert( - std::pair( - LlvmStructTy, VarDesc)); - } + for (const auto &Param : Config.getAllFunctionParamsSanitizers()) { + char *Check; + long Converted = strtol(Param.c_str(), &Check, Param.size()); + unsigned Idx = std::stoi(Param); + + if (!Check) { + if (Idx >= Fun->arg_size()) { + llvm::errs() + << "ERROR: The source-function parameter index is out of " + "bounds: " + << Idx << "\n"; + continue; } + addTaintCategory(Fun->getArg(Idx), TaintCategory::Sanitizer); } - DIF.reset(); } - - // add corresponding Allocas or getElementPtr instructions to the taint - // category - for (const auto &VarDesc : Config.getAllVariables()) { - for (const auto &Fun : Code.getAllFunctions()) { - for (const auto &I : llvm::instructions(Fun)) { - if (const auto *DbgDeclare = - llvm::dyn_cast(&I)) { - const llvm::DILocalVariable *LocalVar = DbgDeclare->getVariable(); - // matching line number with for Allocas - if (LocalVar->getName().equals(VarDesc) && - LocalVar->getLine() == VarDesc["line"].get()) { - addTaintCategory(DbgDeclare->getAddress(), - VarDesc["cat"].get()); - } - } else if (!StructConfigMap.empty()) { - // Ignorning line numbers for getElementPtr instructions - if (const auto *Gep = llvm::dyn_cast(&I)) { - const auto *StType = llvm::dyn_cast( - Gep->getPointerOperandType()->getPointerElementType()); - if (StType && StructConfigMap.count(StType)) { - const auto VarDesc = StructConfigMap.at(StType); - auto VarName = VarDesc["name"].get(); - // using substr to cover the edge case in which same variable - // name is present as a local variable and also as a struct - // member variable. (Ex. JsonConfig/fun_member_02.cpp) - if (Gep->getName().substr(0, VarName.size()).equals(VarName)) { - addTaintCategory(Gep, VarDesc["cat"].get()); - } - } - } - } - } - } + // handle a function's return value + for (const auto &User : Fun->users()) { + addTaintCategory(User, Config.getAllFunctionRets()[Counter]); } } } @@ -514,4 +445,4 @@ void LLVMTaintConfig::printImpl(llvm::raw_ostream &OS) const { } template class TaintConfigBase; -} // namespace psr +} // namespace psr \ No newline at end of file diff --git a/lib/PhasarLLVM/TaintConfig/TaintConfigData.cpp b/lib/PhasarLLVM/TaintConfig/TaintConfigData.cpp index 1422cd5d3..efd7685f5 100644 --- a/lib/PhasarLLVM/TaintConfig/TaintConfigData.cpp +++ b/lib/PhasarLLVM/TaintConfig/TaintConfigData.cpp @@ -55,121 +55,112 @@ parseTaintConfigOrNull(const llvm::Twine &Path) { } void findAndAddValue(const nlohmann::json &Config, const std::string &Value, - std::unordered_set &Container) { + std::vector &Container) { if (Config.contains(Value)) { for (const auto &Curr : Config[Value]) { - Container.insert(Curr); + Container.push_back(Curr); } } } +void addAllFunctions(const nlohmann::json &Config, + std::vector &Container) { + findAndAddValue(Config, "functions", Container); +} + +void addAllFunctionNames(const nlohmann::json &Function, + std::vector &Container) { + findAndAddValue(Function, "name", Container); +} + void addAllFunctionRets(const nlohmann::json &Function, - std::unordered_set &Container) { + std::vector &Container) { findAndAddValue(Function, "ret", Container); } void addAllFunctionParamsSources(const nlohmann::json &Param, - std::unordered_set &Container) { + std::vector &Container) { findAndAddValue(Param, "source", Container); } void addAllFunctionParamsSinks(const nlohmann::json &Param, - std::unordered_set &Container) { + std::vector &Container) { findAndAddValue(Param, "sink", Container); } -void addAllFunctionParamsSanitizers( - const nlohmann::json &Param, std::unordered_set &Container) { +void addAllFunctionParamsSanitizers(const nlohmann::json &Param, + std::vector &Container) { findAndAddValue(Param, "sanitizer", Container); } -void addAllVariableScopes(const nlohmann::json &Variable, - std::unordered_set &Container) { - findAndAddValue(Variable, "scope", Container); -} - -void addAllVariableLines(const nlohmann::json &Variable, - std::unordered_set &Container) { - findAndAddValue(Variable, "line", Container); -} - -void addAllVariableCats(const nlohmann::json &Variable, - std::unordered_set &Container) { - findAndAddValue(Variable, "cat", Container); -} - -void addAllVariableNames(const nlohmann::json &Variable, - std::unordered_set &Container) { - findAndAddValue(Variable, "name", Container); -} - TaintConfigData::TaintConfigData(const std::string &Filepath) { nlohmann::json Config(Filepath); // handle functions if (Config.contains("functions")) { - for (auto &Function : Config["functions"]) { - addAllFunctionRets(Function, FunctionRets); - - if (Function.contains("params")) { - addAllFunctionParamsSources(Function["params"], FunctionParamsSources); - addAllFunctionParamsSinks(Function["params"], FunctionParamsSinks); - addAllFunctionParamsSanitizers(Function["params"], - FunctionParamsSanitizers); - } + for (const auto &Func : Config["functions"]) { + // A functions name should be at the same index in the names array and the + // functions array + Functions.push_back(Func); + + findAndAddValue(Func, "name", FunctionNames); + findAndAddValue(Func, "ret", FunctionRets); + findAndAddValue(Func["params"], "source", FunctionParamSources); + findAndAddValue(Func["params"], "sink", FunctionParamSinks); + findAndAddValue(Func["params"], "sanitizer", FunctionParamSanitizers); } } // handle variables if (Config.contains("variables")) { - for (auto &Variable : Config["variables"]) { - addAllVariableScopes(Variable, VariableScopes); - addAllVariableLines(Variable, VariableLines); - addAllVariableCats(Variable, VariableCats); - addAllVariableNames(Variable, VariableNames); + for (const auto &Var : Config["variables"]) { + // A variables name should be at the same index in the names array and the + // variables array + Variables.push_back(Var); + + findAndAddValue(Config["variables"], "name", VariableNames); + findAndAddValue(Config["variables"], "scope", Variables); + findAndAddValue(Config["variables"], "line", VariableLines); + findAndAddValue(Config["variables"], "cat", VariableCats); } } } -const std::unordered_set & -TaintConfigData::getAllFunctions() const { +const std::vector &TaintConfigData::getAllFunctions() const { return Functions; } -const std::unordered_set & -TaintConfigData::getAllFunctionRets() const { +const std::vector &TaintConfigData::getAllFunctionNames() const { + return FunctionNames; +} +const std::vector &TaintConfigData::getAllFunctionRets() const { return FunctionRets; } -const std::unordered_set & +const std::vector & TaintConfigData::getAllFunctionParamsSources() const { - return FunctionParamsSources; + return FunctionParamSources; } -const std::unordered_set & +const std::vector & TaintConfigData::getAllFunctionParamsSinks() const { - return FunctionParamsSinks; + return FunctionParamSinks; } -const std::unordered_set & +const std::vector & TaintConfigData::getAllFunctionParamsSanitizers() const { - return FunctionParamsSanitizers; + return FunctionParamSanitizers; } -const std::unordered_set & -TaintConfigData::getAllVariables() const { +const std::vector &TaintConfigData::getAllVariables() const { return Variables; } -const std::unordered_set & -TaintConfigData::getAllVariableScopes() const { +const std::vector &TaintConfigData::getAllVariableScopes() const { return VariableScopes; } -const std::unordered_set & -TaintConfigData::getAllVariableLines() const { +const std::vector &TaintConfigData::getAllVariableLines() const { return VariableLines; } -const std::unordered_set & -TaintConfigData::getAllVariableCats() const { +const std::vector &TaintConfigData::getAllVariableCats() const { return VariableCats; } -const std::unordered_set & -TaintConfigData::getAllVariableNames() const { +const std::vector &TaintConfigData::getAllVariableNames() const { return VariableNames; } diff --git a/unittests/PhasarLLVM/DataFlow/IfdsIde/Problems/IDEExtendedTaintAnalysisTest.cpp b/unittests/PhasarLLVM/DataFlow/IfdsIde/Problems/IDEExtendedTaintAnalysisTest.cpp index 8d7fc1144..43396faf5 100644 --- a/unittests/PhasarLLVM/DataFlow/IfdsIde/Problems/IDEExtendedTaintAnalysisTest.cpp +++ b/unittests/PhasarLLVM/DataFlow/IfdsIde/Problems/IDEExtendedTaintAnalysisTest.cpp @@ -64,9 +64,9 @@ class IDETaintAnalysisTest : public ::testing::Test { return LLVMTaintConfig(HA.getProjectIRDB()); }, [&](json *JS) { - TaintConfigData Data = - TaintConfigData(HA.getProjectIRDB(), *JS); - auto Ret = LLVMTaintConfig(Data); + TaintConfigData Data = TaintConfigData(*JS); + auto Ret = + LLVMTaintConfig(HA.getProjectIRDB(), Data); if (DumpResults) { llvm::errs() << Ret << "\n"; } diff --git a/unittests/PhasarLLVM/DataFlow/Mono/InterMonoTaintAnalysisTest.cpp b/unittests/PhasarLLVM/DataFlow/Mono/InterMonoTaintAnalysisTest.cpp index 8f7ea392b..94ce9b1fb 100644 --- a/unittests/PhasarLLVM/DataFlow/Mono/InterMonoTaintAnalysisTest.cpp +++ b/unittests/PhasarLLVM/DataFlow/Mono/InterMonoTaintAnalysisTest.cpp @@ -35,9 +35,8 @@ class InterMonoTaintAnalysisTest : public ::testing::Test { auto ConfigPath = (PathToLlFiles + "config.json").str(); auto BuildPos = ConfigPath.rfind("/build/") + 1; ConfigPath.erase(BuildPos, 6); - TaintConfigData Data = - TaintConfigData(HA.getProjectIRDB(), parseTaintConfig(ConfigPath)); - LLVMTaintConfig TC(Data); + TaintConfigData Data = TaintConfigData(parseTaintConfig(ConfigPath)); + LLVMTaintConfig TC(HA.getProjectIRDB(), Data); TC.registerSinkCallBack([](const llvm::Instruction *Inst) { std::set Ret; if (const auto *Call = llvm::dyn_cast(Inst); diff --git a/unittests/PhasarLLVM/TaintConfig/TaintConfigTest.cpp b/unittests/PhasarLLVM/TaintConfig/TaintConfigTest.cpp index d416dc2f2..8caadf83f 100644 --- a/unittests/PhasarLLVM/TaintConfig/TaintConfigTest.cpp +++ b/unittests/PhasarLLVM/TaintConfig/TaintConfigTest.cpp @@ -233,7 +233,7 @@ TEST_F(TaintConfigTest, Array_01_Json) { psr::parseTaintConfig(PathToJsonTaintConfigTestCode + Config); psr::LLVMProjectIRDB IR({PathToJsonTaintConfigTestCode + File}); // IR.emitPreprocessedIR(llvm::outs(), false); - psr::LLVMTaintConfig TConfig(psr::TaintConfigData(IR, JsonConfig)); + psr::LLVMTaintConfig TConfig(IR, psr::TaintConfigData(JsonConfig)); llvm::outs() << TConfig << '\n'; const llvm::Value *I = IR.getInstruction(3); ASSERT_TRUE(TConfig.isSource(I)); @@ -246,7 +246,7 @@ TEST_F(TaintConfigTest, Array_02_Json) { psr::parseTaintConfig(PathToJsonTaintConfigTestCode + Config); psr::LLVMProjectIRDB IR({PathToJsonTaintConfigTestCode + File}); // IR.emitPreprocessedIR(llvm::outs(), false); - psr::LLVMTaintConfig TConfig(psr::TaintConfigData(IR, JsonConfig)); + psr::LLVMTaintConfig TConfig(IR, psr::TaintConfigData(JsonConfig)); llvm::outs() << TConfig << '\n'; const llvm::Value *I = IR.getInstruction(3); ASSERT_TRUE(TConfig.isSource(I)); @@ -258,7 +258,7 @@ TEST_F(TaintConfigTest, Basic_01_Json) { auto JsonConfig = psr::parseTaintConfig(PathToJsonTaintConfigTestCode + Config); psr::LLVMProjectIRDB IR({PathToJsonTaintConfigTestCode + File}); - psr::LLVMTaintConfig TConfig(psr::TaintConfigData(IR, JsonConfig)); + psr::LLVMTaintConfig TConfig(IR, psr::TaintConfigData(JsonConfig)); llvm::outs() << TConfig << '\n'; const auto *Bar = IR.getFunction("bar"); assert(Bar); @@ -282,7 +282,7 @@ TEST_F(TaintConfigTest, Basic_02_Json) { psr::parseTaintConfig(PathToJsonTaintConfigTestCode + Config); psr::LLVMProjectIRDB IR({PathToJsonTaintConfigTestCode + File}); // IR.emitPreprocessedIR(llvm::outs(), false); - psr::LLVMTaintConfig TConfig(psr::TaintConfigData(IR, JsonConfig)); + psr::LLVMTaintConfig TConfig(IR, psr::TaintConfigData(JsonConfig)); llvm::outs() << TConfig << '\n'; const llvm::Value *I1 = IR.getInstruction(7); const llvm::Value *I2 = IR.getInstruction(18); @@ -296,7 +296,7 @@ TEST_F(TaintConfigTest, Basic_03_Json) { auto JsonConfig = psr::parseTaintConfig(PathToJsonTaintConfigTestCode + Config); psr::LLVMProjectIRDB IR({PathToJsonTaintConfigTestCode + File}); - psr::LLVMTaintConfig TConfig(psr::TaintConfigData(IR, JsonConfig)); + psr::LLVMTaintConfig TConfig(IR, psr::TaintConfigData(JsonConfig)); llvm::outs() << TConfig << '\n'; const auto *TaintPair = IR.getFunction("taintPair"); assert(TaintPair); @@ -314,7 +314,7 @@ TEST_F(TaintConfigTest, Basic_04_Json) { psr::parseTaintConfig(PathToJsonTaintConfigTestCode + Config); psr::LLVMProjectIRDB IR({PathToJsonTaintConfigTestCode + File}); // IR.emitPreprocessedIR(llvm::outs(), false); - psr::LLVMTaintConfig TConfig(psr::TaintConfigData(IR, JsonConfig)); + psr::LLVMTaintConfig TConfig(IR, psr::TaintConfigData(JsonConfig)); llvm::outs() << TConfig << '\n'; llvm::outs().flush(); const llvm::Value *I = IR.getInstruction(2); @@ -327,7 +327,7 @@ TEST_F(TaintConfigTest, DataMember_01_Json) { auto JsonConfig = psr::parseTaintConfig(PathToJsonTaintConfigTestCode + Config); psr::LLVMProjectIRDB IR({PathToJsonTaintConfigTestCode + File}); - psr::LLVMTaintConfig TConfig(psr::TaintConfigData(IR, JsonConfig)); + psr::LLVMTaintConfig TConfig(IR, psr::TaintConfigData(JsonConfig)); llvm::outs() << TConfig << '\n'; llvm::outs().flush(); const llvm::Value *I = IR.getInstruction(17); @@ -342,7 +342,7 @@ TEST_F(TaintConfigTest, FunMember_01_Json) { psr::parseTaintConfig(PathToJsonTaintConfigTestCode + Config); psr::LLVMProjectIRDB IR({PathToJsonTaintConfigTestCode + File}); // IR.emitPreprocessedIR(llvm::outs(), false); - psr::LLVMTaintConfig TConfig(psr::TaintConfigData(IR, JsonConfig)); + psr::LLVMTaintConfig TConfig(IR, psr::TaintConfigData(JsonConfig)); llvm::outs() << TConfig << '\n'; for (const auto &F : IR.getAllFunctions()) { if (F->getName().contains("foo")) { @@ -366,7 +366,7 @@ TEST_F(TaintConfigTest, FunMember_02_Json) { psr::parseTaintConfig(PathToJsonTaintConfigTestCode + Config); psr::LLVMProjectIRDB IR({PathToJsonTaintConfigTestCode + File}); // IR.emitPreprocessedIR(llvm::outs(), false); - psr::LLVMTaintConfig TConfig(psr::TaintConfigData(IR, JsonConfig)); + psr::LLVMTaintConfig TConfig(IR, psr::TaintConfigData(JsonConfig)); llvm::outs() << TConfig << '\n'; const llvm::Value *I1 = IR.getInstruction(18); const llvm::Value *I2 = IR.getInstruction(54); @@ -398,7 +398,7 @@ TEST_F(TaintConfigTest, NameMangling_01_Json) { auto JsonConfig = psr::parseTaintConfig(PathToJsonTaintConfigTestCode + Config); psr::LLVMProjectIRDB IR({PathToJsonTaintConfigTestCode + File}); - psr::LLVMTaintConfig TConfig(psr::TaintConfigData(IR, JsonConfig)); + psr::LLVMTaintConfig TConfig(IR, psr::TaintConfigData(JsonConfig)); llvm::outs() << TConfig << '\n'; llvm::outs().flush(); for (const auto *F : IR.getAllFunctions()) { @@ -420,7 +420,7 @@ TEST_F(TaintConfigTest, StaticFun_01_Json) { auto JsonConfig = psr::parseTaintConfig(PathToJsonTaintConfigTestCode + Config); psr::LLVMProjectIRDB IR({PathToJsonTaintConfigTestCode + File}); - psr::LLVMTaintConfig TConfig(psr::TaintConfigData(IR, JsonConfig)); + psr::LLVMTaintConfig TConfig(IR, psr::TaintConfigData(JsonConfig)); llvm::outs() << TConfig << '\n'; for (const auto *F : IR.getAllFunctions()) { std::string FName = getFunctionName(llvm::demangle(F->getName().str())); @@ -442,7 +442,7 @@ TEST_F(TaintConfigTest, StaticFun_02_Json) { auto JsonConfig = psr::parseTaintConfig(PathToJsonTaintConfigTestCode + Config); psr::LLVMProjectIRDB IR({PathToJsonTaintConfigTestCode + File}); - psr::LLVMTaintConfig TConfig(psr::TaintConfigData(IR, JsonConfig)); + psr::LLVMTaintConfig TConfig(IR, psr::TaintConfigData(JsonConfig)); llvm::outs() << TConfig << '\n'; const llvm::Value *CallInst = IR.getInstruction(13); const auto *I = llvm::dyn_cast(CallInst);