Skip to content

Commit

Permalink
Refactor AnalysisPrinter part2
Browse files Browse the repository at this point in the history
  • Loading branch information
SanthoshMohan97 committed Feb 12, 2024
1 parent 1cc8a26 commit ca7565b
Show file tree
Hide file tree
Showing 13 changed files with 105 additions and 85 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -530,11 +530,9 @@ class IDETypeStateAnalysis
if (const auto *Alloca =
llvm::dyn_cast<llvm::AllocaInst>(Res.first)) {
if (Res.second == TSD->error()) {
Warning<IDETypeStateAnalysisDomain<TypeStateDescriptionTy>>
Warn(&I, Res.first, TSD->error(),
DataFlowAnalysisType::None);
// ERROR STATE DETECTED
this->Printer->onResult(Warn);
this->Printer->onResult(&I, Res.first, TSD->error(),
DataFlowAnalysisType::None);
}
}
}
Expand All @@ -543,11 +541,9 @@ class IDETypeStateAnalysis
if (const auto *Alloca =
llvm::dyn_cast<llvm::AllocaInst>(Res.first)) {
if (Res.second == TSD->error()) {
Warning<IDETypeStateAnalysisDomain<TypeStateDescriptionTy>>
Warn(&I, Res.first, TSD->error(),
DataFlowAnalysisType::None);
// ERROR STATE DETECTED
this->Printer->onResult(Warn);
this->Printer->onResult(&I, Res.first, TSD->error(),
DataFlowAnalysisType::None);
}
}
}
Expand Down
28 changes: 17 additions & 11 deletions include/phasar/PhasarLLVM/Utils/SourceMgrPrinter.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,19 +7,22 @@
#include "phasar/Utils/MaybeUniquePtr.h"

#include "llvm/ADT/FunctionExtras.h"
#include "llvm/Support/MemoryBuffer.h"

#include <llvm/ADT/StringMap.h>
#include <llvm/ADT/StringRef.h>
#include <llvm/Support/SourceMgr.h>
#include <llvm/Support/raw_ostream.h> /// TODO: quoting style
#include "llvm/ADT/StringMap.h"
#include "llvm/Support/SourceMgr.h"
#include "llvm/Support/raw_ostream.h"

namespace psr {

std::optional<unsigned> getSourceBufId(llvm::StringRef FileName);
std::optional<unsigned> getSourceBufId(llvm::StringRef FileName,
llvm::StringMap<unsigned> &FileNameIDMap,
llvm::SourceMgr &SrcMgr);

template <typename AnalysisDomainTy>
class SourceMgrPrinter : public AnalysisPrinterBase<AnalysisDomainTy> {
using n_t = typename AnalysisDomainTy::n_t;
using d_t = typename AnalysisDomainTy::d_t;
using l_t = typename AnalysisDomainTy::l_t;

public:
SourceMgrPrinter(
llvm::unique_function<std::string(DataFlowAnalysisType)> &&PrintMessage,
Expand All @@ -28,21 +31,24 @@ class SourceMgrPrinter : public AnalysisPrinterBase<AnalysisDomainTy> {

void onInitialize() override {}
void onFinalize() override {}
void onResult(Warning<AnalysisDomainTy> Warn) override {
auto BufIdOpt = getSourceBufId(getFilePathFromIR(Warn.Instr));
void onResult(n_t Instr, d_t /*DfFact*/, l_t /*Lattice*/,
DataFlowAnalysisType AnalysisType) override {
auto BufIdOpt =
getSourceBufId(getFilePathFromIR(Instr), FileNameIDMap, SrcMgr);
if (BufIdOpt.has_value()) {
std::pair<unsigned int, unsigned int> LineAndCol =
getLineAndColFromIR(Warn.Instr);
getLineAndColFromIR(Instr);
/// TODO: Configuration options for warning or error
SrcMgr.PrintMessage(
*OS,
SrcMgr.FindLocForLineAndColumn(BufIdOpt.value(), LineAndCol.first,
LineAndCol.second),
llvm::SourceMgr::DK_Warning, GetPrintMessage(Warn.AnalysisType));
llvm::SourceMgr::DK_Warning, GetPrintMessage(AnalysisType));
}
}

private:
llvm::StringMap<unsigned> FileNameIDMap{};
llvm::SourceMgr SrcMgr{};
llvm::unique_function<std::string(DataFlowAnalysisType)> GetPrintMessage;
MaybeUniquePtr<llvm::raw_ostream> OS = &llvm::errs();
Expand Down
19 changes: 3 additions & 16 deletions include/phasar/Utils/AnalysisPrinterBase.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,30 +7,17 @@

namespace psr {

/// TODO: move warning to default analysis printer
template <typename AnalysisDomainTy> struct Warning {
template <typename AnalysisDomainTy> class AnalysisPrinterBase {
using n_t = typename AnalysisDomainTy::n_t;
using d_t = typename AnalysisDomainTy::d_t;
using l_t = typename AnalysisDomainTy::l_t;

n_t Instr;
d_t Fact;
l_t LatticeElement;
DataFlowAnalysisType AnalysisType;

// Constructor
Warning(n_t Inst, d_t DfFact, l_t Lattice,
DataFlowAnalysisType DfAnalysisType)
: Instr(std::move(Inst)), Fact(std::move(DfFact)),
LatticeElement(std::move(Lattice)), AnalysisType(DfAnalysisType) {}
};

template <typename AnalysisDomainTy> class AnalysisPrinterBase {
public:
/// TODO: use non-virtual function to call virtual function with default
/// parameters +
/// TODO: templace magic - #include "memory_resource"
virtual void onResult(Warning<AnalysisDomainTy> /*Warn*/) = 0;
virtual void onResult(n_t /*Instr*/, d_t /*DfFact*/, l_t /*LatticeElement*/,
DataFlowAnalysisType /*AnalysisType*/) = 0;
virtual void onInitialize() = 0;
virtual void onFinalize() = 0;

Expand Down
24 changes: 22 additions & 2 deletions include/phasar/Utils/DefaultAnalysisPrinter.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,16 +12,36 @@

namespace psr {

template <typename AnalysisDomainTy> struct Warning {
using n_t = typename AnalysisDomainTy::n_t;
using d_t = typename AnalysisDomainTy::d_t;
using l_t = typename AnalysisDomainTy::l_t;

n_t Instr;
d_t Fact;
l_t LatticeElement;
DataFlowAnalysisType AnalysisType;

// Constructor
Warning(n_t Inst, d_t DfFact, l_t Lattice,
DataFlowAnalysisType DfAnalysisType)
: Instr(std::move(Inst)), Fact(std::move(DfFact)),
LatticeElement(std::move(Lattice)), AnalysisType(DfAnalysisType) {}
};

template <typename AnalysisDomainTy>
class DefaultAnalysisPrinter : public AnalysisPrinterBase<AnalysisDomainTy> {
using n_t = typename AnalysisDomainTy::n_t;
using d_t = typename AnalysisDomainTy::d_t;
using l_t = typename AnalysisDomainTy::l_t;

public:
~DefaultAnalysisPrinter() override = default;
DefaultAnalysisPrinter(llvm::raw_ostream &OS = llvm::outs()) : OS(&OS) {}

void onResult(Warning<AnalysisDomainTy> Warn) override {
AnalysisResults.emplace_back(std::move(Warn));
void onResult(n_t Instr, d_t DfFact, l_t Lattice,
DataFlowAnalysisType AnalysisType) override {
AnalysisResults.emplace_back(Instr, DfFact, Lattice, AnalysisType);
}

void onInitialize() override{};
Expand Down
7 changes: 6 additions & 1 deletion include/phasar/Utils/NullAnalysisPrinter.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,19 @@ namespace psr {

template <typename AnalysisDomainTy>
class NullAnalysisPrinter final : public AnalysisPrinterBase<AnalysisDomainTy> {
using n_t = typename AnalysisDomainTy::n_t;
using d_t = typename AnalysisDomainTy::d_t;
using l_t = typename AnalysisDomainTy::l_t;

public:
static NullAnalysisPrinter *getInstance() {
static auto Instance = NullAnalysisPrinter();
return &Instance;
}

void onInitialize() override{};
void onResult(Warning<AnalysisDomainTy> /*War*/) override{};
void onResult(n_t /*Instr*/, d_t /*DfFact*/, l_t /*Lattice*/,
DataFlowAnalysisType /*AnalysisType*/) override{};
void onFinalize() override{};

private:
Expand Down
17 changes: 10 additions & 7 deletions include/phasar/Utils/OnTheFlyAnalysisPrinter.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,16 @@
#include "phasar/Utils/MaybeUniquePtr.h"
#include "phasar/Utils/Printer.h"

#include <cassert>
#include "llvm/ADT/Twine.h"
#include "llvm/Support/raw_ostream.h"

#include <llvm/ADT/Twine.h>
#include <llvm/Support/raw_ostream.h>
#include <cassert>
namespace psr {

template <typename AnalysisDomainTy>
class OnTheFlyAnalysisPrinter : public AnalysisPrinterBase<AnalysisDomainTy> {
using n_t = typename AnalysisDomainTy::n_t;
using d_t = typename AnalysisDomainTy::d_t;
using l_t = typename AnalysisDomainTy::l_t;

public:
Expand All @@ -29,12 +31,13 @@ class OnTheFlyAnalysisPrinter : public AnalysisPrinterBase<AnalysisDomainTy> {
~OnTheFlyAnalysisPrinter<AnalysisDomainTy>() = default;

void onInitialize() override{};
void onResult(Warning<AnalysisDomainTy> Warn) override {
void onResult(n_t Instr, d_t DfFact, l_t LatticeElement,
DataFlowAnalysisType /*AnalysisType*/) override {
assert(isValid());
*OS << "\nAt IR statement: " << NToString(Warn.Instr) << "\n";
*OS << "\tFact: " << DToString(Warn.Fact) << "\n";
*OS << "\nAt IR statement: " << NToString(Instr) << "\n";
*OS << "\tFact: " << DToString(DfFact) << "\n";
if constexpr (std::is_same_v<l_t, BinaryDomain>) {
*OS << "Value: " << LToString(Warn.LatticeElement) << "\n";
*OS << "Value: " << LToString(LatticeElement) << "\n";
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -228,10 +228,8 @@ void IDEExtendedTaintAnalysis::reportLeakIfNecessary(
const llvm::Value *LeakCandidate) {
if (isSink(SinkCandidate, Inst)) {
Leaks[Inst].insert(LeakCandidate);
Warning<IDEExtendedTaintAnalysisDomain> Warn(
Inst, makeFlowFact(LeakCandidate), Top{},
DataFlowAnalysisType::IDEExtendedTaintAnalysis);
Printer->onResult(Warn);
Printer->onResult(Inst, makeFlowFact(LeakCandidate), Top{},
DataFlowAnalysisType::IDEExtendedTaintAnalysis);
}
}

Expand Down Expand Up @@ -756,10 +754,8 @@ void IDEExtendedTaintAnalysis::emitTextReport(

for (auto &[Inst, LeakSet] : Leaks) {
for (const auto &Leak : LeakSet) {
Warning<IDEExtendedTaintAnalysisDomain> Warn(
Inst, makeFlowFact(Leak), Top{},
DataFlowAnalysisType::IDEExtendedTaintAnalysis);
Printer->onResult(Warn);
Printer->onResult(Inst, makeFlowFact(Leak), Top{},
DataFlowAnalysisType::IDEExtendedTaintAnalysis);
}
}

Expand Down
12 changes: 4 additions & 8 deletions lib/PhasarLLVM/DataFlow/IfdsIde/Problems/IFDSTaintAnalysis.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -411,10 +411,8 @@ auto IFDSTaintAnalysis::getSummaryFlowFunction([[maybe_unused]] n_t CallSite,
CallSite](d_t Source) -> container_type {
if (Leak.count(Source)) {
if (Leaks[CallSite].insert(Source).second) {
Warning<LLVMIFDSAnalysisDomainDefault> Warn(
CallSite, Source, topElement(),
DataFlowAnalysisType::IFDSTaintAnalysis);
Printer->onResult(Warn);
Printer->onResult(CallSite, Source, topElement(),
DataFlowAnalysisType::IFDSTaintAnalysis);
}
}

Expand All @@ -441,10 +439,8 @@ auto IFDSTaintAnalysis::getSummaryFlowFunction([[maybe_unused]] n_t CallSite,

if (Leak.count(Source)) {
if (Leaks[CallSite].insert(Source).second) {
Warning<LLVMIFDSAnalysisDomainDefault> Warn(
CallSite, Source, topElement(),
DataFlowAnalysisType::IFDSTaintAnalysis);
Printer->onResult(Warn);
Printer->onResult(CallSite, Source, topElement(),
DataFlowAnalysisType::IFDSTaintAnalysis);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -204,10 +204,8 @@ IFDSUninitializedVariables::getNormalFlowFunction(
!llvm::isa<llvm::CastInst>(Curr) &&
!llvm::isa<llvm::PHINode>(Curr)) {
UndefValueUses[Curr].insert(Operand);
Warning<LLVMIFDSAnalysisDomainDefault> Warn(
Curr, Operand, BinaryDomain::TOP,
DataFlowAnalysisType::IFDSUninitializedVariables);
Printer->onResult(Warn);
Printer->onResult(Curr, Operand, BinaryDomain::TOP,
DataFlowAnalysisType::IFDSUninitializedVariables);
}
return {Source, Curr};
}
Expand Down
9 changes: 3 additions & 6 deletions lib/PhasarLLVM/Utils/SourceMgrPrinter.cpp
Original file line number Diff line number Diff line change
@@ -1,13 +1,10 @@
#include "phasar/PhasarLLVM/Utils/SourceMgrPrinter.h"

#include <llvm/Support/SourceMgr.h>

namespace psr {

llvm::StringMap<unsigned> FileNameIDMap{};
llvm::SourceMgr SrcMgr{};

std::optional<unsigned> getSourceBufId(llvm::StringRef FileName) {
std::optional<unsigned> getSourceBufId(llvm::StringRef FileName,
llvm::StringMap<unsigned> &FileNameIDMap,
llvm::SourceMgr &SrcMgr) {
if (auto It = FileNameIDMap.find(FileName); It != FileNameIDMap.end()) {
return It->second;
}
Expand Down
12 changes: 9 additions & 3 deletions unittests/Utils/AnalysisPrinterTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,11 @@ using CallBackPairTy = std::pair<IDEExtendedTaintAnalysis<>::config_callback_t,
// Use template to variate between Typesate and Taint analysis
class GroundTruthCollector
: public DefaultAnalysisPrinter<IDEExtendedTaintAnalysisDomain> {

using n_t = IDEExtendedTaintAnalysisDomain::n_t;
using d_t = IDEExtendedTaintAnalysisDomain::d_t;
using l_t = IDEExtendedTaintAnalysisDomain::l_t;

public:
// constructor init Groundtruth in each fixture
GroundTruthCollector(llvm::DenseMap<int, std::set<std::string>> &GroundTruth)
Expand All @@ -38,11 +43,12 @@ class GroundTruthCollector
}
}

void onResult(Warning<IDEExtendedTaintAnalysisDomain> Warn) override {
void onResult(n_t Instr, d_t DfFact, l_t /*LatticeElement*/,
DataFlowAnalysisType /*AnalysisType*/) override {
llvm::DenseMap<int, std::set<std::string>> FoundLeak;
int SinkId = stoi(getMetaDataID(Warn.Instr));
int SinkId = stoi(getMetaDataID(Instr));
std::set<std::string> LeakedValueIds;
LeakedValueIds.insert(getMetaDataID((Warn.Fact)->base()));
LeakedValueIds.insert(getMetaDataID((DfFact)->base()));
FoundLeak.try_emplace(SinkId, LeakedValueIds);
findAndRemove(FoundLeak, GroundTruth);
}
Expand Down
16 changes: 10 additions & 6 deletions unittests/Utils/OnTheFlyAnalysisPrinterTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,17 +7,20 @@
#include "phasar/PhasarLLVM/SimpleAnalysisConstructor.h"

#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/Support/raw_ostream.h"

#include "TestConfig.h"
#include "gtest/gtest.h"

#include <llvm/ADT/StringRef.h>
#include <llvm/Support/raw_ostream.h>

using namespace psr;

class GroundTruthCollector
: public OnTheFlyAnalysisPrinter<LLVMIFDSAnalysisDomainDefault> {
using n_t = LLVMIFDSAnalysisDomainDefault::n_t;
using d_t = LLVMIFDSAnalysisDomainDefault::d_t;
using l_t = LLVMIFDSAnalysisDomainDefault::l_t;

public:
// constructor init Groundtruth in each fixture
GroundTruthCollector(llvm::DenseMap<int, std::set<std::string>> &GroundTruth)
Expand All @@ -34,11 +37,12 @@ class GroundTruthCollector
}
}

void onResult(Warning<LLVMIFDSAnalysisDomainDefault> Warn) override {
void onResult(n_t Instr, d_t DfFact, l_t /*LatticeElement*/,
DataFlowAnalysisType /*AnalysisType*/) override {
llvm::DenseMap<int, std::set<std::string>> FoundLeak;
int SinkId = stoi(getMetaDataID(Warn.Instr));
int SinkId = stoi(getMetaDataID(Instr));
std::set<std::string> LeakedValueIds;
LeakedValueIds.insert(getMetaDataID((Warn.Fact)));
LeakedValueIds.insert(getMetaDataID((DfFact)));
FoundLeak.try_emplace(SinkId, LeakedValueIds);
findAndRemove(FoundLeak, GroundTruth);
}
Expand Down
Loading

0 comments on commit ca7565b

Please sign in to comment.