Skip to content

Commit a30fa2e

Browse files
committed
Introducing a dedicated file for LifetimeSafetyStats and changing the report format.
instead of using ExprClassName<QualType> it will be shown in the following way: ``` *** LifetimeSafety Missing Origin Stats (expression_type : count) : UnaryOperator (Type: const value_type) : 1 BinaryOperator (Type: char *) : 3 CXXOperatorCallExpr (Type: const value_type) : 2 CXXMemberCallExpr (Type: basic_string_view<char>) : 1 DeclRefExpr (Type: char *) : 9 CXXMemberCallExpr (Type: const_iterator) : 1 CXXOperatorCallExpr (Type: class std::basic_string<char>) : 1 DeclRefExpr (Type: std::string_view) : 27 CXXOperatorCallExpr (Type: basic_string<char>) : 3 Total missing origins: 48 ```
1 parent 0ca0f58 commit a30fa2e

File tree

9 files changed

+75
-55
lines changed

9 files changed

+75
-55
lines changed

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

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,11 @@
2121
#define LLVM_CLANG_ANALYSIS_ANALYSES_LIFETIMESAFETY_H
2222

2323
#include "clang/Analysis/Analyses/LifetimeSafety/Facts.h"
24+
#include "clang/Analysis/Analyses/LifetimeSafety/LifetimeStats.h"
2425
#include "clang/Analysis/Analyses/LifetimeSafety/LiveOrigins.h"
2526
#include "clang/Analysis/Analyses/LifetimeSafety/LoanPropagation.h"
2627
#include "clang/Analysis/Analyses/LifetimeSafety/Origins.h"
2728
#include "clang/Analysis/AnalysisDeclContext.h"
28-
#include "llvm/ADT/StringMap.h"
2929
#include "llvm/Support/raw_ostream.h"
3030
#include <string>
3131

@@ -38,14 +38,6 @@ enum class Confidence : uint8_t {
3838
Definite // Reported as a definite error (-Wlifetime-safety-permissive)
3939
};
4040

41-
/// A structure to hold the statistics related to LifetimeAnalysis.
42-
/// Currently it holds only the missing origin details.
43-
struct LifetimeSafetyStats {
44-
/// A map from `ExpressionClassName<QualType>` to their missing origin
45-
/// counts.
46-
llvm::StringMap<unsigned> MissingOriginCount;
47-
};
48-
4941
class LifetimeSafetyReporter {
5042
public:
5143
LifetimeSafetyReporter() = default;
@@ -61,9 +53,6 @@ class LifetimeSafetyReporter {
6153
Confidence Confidence) {}
6254
};
6355

64-
// utility function to print missing origin stats.
65-
void printStats(const LifetimeSafetyStats &Stats);
66-
6756
/// The main entry point for the analysis.
6857
void runLifetimeSafetyAnalysis(AnalysisDeclContext &AC,
6958
LifetimeSafetyReporter *Reporter,
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
//===- LifetimeStats.h - Miscellaneous statistics related to lifetime safety
2+
//analysis ---*- C++ -*-===//
3+
//
4+
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5+
// See https://llvm.org/LICENSE.txt for license information.
6+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7+
//
8+
//===----------------------------------------------------------------------------------------------===//
9+
//
10+
// This file declares the data structures and utility function for collection of
11+
// staticstics related to Lifetimesafety analysis.
12+
//
13+
//===----------------------------------------------------------------------------------------------===//
14+
15+
#ifndef LLVM_CLANG_ANALYSIS_ANALYSES_LIFETIMESAFETY_LIFETIMESTATS_H
16+
#define LLVM_CLANG_ANALYSIS_ANALYSES_LIFETIMESAFETY_LIFETIMESTATS_H
17+
18+
#include "llvm/ADT/StringMap.h"
19+
20+
namespace clang::lifetimes {
21+
/// A structure to hold the statistics related to LifetimeAnalysis.
22+
/// Currently it holds only the missing origin details.
23+
struct LifetimeSafetyStats {
24+
/// A map from `ExpressionClassName<QualType>` to their missing origin
25+
/// counts.
26+
llvm::StringMap<unsigned> MissingOriginCount;
27+
};
28+
29+
// utility function to print missing origin stats.
30+
void printStats(const LifetimeSafetyStats &Stats);
31+
} // namespace clang::lifetimes
32+
33+
#endif // LLVM_CLANG_ANALYSIS_ANALYSES_LIFETIMESAFETY_LIFETIMESTATS_H

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

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,17 +16,11 @@
1616

1717
#include "clang/AST/Decl.h"
1818
#include "clang/AST/Expr.h"
19-
#include "clang/AST/RecursiveASTVisitor.h"
2019
#include "clang/AST/TypeBase.h"
20+
#include "clang/Analysis/Analyses/LifetimeSafety/LifetimeStats.h"
2121
#include "clang/Analysis/Analyses/LifetimeSafety/Utils.h"
22-
#include "llvm/ADT/StringMap.h"
2322
#include "llvm/Support/raw_ostream.h"
2423

25-
namespace clang::lifetimes {
26-
27-
struct LifetimeSafetyStats;
28-
} // namespace clang::lifetimes
29-
3024
namespace clang::lifetimes::internal {
3125

3226
using OriginID = utils::ID<struct OriginTag>;

clang/include/clang/Sema/AnalysisBasedWarnings.h

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,9 @@
1616
#include "clang/AST/Decl.h"
1717
#include "clang/Analysis/Analyses/LifetimeSafety/Facts.h"
1818
#include "clang/Analysis/Analyses/LifetimeSafety/LifetimeSafety.h"
19+
#include "clang/Analysis/Analyses/LifetimeSafety/LifetimeStats.h"
1920
#include "clang/Analysis/AnalysisDeclContext.h"
2021
#include "clang/Sema/ScopeInfo.h"
21-
#include "llvm/ADT/DenseMap.h"
22-
#include "llvm/ADT/MapVector.h"
23-
#include "llvm/ADT/StringMap.h"
2422
#include <memory>
2523

2624
namespace clang {

clang/lib/Analysis/LifetimeSafety/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ add_clang_library(clangAnalysisLifetimeSafety
55
LifetimeAnnotations.cpp
66
LifetimeSafety.cpp
77
LiveOrigins.cpp
8+
LifetimeStats.cpp
89
Loans.cpp
910
LoanPropagation.cpp
1011
Origins.cpp

clang/lib/Analysis/LifetimeSafety/LifetimeSafety.cpp

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -18,17 +18,16 @@
1818
#include "clang/Analysis/Analyses/LifetimeSafety/Checker.h"
1919
#include "clang/Analysis/Analyses/LifetimeSafety/Facts.h"
2020
#include "clang/Analysis/Analyses/LifetimeSafety/FactsGenerator.h"
21+
#include "clang/Analysis/Analyses/LifetimeSafety/LifetimeStats.h"
2122
#include "clang/Analysis/Analyses/LifetimeSafety/LiveOrigins.h"
2223
#include "clang/Analysis/Analyses/LifetimeSafety/LoanPropagation.h"
2324
#include "clang/Analysis/Analyses/LifetimeSafety/Origins.h"
2425
#include "clang/Analysis/AnalysisDeclContext.h"
2526
#include "clang/Analysis/CFG.h"
2627
#include "llvm/ADT/FoldingSet.h"
27-
#include "llvm/ADT/StringMap.h"
2828
#include "llvm/Support/Debug.h"
2929
#include "llvm/Support/ErrorHandling.h"
3030
#include "llvm/Support/TimeProfiler.h"
31-
#include "llvm/Support/raw_ostream.h"
3231
#include <memory>
3332

3433
namespace clang::lifetimes {
@@ -81,18 +80,6 @@ void collectLifetimeStats(AnalysisDeclContext &AC, OriginManager &OM,
8180
}
8281
} // namespace internal
8382

84-
void printStats(const LifetimeSafetyStats &Stats) {
85-
llvm::errs() << "\n*** LifetimeSafety Missing Origin Stats "
86-
"(expression_type : count) :\n\n";
87-
unsigned TotalMissingOrigins = 0;
88-
for (const auto &[expr, count] : Stats.MissingOriginCount) {
89-
llvm::errs() << expr << " : " << count << '\n';
90-
TotalMissingOrigins += count;
91-
}
92-
llvm::errs() << "Total missing origins: " << TotalMissingOrigins << "\n";
93-
llvm::errs() << "\n****************************************\n";
94-
}
95-
9683
void runLifetimeSafetyAnalysis(AnalysisDeclContext &AC,
9784
LifetimeSafetyReporter *Reporter,
9885
LifetimeSafetyStats &Stats, bool CollectStats) {
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
//===- LifetimeStats.cpp - Miscellaneous statistics related to C++ Lifetime
2+
//Safety analysis -*--------- C++-*-===//
3+
//
4+
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5+
// See https://llvm.org/LICENSE.txt for license information.
6+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7+
//
8+
//===----------------------------------------------------------------------===//
9+
//
10+
// This file defines the data structures and utility function for collection of
11+
// staticstics related to Lifetimesafety analysis.
12+
//
13+
//===----------------------------------------------------------------------===//
14+
15+
#include "clang/Analysis/Analyses/LifetimeSafety/LifetimeStats.h"
16+
#include "llvm/Support/raw_ostream.h"
17+
18+
namespace clang::lifetimes {
19+
void printStats(const LifetimeSafetyStats &Stats) {
20+
llvm::errs() << "\n*** LifetimeSafety Missing Origin Stats "
21+
"(expression_type : count) :\n\n";
22+
unsigned TotalMissingOrigins = 0;
23+
for (const auto &[expr, count] : Stats.MissingOriginCount) {
24+
llvm::errs() << expr << " : " << count << '\n';
25+
TotalMissingOrigins += count;
26+
}
27+
llvm::errs() << "Total missing origins: " << TotalMissingOrigins << "\n";
28+
llvm::errs() << "\n****************************************\n";
29+
}
30+
} // namespace clang::lifetimes

clang/lib/Analysis/LifetimeSafety/Origins.cpp

Lines changed: 6 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -8,33 +8,21 @@
88

99
#include "clang/Analysis/Analyses/LifetimeSafety/Origins.h"
1010
#include "clang/AST/Expr.h"
11+
#include "clang/AST/RecursiveASTVisitor.h"
1112
#include "clang/AST/TypeBase.h"
12-
#include "clang/Analysis/Analyses/LifetimeSafety/LifetimeSafety.h"
13+
#include "clang/Analysis/Analyses/LifetimeSafety/LifetimeAnnotations.h"
14+
#include "clang/Analysis/Analyses/LifetimeSafety/LifetimeStats.h"
1315
#include "llvm/ADT/StringMap.h"
1416

1517
namespace clang::lifetimes::internal {
16-
17-
static bool isGslPointerType(QualType QT) {
18-
if (const auto *RD = QT->getAsCXXRecordDecl()) {
19-
// We need to check the template definition for specializations.
20-
if (auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(RD))
21-
return CTSD->getSpecializedTemplate()
22-
->getTemplatedDecl()
23-
->hasAttr<PointerAttr>();
24-
return RD->hasAttr<PointerAttr>();
25-
}
26-
return false;
27-
}
28-
29-
static bool isPointerType(QualType QT) {
18+
namespace {
19+
bool isPointerType(QualType QT) {
3020
return QT->isPointerOrReferenceType() || isGslPointerType(QT);
3121
}
3222
// Check if a type has an origin.
33-
static bool hasOrigin(const Expr *E) {
23+
bool hasOrigin(const Expr *E) {
3424
return E->isGLValue() || isPointerType(E->getType());
3525
}
36-
37-
namespace {
3826
/// An utility class to traverse the function body in the analysis
3927
/// context and collect the count of expressions with missing origins.
4028
class MissingOriginCollector

clang/lib/Sema/AnalysisBasedWarnings.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3175,8 +3175,8 @@ void clang::sema::AnalysisBasedWarnings::IssueWarnings(
31753175
}
31763176

31773177
void clang::sema::AnalysisBasedWarnings::PrintStats() const {
3178-
31793178
llvm::errs() << "\n*** Analysis Based Warnings Stats:\n";
3179+
31803180
unsigned NumCFGsBuilt = NumFunctionsAnalyzed - NumFunctionsWithBadCFGs;
31813181
unsigned AvgCFGBlocksPerFunction =
31823182
!NumCFGsBuilt ? 0 : NumCFGBlocks/NumCFGsBuilt;

0 commit comments

Comments
 (0)