Skip to content

Commit 7844829

Browse files
author
Debadri Basak
committed
Adding the missing origin count logic to AnalysisBasedWarnings
1 parent fa85d2d commit 7844829

File tree

6 files changed

+67
-38
lines changed

6 files changed

+67
-38
lines changed

clang/include/clang/Analysis/Analyses/LifetimeSafety/LifetimeSafety.h

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -48,10 +48,6 @@ class LifetimeSafetyReporter {
4848
Confidence Confidence) {}
4949
};
5050

51-
/// The main entry point for the analysis.
52-
void runLifetimeSafetyAnalysis(AnalysisDeclContext &AC,
53-
LifetimeSafetyReporter *Reporter);
54-
5551
namespace internal {
5652
/// An object to hold the factories for immutable collections, ensuring
5753
/// that all created states share the same underlying memory management.
@@ -64,8 +60,6 @@ struct LifetimeFactory {
6460
/// Running the lifetime safety analysis and querying its results. It
6561
/// encapsulates the various dataflow analyses.
6662
class LifetimeSafetyAnalysis {
67-
private:
68-
static llvm::StringMap<int> MissingOriginCount;
6963

7064
public:
7165
LifetimeSafetyAnalysis(AnalysisDeclContext &AC,
@@ -80,10 +74,6 @@ class LifetimeSafetyAnalysis {
8074
LiveOriginsAnalysis &getLiveOrigins() const { return *LiveOrigins; }
8175
FactManager &getFactManager() { return FactMgr; }
8276

83-
static void PrintStats(llvm::raw_ostream &OS);
84-
85-
static void UpdateMissingOriginCount(const OriginManager &OM);
86-
8777
private:
8878
AnalysisDeclContext &AC;
8979
LifetimeSafetyReporter *Reporter;
@@ -93,6 +83,12 @@ class LifetimeSafetyAnalysis {
9383
std::unique_ptr<LoanPropagationAnalysis> LoanPropagation;
9484
};
9585
} // namespace internal
86+
87+
/// The main entry point for the analysis.
88+
std::unique_ptr<internal::LifetimeSafetyAnalysis>
89+
runLifetimeSafetyAnalysis(AnalysisDeclContext &AC,
90+
LifetimeSafetyReporter *Reporter);
91+
9692
} // namespace clang::lifetimes
9793

9894
#endif // LLVM_CLANG_ANALYSIS_ANALYSES_LIFETIMESAFETY_H

clang/include/clang/Analysis/Analyses/LifetimeSafety/Origins.h

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,10 @@ class OriginManager {
7979

8080
void dump(OriginID OID, llvm::raw_ostream &OS) const;
8181

82-
const llvm::StringMap<int> getMissingOrigins() const;
82+
const llvm::StringMap<unsigned> getMissingOrigins() const;
83+
84+
// Utility function to check if an origin is missing for a given expression.
85+
bool isOriginMissing(const Expr &E) const;
8386

8487
private:
8588
OriginID getNextOriginID() { return NextOriginID++; }
@@ -90,7 +93,7 @@ class OriginManager {
9093
llvm::SmallVector<Origin> AllOrigins;
9194
llvm::DenseMap<const clang::ValueDecl *, OriginID> DeclToOriginID;
9295
llvm::DenseMap<const clang::Expr *, OriginID> ExprToOriginID;
93-
llvm::StringMap<int> ExprTypeToMissingOriginCount;
96+
llvm::StringMap<unsigned> ExprTypeToMissingOriginCount;
9497
};
9598
} // namespace clang::lifetimes::internal
9699

clang/include/clang/Sema/AnalysisBasedWarnings.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,10 @@
1414
#define LLVM_CLANG_SEMA_ANALYSISBASEDWARNINGS_H
1515

1616
#include "clang/AST/Decl.h"
17+
#include "clang/Analysis/Analyses/LifetimeSafety/Facts.h"
18+
#include "clang/Analysis/AnalysisDeclContext.h"
1719
#include "llvm/ADT/DenseMap.h"
20+
#include "llvm/ADT/StringMap.h"
1821
#include <memory>
1922

2023
namespace clang {
@@ -95,6 +98,9 @@ class AnalysisBasedWarnings {
9598
/// a single function.
9699
unsigned MaxUninitAnalysisBlockVisitsPerFunction;
97100

101+
/// Map from expressions missing origin in OriginManager to their counts.
102+
llvm::StringMap<unsigned> MissingOriginCount;
103+
98104
/// @}
99105

100106
public:
@@ -116,6 +122,9 @@ class AnalysisBasedWarnings {
116122
Policy &getPolicyOverrides() { return PolicyOverrides; }
117123

118124
void PrintStats() const;
125+
126+
void FindMissingOrigins(AnalysisDeclContext &AC,
127+
clang::lifetimes::internal::FactManager &FactMgr);
119128
};
120129

121130
} // namespace sema

clang/lib/Analysis/LifetimeSafety/LifetimeSafety.cpp

Lines changed: 7 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -33,25 +33,10 @@
3333
namespace clang::lifetimes {
3434
namespace internal {
3535

36-
llvm::StringMap<int> LifetimeSafetyAnalysis::MissingOriginCount;
37-
3836
LifetimeSafetyAnalysis::LifetimeSafetyAnalysis(AnalysisDeclContext &AC,
3937
LifetimeSafetyReporter *Reporter)
4038
: AC(AC), Reporter(Reporter) {}
4139

42-
void LifetimeSafetyAnalysis::PrintStats(llvm::raw_ostream &OS) {
43-
llvm::errs() << "\n*** LifetimeSafety Missing Origin Stats "
44-
"(expression_type : count) :\n";
45-
for (const auto &[expr, count] : LifetimeSafetyAnalysis::MissingOriginCount) {
46-
OS << expr << " : " << count << '\n';
47-
}
48-
}
49-
50-
void LifetimeSafetyAnalysis::UpdateMissingOriginCount(const OriginManager &OM) {
51-
for (const auto &[expr, missing_origin_count] : OM.getMissingOrigins()) {
52-
LifetimeSafetyAnalysis::MissingOriginCount[std::string(expr)] += missing_origin_count;
53-
}
54-
}
5540
void LifetimeSafetyAnalysis::run() {
5641
llvm::TimeTraceScope TimeProfile("LifetimeSafetyAnalysis");
5742

@@ -83,13 +68,15 @@ void LifetimeSafetyAnalysis::run() {
8368
LiveOrigins->dump(llvm::dbgs(), FactMgr.getTestPoints()));
8469

8570
runLifetimeChecker(*LoanPropagation, *LiveOrigins, FactMgr, AC, Reporter);
86-
UpdateMissingOriginCount(FactMgr.getOriginMgr());
8771
}
8872
} // namespace internal
8973

90-
void runLifetimeSafetyAnalysis(AnalysisDeclContext &AC,
91-
LifetimeSafetyReporter *Reporter) {
92-
internal::LifetimeSafetyAnalysis Analysis(AC, Reporter);
93-
Analysis.run();
74+
std::unique_ptr<internal::LifetimeSafetyAnalysis>
75+
runLifetimeSafetyAnalysis(AnalysisDeclContext &AC,
76+
LifetimeSafetyReporter *Reporter) {
77+
std::unique_ptr<internal::LifetimeSafetyAnalysis> Analysis =
78+
std::make_unique<internal::LifetimeSafetyAnalysis>(AC, Reporter);
79+
Analysis->run();
80+
return Analysis;
9481
}
9582
} // namespace clang::lifetimes

clang/lib/Analysis/LifetimeSafety/Origins.cpp

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
//===----------------------------------------------------------------------===//
88

99
#include "clang/Analysis/Analyses/LifetimeSafety/Origins.h"
10+
#include "clang/AST/Expr.h"
1011
#include "clang/AST/TypeBase.h"
1112
#include "llvm/ADT/StringMap.h"
1213

@@ -24,7 +25,7 @@ void OriginManager::dump(OriginID OID, llvm::raw_ostream &OS) const {
2425
OS << ")";
2526
}
2627

27-
const llvm::StringMap<int> OriginManager::getMissingOrigins() const {
28+
const llvm::StringMap<unsigned> OriginManager::getMissingOrigins() const {
2829
return ExprTypeToMissingOriginCount;
2930
}
3031

@@ -46,10 +47,12 @@ OriginID OriginManager::get(const Expr &E) {
4647

4748
// if the expression has no specific origin, increment the missing origin
4849
// counter.
49-
const QualType ExprType = E.getType();
50-
auto CountIt = ExprTypeToMissingOriginCount.find(ExprType.getAsString());
50+
// const QualType ExprType = E.getType();
51+
std::string ExprStr(E.getStmtClassName());
52+
ExprStr = ExprStr + "<" + E.getType().getAsString() + ">";
53+
auto CountIt = ExprTypeToMissingOriginCount.find(ExprStr);
5154
if (CountIt == ExprTypeToMissingOriginCount.end()) {
52-
ExprTypeToMissingOriginCount[ExprType.getAsString()] = 1;
55+
ExprTypeToMissingOriginCount[ExprStr] = 1;
5356
} else {
5457
CountIt->second++;
5558
}
@@ -102,4 +105,9 @@ OriginID OriginManager::getOrCreate(const ValueDecl &D) {
102105
return NewID;
103106
}
104107

108+
bool OriginManager::isOriginMissing(const Expr &E) const {
109+
auto It = ExprToOriginID.find(&E);
110+
return It == ExprToOriginID.end();
111+
}
112+
105113
} // namespace clang::lifetimes::internal

clang/lib/Sema/AnalysisBasedWarnings.cpp

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,10 @@
2929
#include "clang/Analysis/Analyses/CFGReachabilityAnalysis.h"
3030
#include "clang/Analysis/Analyses/CalledOnceCheck.h"
3131
#include "clang/Analysis/Analyses/Consumed.h"
32+
#include "clang/Analysis/Analyses/LifetimeSafety/Facts.h"
3233
#include "clang/Analysis/Analyses/LifetimeSafety/LifetimeSafety.h"
3334
#include "clang/Analysis/Analyses/LifetimeSafety/Origins.h"
35+
#include "clang/Analysis/Analyses/PostOrderCFGView.h"
3436
#include "clang/Analysis/Analyses/ReachableCode.h"
3537
#include "clang/Analysis/Analyses/ThreadSafety.h"
3638
#include "clang/Analysis/Analyses/UninitializedValues.h"
@@ -53,6 +55,7 @@
5355
#include "llvm/ADT/STLFunctionalExtras.h"
5456
#include "llvm/ADT/SmallVector.h"
5557
#include "llvm/ADT/StringRef.h"
58+
#include "llvm/Support/Casting.h"
5659
#include "llvm/Support/Debug.h"
5760
#include "llvm/Support/raw_ostream.h"
5861
#include <algorithm>
@@ -3067,7 +3070,11 @@ void clang::sema::AnalysisBasedWarnings::IssueWarnings(
30673070
if (EnableLifetimeSafetyAnalysis && S.getLangOpts().CPlusPlus) {
30683071
if (AC.getCFG()) {
30693072
lifetimes::LifetimeSafetyReporterImpl LifetimeSafetyReporter(S);
3070-
lifetimes::runLifetimeSafetyAnalysis(AC, &LifetimeSafetyReporter);
3073+
std::unique_ptr<clang::lifetimes::internal::LifetimeSafetyAnalysis>
3074+
Analysis =
3075+
lifetimes::runLifetimeSafetyAnalysis(AC, &LifetimeSafetyReporter);
3076+
if (S.CollectStats)
3077+
FindMissingOrigins(AC, Analysis->getFactManager());
30713078
}
30723079
}
30733080
// Check for violations of "called once" parameter properties.
@@ -3133,8 +3140,27 @@ void clang::sema::AnalysisBasedWarnings::IssueWarnings(
31333140
}
31343141
}
31353142

3143+
void clang::sema::AnalysisBasedWarnings::FindMissingOrigins(
3144+
AnalysisDeclContext &AC, lifetimes::internal::FactManager &FactMgr) {
3145+
if (AC.getCFG()) {
3146+
for (const auto &[expr, count] :
3147+
FactMgr.getOriginMgr().getMissingOrigins()) {
3148+
MissingOriginCount[expr] += count;
3149+
}
3150+
}
3151+
}
3152+
31363153
void clang::sema::AnalysisBasedWarnings::PrintStats() const {
3137-
clang::lifetimes::internal::LifetimeSafetyAnalysis::PrintStats(llvm::errs());
3154+
// clang::lifetimes::internal::LifetimeSafetyAnalysis::PrintStats(llvm::errs());
3155+
llvm::errs() << "\n*** LifetimeSafety Missing Origin Stats "
3156+
"(expression_type : count) :\n";
3157+
unsigned totalMissingOrigins = 0;
3158+
for (const auto &[expr, count] : MissingOriginCount) {
3159+
llvm::errs() << expr << " : " << count << '\n';
3160+
totalMissingOrigins += count;
3161+
}
3162+
llvm::errs() << "Total missing origins: " << totalMissingOrigins << "\n";
3163+
llvm::errs() << "****************************************\n";
31383164
llvm::errs() << "\n*** Analysis Based Warnings Stats:\n";
31393165
unsigned NumCFGsBuilt = NumFunctionsAnalyzed - NumFunctionsWithBadCFGs;
31403166
unsigned AvgCFGBlocksPerFunction =

0 commit comments

Comments
 (0)