Skip to content
2 changes: 1 addition & 1 deletion docs/README.dox
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ PhASAR is primarily developed and maintained by the [Secure Software Engineering
PhASAR was initially developed by Philipp Dominik Schubert (<a href="https://github.com/pdschubert">@pdschubert</a>)(<philipp.schubert@upb.de>).

\b Currently, PhASAR is maintained by
- Fabian Schiebel (<a href="https://github.com/fabianbs96">@fabianbs96</a>)(fabian.schiebel@iem.fraunhofer.de)
- Fabian Schiebel (<a href="https://github.com/fabianbs96">@fabianbs96</a>)(fabian.schiebel@uni-paderborn.de)
- Sriteja Kummita (<a href="https://github.com/sritejakv">@sritejakv</a>)
- Lucas Briese (<a href="https://github.com/jusito">@jusito</a>)
- Martin Mory (<a href="https://github.com/MMory">@MMory</a>)(martin.mory@upb.de)
Expand Down
7 changes: 7 additions & 0 deletions include/phasar/PhasarLLVM/HelperAnalyses.h
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,9 @@ class HelperAnalyses { // NOLINT(cppcoreguidelines-special-member-functions)
explicit HelperAnalyses(std::unique_ptr<llvm::Module> IRModule,
std::vector<std::string> EntryPoints,
HelperAnalysisConfig Config = {});
explicit HelperAnalyses(std::unique_ptr<LLVMProjectIRDB> IRDB,
std::vector<std::string> EntryPoints,
HelperAnalysisConfig Config = {});
~HelperAnalyses() noexcept;

[[nodiscard]] LLVMProjectIRDB &getProjectIRDB();
Expand All @@ -76,6 +79,10 @@ class HelperAnalyses { // NOLINT(cppcoreguidelines-special-member-functions)
[[nodiscard]] const SCCDependencyGraph<FunctionId> &getCGSCCCallers();
[[nodiscard]] const UsedGlobalsHolder<const llvm::GlobalVariable *> &
getUsedGlobals();
[[nodiscard]] const std::vector<std::string> &
getEntryPoints() const noexcept {
return EntryPoints;
}

private:
std::unique_ptr<LLVMProjectIRDB> IRDB;
Expand Down
6 changes: 6 additions & 0 deletions lib/PhasarLLVM/HelperAnalyses.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,12 @@ HelperAnalyses::HelperAnalyses(std::unique_ptr<llvm::Module> IRModule,
this->IRDB = std::make_unique<LLVMProjectIRDB>(
std::move(IRModule), Config.PreprocessExistingModule);
}
HelperAnalyses::HelperAnalyses(std::unique_ptr<LLVMProjectIRDB> IRDB,
std::vector<std::string> EntryPoints,
HelperAnalysisConfig Config)
: HelperAnalyses(std::string(), std::move(EntryPoints), std::move(Config)) {
this->IRDB = std::move(IRDB);
}

HelperAnalyses::~HelperAnalyses() noexcept = default;

Expand Down
10 changes: 6 additions & 4 deletions tools/phasar-cli/Controller/AnalysisController.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@

#include "AnalysisController.h"

#include "phasar/PhasarLLVM/ControlFlow/LLVMBasedICFG.h"
#include "phasar/PhasarLLVM/DB/LLVMProjectIRDB.h"
#include "phasar/PhasarLLVM/Passes/GeneralStatisticsAnalysis.h"
#include "phasar/PhasarLLVM/TypeHierarchy/DIBasedTypeHierarchy.h"
#include "phasar/PhasarLLVM/Utils/DataFlowAnalysisType.h"
Expand All @@ -22,7 +24,7 @@ void AnalysisController::emitRequestedHelperAnalysisResults() {
auto WithResultFileOrStdout = [&ResultDirectory = this->ResultDirectory](
const auto &FileName, auto Callback) {
if (!ResultDirectory.empty()) {
if (auto OFS = openFileStream(ResultDirectory.string() + FileName)) {
if (auto OFS = openFileStream(ResultDirectory + llvm::Twine(FileName))) {
Callback(*OFS);
}
} else {
Expand All @@ -31,7 +33,7 @@ void AnalysisController::emitRequestedHelperAnalysisResults() {
};

auto EmitterOptions = this->EmitterOptions;
auto &HA = *this->HA;
auto &HA = this->HA;

if (EmitterOptions & AnalysisControllerEmitterOptions::EmitIR) {
WithResultFileOrStdout("/psr-preprocess-ir.ll", [&HA](auto &OS) {
Expand Down Expand Up @@ -211,9 +213,9 @@ LLVMTaintConfig controller::makeTaintConfig(AnalysisController &Data) {
std::string AnalysisConfigPath =
!Data.AnalysisConfigs.empty() ? Data.AnalysisConfigs[0] : "";
return !AnalysisConfigPath.empty()
? LLVMTaintConfig(Data.HA->getProjectIRDB(),
? LLVMTaintConfig(Data.HA.getProjectIRDB(),
parseTaintConfig(AnalysisConfigPath))
: LLVMTaintConfig(Data.HA->getProjectIRDB());
: LLVMTaintConfig(Data.HA.getProjectIRDB());
}

} // namespace psr
14 changes: 9 additions & 5 deletions tools/phasar-cli/Controller/AnalysisController.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,22 +15,22 @@
#include "phasar/PhasarLLVM/HelperAnalyses.h"
#include "phasar/PhasarLLVM/Utils/DataFlowAnalysisType.h"

#include "llvm/ADT/SmallString.h"

#include "AnalysisControllerEmitterOptions.h"

#include <filesystem>
namespace psr {

struct AnalysisController {
HelperAnalyses *HA{};
HelperAnalyses HA;
std::vector<DataFlowAnalysisType> DataFlowAnalyses;
std::vector<std::string> AnalysisConfigs;
std::vector<std::string> EntryPoints;
[[maybe_unused]] AnalysisStrategy Strategy{};
AnalysisControllerEmitterOptions EmitterOptions =
AnalysisControllerEmitterOptions::None;
IFDSIDESolverConfig SolverConfig{};
std::string ProjectID = "default-phasar-project";
std::filesystem::path ResultDirectory;
llvm::SmallString<128> ProjectID;
llvm::SmallString<128> ResultDirectory;

static constexpr bool
needsToEmitPTA(AnalysisControllerEmitterOptions EmitterOptions) {
Expand All @@ -41,6 +41,10 @@ struct AnalysisController {

void emitRequestedHelperAnalysisResults();
void run();

[[nodiscard]] const auto &getEntryPoints() const noexcept {
return HA.getEntryPoints();
}
};

} // namespace psr
Expand Down
8 changes: 2 additions & 6 deletions tools/phasar-cli/Controller/AnalysisControllerInternal.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,9 @@
#ifndef PHASAR_CONTROLLER_ANALYSISCONTROLLERINTERNAL_H
#define PHASAR_CONTROLLER_ANALYSISCONTROLLERINTERNAL_H

#include "phasar/PhasarLLVM/ControlFlow/LLVMBasedICFG.h"
#include "phasar/PhasarLLVM/DB/LLVMProjectIRDB.h"
#include "phasar/PhasarLLVM/Pointer/LLVMAliasSet.h"
#include "phasar/ControlFlow/ICFG.h"
#include "phasar/PhasarLLVM/SimpleAnalysisConstructor.h"
#include "phasar/PhasarLLVM/TaintConfig/LLVMTaintConfig.h"
#include "phasar/Utils/ChronoUtils.h"
#include "phasar/Utils/IO.h"
#include "phasar/Utils/Timer.h"

Expand Down Expand Up @@ -79,8 +76,7 @@ static void emitRequestedDataFlowResults(AnalysisController &Data, T &Solver) {
const auto PrintResult = [&ResultDirectory](llvm::StringRef Suffix,
auto WithStream) {
if (!ResultDirectory.empty()) {
if (auto OFS =
openFileStream(llvm::Twine(ResultDirectory.string()) + Suffix)) {
if (auto OFS = openFileStream(ResultDirectory + Suffix)) {
WithStream(*OFS);
}
} else {
Expand Down
14 changes: 7 additions & 7 deletions tools/phasar-cli/Controller/AnalysisControllerInternalIDE.h
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ static void executeIfdsIdeAnalysisImpl(SolverTy &Solver,
template <typename SolverTy, typename ProblemTy, typename... ArgTys>
static void executeSparseIfdsIdeAnalysis(AnalysisController &Data,
ArgTys &&...Args) {
SparseLLVMBasedICFGView SVFG(&Data.HA->getICFG(), Data.HA->getAliasInfo());
SparseLLVMBasedICFGView SVFG(&Data.HA.getICFG(), Data.HA.getAliasInfo());
executeIfdsIdeAnalysisImpl<SolverTy, ProblemTy>(
Data, SVFG, std::forward<ArgTys>(Args)...);
}
Expand All @@ -56,42 +56,42 @@ static void executeIFDSAnalysisWithICFG(AnalysisController &Data,
const ICFG auto &ICF,
ArgTys &&...Args) {
auto Problem =
createAnalysisProblem<ProblemTy>(*Data.HA, std::forward<ArgTys>(Args)...);
createAnalysisProblem<ProblemTy>(Data.HA, std::forward<ArgTys>(Args)...);
IFDSSolver Solver(&Problem, &ICF);
executeIfdsIdeAnalysisImpl(Solver, Data);
}
template <typename ProblemTy, typename... ArgTys>
static void executeIDEAnalysisWithICFG(AnalysisController &Data,
const ICFG auto &ICF, ArgTys &&...Args) {
auto Problem =
createAnalysisProblem<ProblemTy>(*Data.HA, std::forward<ArgTys>(Args)...);
createAnalysisProblem<ProblemTy>(Data.HA, std::forward<ArgTys>(Args)...);
IDESolver Solver(&Problem, &ICF);
executeIfdsIdeAnalysisImpl(Solver, Data);
}

template <typename ProblemTy, typename... ArgTys>
static void executeIFDSAnalysis(AnalysisController &Data, ArgTys &&...Args) {
executeIFDSAnalysisWithICFG<ProblemTy>(Data, Data.HA->getICFG(),
executeIFDSAnalysisWithICFG<ProblemTy>(Data, Data.HA.getICFG(),
PSR_FWD(Args)...);
}

template <typename ProblemTy, typename... ArgTys>
static void executeSparseIFDSAnalysis(AnalysisController &Data,
ArgTys &&...Args) {
SparseLLVMBasedICFGView SVFG(&Data.HA->getICFG(), Data.HA->getAliasInfo());
SparseLLVMBasedICFGView SVFG(&Data.HA.getICFG(), Data.HA.getAliasInfo());
executeIFDSAnalysisWithICFG<ProblemTy>(Data, SVFG, PSR_FWD(Args)...);
}

template <typename ProblemTy, typename... ArgTys>
static void executeIDEAnalysis(AnalysisController &Data, ArgTys &&...Args) {
executeIDEAnalysisWithICFG<ProblemTy>(Data, Data.HA->getICFG(),
executeIDEAnalysisWithICFG<ProblemTy>(Data, Data.HA.getICFG(),
PSR_FWD(Args)...);
}

template <typename ProblemTy, typename... ArgTys>
static void executeSparseIDEAnalysis(AnalysisController &Data,
ArgTys &&...Args) {
SparseLLVMBasedICFGView SVFG(&Data.HA->getICFG(), Data.HA->getAliasInfo());
SparseLLVMBasedICFGView SVFG(&Data.HA.getICFG(), Data.HA.getAliasInfo());
executeIDEAnalysisWithICFG<ProblemTy>(Data, SVFG, PSR_FWD(Args)...);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ namespace psr::controller {
template <typename SolverTy, typename ProblemTy, typename... ArgTys>
static void executeMonoAnalysis(AnalysisController &Data, ArgTys &&...Args) {
auto Problem =
createAnalysisProblem<ProblemTy>(*Data.HA, std::forward<ArgTys>(Args)...);
createAnalysisProblem<ProblemTy>(Data.HA, std::forward<ArgTys>(Args)...);
SolverTy Solver(Problem);
Solver.solve();
emitRequestedDataFlowResults(Data, Solver);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,5 +17,5 @@ using namespace psr;
void controller::executeIDECSTDIOTS(AnalysisController &Data) {
CSTDFILEIOTypeStateDescription TSDesc;
executeIDEAnalysis<IDETypeStateAnalysis<CSTDFILEIOTypeStateDescription>>(
Data, &TSDesc, Data.EntryPoints);
Data, &TSDesc, Data.getEntryPoints());
}
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,6 @@ void controller::executeIDEFIIA(AnalysisController &Data) {
Current);
};

executeIDEAnalysis<IDEFeatureTaintAnalysis>(Data, Data.EntryPoints,
executeIDEAnalysis<IDEFeatureTaintAnalysis>(Data, Data.getEntryPoints(),
Generator);
}
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,6 @@ void controller::executeIDEIIA(AnalysisController &Data) {
Current);
};

executeIDEAnalysis<IDEInstInteractionAnalysis>(Data, Data.EntryPoints,
executeIDEAnalysis<IDEInstInteractionAnalysis>(Data, Data.getEntryPoints(),
Generator);
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,5 +14,5 @@
using namespace psr;

void controller::executeIDELinearConst(AnalysisController &Data) {
executeIDEAnalysis<IDELinearConstantAnalysis>(Data, Data.EntryPoints);
executeIDEAnalysis<IDELinearConstantAnalysis>(Data, Data.getEntryPoints());
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,5 +17,5 @@ using namespace psr;
void controller::executeIDEOpenSSLTS(AnalysisController &Data) {
OpenSSLEVPKDFDescription TSDesc;
executeIDEAnalysis<IDETypeStateAnalysis<OpenSSLEVPKDFDescription>>(
Data, &TSDesc, Data.EntryPoints);
Data, &TSDesc, Data.getEntryPoints());
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,5 +14,5 @@
using namespace psr;

void controller::executeIDESolverTest(AnalysisController &Data) {
executeIDEAnalysis<IDESolverTest>(Data, Data.EntryPoints);
executeIDEAnalysis<IDESolverTest>(Data, Data.getEntryPoints());
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,5 +16,5 @@ using namespace psr;
void controller::executeIDEXTaint(AnalysisController &Data) {
auto Config = makeTaintConfig(Data);
executeIDEAnalysis<IDEExtendedTaintAnalysis<>>(Data, Config,
Data.EntryPoints);
Data.getEntryPoints());
}
Original file line number Diff line number Diff line change
Expand Up @@ -25,12 +25,12 @@ void controller::executeIFDSCFLEnvTaint(AnalysisController &Data) {
auto Config = makeTaintConfig(Data);

auto UserProblem = createAnalysisProblem<IFDSTaintAnalysis>(
*Data.HA, &Config, Data.EntryPoints, /*TaintMainArgs*/ false,
Data.HA, &Config, Data.getEntryPoints(), /*TaintMainArgs*/ false,
/*EnableStrongUpdateStore*/ false);
auto Printer = UserProblem.consumePrinter();
auto FieldSensProblem = CFLFieldSensIFDSProblem(&UserProblem);

IterativeIDESolver Solver(&FieldSensProblem, &Data.HA->getICFG());
IterativeIDESolver Solver(&FieldSensProblem, &Data.HA.getICFG());

SimpleTimer MeasureTime;

Expand All @@ -52,7 +52,7 @@ void controller::executeIFDSCFLEnvTaint(AnalysisController &Data) {
HasResultsDir = !Data.ResultDirectory.empty()](
const llvm::Twine &FileName, auto Handler) {
if (HasResultsDir) {
if (auto OFS = openFileStream(Data.ResultDirectory.string() + FileName)) {
if (auto OFS = openFileStream(Data.ResultDirectory + FileName)) {
Handler(*OFS);
}
} else {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,5 +14,5 @@
using namespace psr;

void controller::executeIFDSConst(AnalysisController &Data) {
executeIFDSAnalysis<IFDSConstAnalysis>(Data, Data.EntryPoints);
executeIFDSAnalysis<IFDSConstAnalysis>(Data, Data.getEntryPoints());
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,5 +14,5 @@
using namespace psr;

void controller::executeIFDSSolverTest(AnalysisController &Data) {
executeIFDSAnalysis<IFDSSolverTest>(Data, Data.EntryPoints);
executeIFDSAnalysis<IFDSSolverTest>(Data, Data.getEntryPoints());
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,6 @@ void controller::executeIFDSTaint(AnalysisController &Data) {
auto Config = makeTaintConfig(Data);
// Note: Don't blindly generate argc and argv. Use a proper taint config
// instead
executeIFDSAnalysis<IFDSTaintAnalysis>(Data, &Config, Data.EntryPoints,
executeIFDSAnalysis<IFDSTaintAnalysis>(Data, &Config, Data.getEntryPoints(),
false);
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,5 +14,5 @@
using namespace psr;

void controller::executeIFDSType(AnalysisController &Data) {
executeIFDSAnalysis<IFDSTypeAnalysis>(Data, Data.EntryPoints);
executeIFDSAnalysis<IFDSTypeAnalysis>(Data, Data.getEntryPoints());
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,5 +14,5 @@
using namespace psr;

void controller::executeIFDSUninitVar(AnalysisController &Data) {
executeIFDSAnalysis<IFDSUninitializedVariables>(Data, Data.EntryPoints);
executeIFDSAnalysis<IFDSUninitializedVariables>(Data, Data.getEntryPoints());
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,5 +14,5 @@
using namespace psr;

void controller::executeInterMonoSolverTest(AnalysisController &Data) {
executeInterMonoAnalysis<InterMonoSolverTest>(Data, Data.EntryPoints);
executeInterMonoAnalysis<InterMonoSolverTest>(Data, Data.getEntryPoints());
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,5 +16,5 @@ using namespace psr;
void controller::executeInterMonoTaint(AnalysisController &Data) {
auto Config = makeTaintConfig(Data);
executeInterMonoAnalysis<InterMonoTaintAnalysis>(Data, Config,
Data.EntryPoints);
Data.getEntryPoints());
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,6 @@
using namespace psr;

void controller::executeIntraMonoFullConstant(AnalysisController &Data) {
executeIntraMonoAnalysis<IntraMonoFullConstantPropagation>(Data,
Data.EntryPoints);
executeIntraMonoAnalysis<IntraMonoFullConstantPropagation>(
Data, Data.getEntryPoints());
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,5 +14,5 @@
using namespace psr;

void controller::executeIntraMonoSolverTest(AnalysisController &Data) {
executeIntraMonoAnalysis<IntraMonoSolverTest>(Data, Data.EntryPoints);
executeIntraMonoAnalysis<IntraMonoSolverTest>(Data, Data.getEntryPoints());
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
*****************************************************************************/

#include "phasar/DataFlow/MonoIfds/MonoIFDSSolver.h"
#include "phasar/PhasarLLVM/ControlFlow/LLVMBasedICFG.h"
#include "phasar/PhasarLLVM/DataFlow/MonoIfds/Problems/MonoIFDSTaintAnalysis.h"
#include "phasar/PhasarLLVM/Pointer/FilteredLLVMAliasIterator.h"

Expand All @@ -18,17 +19,17 @@ using namespace psr;

void controller::executeMonoIFDSTaint(AnalysisController &Data) {

FilteredLLVMAliasIterator FAI(Data.HA->getAliasInfo());
FilteredLLVMAliasIterator FAI(Data.HA.getAliasInfo());

auto Config = makeTaintConfig(Data);
monoifds::TaintAnalysis TA(&Config, &Data.HA->getUsedGlobals(), &FAI);
monoifds::TaintAnalysis TA(&Config, &Data.HA.getUsedGlobals(), &FAI);

// monoifds::MonoIFDSSolver Solver(&TA, &Data.HA->getICFG());
// Solver //
// .setCGSCCs(&Data.HA->getCGSCCs())
// .setFunctionCompressor(&Data.HA->getCompressedFunctions());

monoifds::MonoIFDSSolver Solver(&TA, *Data.HA);
monoifds::MonoIFDSSolver Solver(&TA, Data.HA);

{
std::optional<Timer> MeasureTime;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,5 +15,6 @@ using namespace psr;

void controller::executeSparseIFDSTaint(AnalysisController &Data) {
auto Config = makeTaintConfig(Data);
executeSparseIFDSAnalysis<IFDSTaintAnalysis>(Data, &Config, Data.EntryPoints);
executeSparseIFDSAnalysis<IFDSTaintAnalysis>(Data, &Config,
Data.getEntryPoints());
}
Loading
Loading