mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2024-11-23 22:00:10 +00:00
Revert "Revert "Revert "[analyzer] NFC: Move path diagnostic consumer implementations to libAnalysis."""
This reverts commit d2ddc694ff
.
This still contains a circular dependency between Analysis and CrossTU:
$ grep -r include.*Analysis clang/include/clang/CrossTU
clang/include/clang/CrossTU/CrossTranslationUnit.h:
#include "clang/Analysis/CrossTUAnalysisHelper.h"
$ grep -r include.*CrossTU clang/lib/Analysis
clang/lib/Analysis/PlistHTMLPathDiagnosticConsumer.cpp:
#include "clang/CrossTU/CrossTranslationUnit.h"
clang/lib/Analysis/PlistPathDiagnosticConsumer.cpp:
#include "clang/Analysis/CrossTUAnalysisHelper.h"
This commit is contained in:
parent
658a1be76b
commit
b12f26733a
@ -1,41 +0,0 @@
|
||||
//===- CrossTUAnalysisHelper.h - Abstraction layer for CTU ------*- C++ -*-===//
|
||||
//
|
||||
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
||||
// See https://llvm.org/LICENSE.txt for license information.
|
||||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
#ifndef LLVM_CLANG_ANALYSIS_CROSS_TU_HELPER_H
|
||||
#define LLVM_CLANG_ANALYSIS_CROSS_TU_HELPER_H
|
||||
|
||||
#include "llvm/ADT/Optional.h"
|
||||
#include "clang/Basic/SourceManager.h"
|
||||
|
||||
namespace clang {
|
||||
|
||||
class ASTUnit;
|
||||
|
||||
/// This class is an abstract interface acting as a bridge between
|
||||
/// an analysis that requires lookups across translation units (a user
|
||||
/// of that interface) and the facility that implements such lookups
|
||||
/// (an implementation of that interface). This is useful to break direct
|
||||
/// link-time dependencies between the (possibly shared) libraries in which
|
||||
/// the user and the implementation live.
|
||||
class CrossTUAnalysisHelper {
|
||||
public:
|
||||
/// Determine the original source location in the original TU for an
|
||||
/// imported source location.
|
||||
/// \p ToLoc Source location in the imported-to AST.
|
||||
/// \return Source location in the imported-from AST and the corresponding
|
||||
/// ASTUnit object (the AST was loaded from a file using an internal ASTUnit
|
||||
/// object that is returned here).
|
||||
/// If any error happens (ToLoc is a non-imported source location) empty is
|
||||
/// returned.
|
||||
virtual llvm::Optional<std::pair<SourceLocation /*FromLoc*/, Preprocessor *>>
|
||||
getImportedFromSourceLocationWithPreprocessor(SourceLocation ToLoc) const = 0;
|
||||
|
||||
virtual ~CrossTUAnalysisHelper() {}
|
||||
};
|
||||
} // namespace clang
|
||||
|
||||
#endif // LLVM_CLANG_ANALYSIS_CROSS_TU_HELPER_H
|
@ -1,50 +0,0 @@
|
||||
//===-- PathDiagnosticConsumers.def - Visualizing warnings ------*- C++ -*-===//
|
||||
//
|
||||
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
||||
// See https://llvm.org/LICENSE.txt for license information.
|
||||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// This file defines the set of path diagnostic consumers - objects that
|
||||
// implement different representations of static analysis results.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifndef ANALYSIS_DIAGNOSTICS
|
||||
#define ANALYSIS_DIAGNOSTICS(NAME, CMDFLAG, DESC, CREATEFN)
|
||||
#endif
|
||||
|
||||
ANALYSIS_DIAGNOSTICS(HTML, "html", "Output analysis results using HTML",
|
||||
createHTMLDiagnosticConsumer)
|
||||
|
||||
ANALYSIS_DIAGNOSTICS(
|
||||
HTML_SINGLE_FILE, "html-single-file",
|
||||
"Output analysis results using HTML (not allowing for multi-file bugs)",
|
||||
createHTMLSingleFileDiagnosticConsumer)
|
||||
|
||||
ANALYSIS_DIAGNOSTICS(PLIST, "plist", "Output analysis results using Plists",
|
||||
createPlistDiagnosticConsumer)
|
||||
|
||||
ANALYSIS_DIAGNOSTICS(
|
||||
PLIST_MULTI_FILE, "plist-multi-file",
|
||||
"Output analysis results using Plists (allowing for multi-file bugs)",
|
||||
createPlistMultiFileDiagnosticConsumer)
|
||||
|
||||
ANALYSIS_DIAGNOSTICS(PLIST_HTML, "plist-html",
|
||||
"Output analysis results using HTML wrapped with Plists",
|
||||
createPlistHTMLDiagnosticConsumer)
|
||||
|
||||
ANALYSIS_DIAGNOSTICS(SARIF, "sarif", "Output analysis results in a SARIF file",
|
||||
createSarifDiagnosticConsumer)
|
||||
|
||||
ANALYSIS_DIAGNOSTICS(TEXT, "text", "Text output of analysis results to stderr",
|
||||
createTextPathDiagnosticConsumer)
|
||||
|
||||
ANALYSIS_DIAGNOSTICS(TEXT_MINIMAL, "text-minimal",
|
||||
"Emits minimal diagnostics to stderr, stating only the "
|
||||
"warning message and the associated notes. Usually "
|
||||
"used in addition to other analysis types",
|
||||
createTextMinimalPathDiagnosticConsumer)
|
||||
|
||||
#undef ANALYSIS_DIAGNOSTICS
|
@ -14,7 +14,6 @@
|
||||
#ifndef LLVM_CLANG_CROSSTU_CROSSTRANSLATIONUNIT_H
|
||||
#define LLVM_CLANG_CROSSTU_CROSSTRANSLATIONUNIT_H
|
||||
|
||||
#include "clang/Analysis/CrossTUAnalysisHelper.h"
|
||||
#include "clang/AST/ASTImporterSharedState.h"
|
||||
#include "clang/Basic/LLVM.h"
|
||||
#include "llvm/ADT/DenseMap.h"
|
||||
@ -121,10 +120,10 @@ bool containsConst(const VarDecl *VD, const ASTContext &ACtx);
|
||||
/// the locations of the AST files for each definition.
|
||||
///
|
||||
/// Note that this class also implements caching.
|
||||
class CrossTranslationUnitContext : public CrossTUAnalysisHelper {
|
||||
class CrossTranslationUnitContext {
|
||||
public:
|
||||
CrossTranslationUnitContext(CompilerInstance &CI);
|
||||
~CrossTranslationUnitContext() override;
|
||||
~CrossTranslationUnitContext();
|
||||
|
||||
/// This function loads a function or variable definition from an
|
||||
/// external AST file and merges it into the original AST.
|
||||
@ -187,24 +186,12 @@ public:
|
||||
/// imported source location.
|
||||
/// \p ToLoc Source location in the imported-to AST.
|
||||
/// \return Source location in the imported-from AST and the corresponding
|
||||
/// ASTUnit object (the AST was loaded from a file using an internal ASTUni
|
||||
/// ASTUnit object (the AST was loaded from a file using an internal ASTUnit
|
||||
/// object that is returned here).
|
||||
/// If any error happens (ToLoc is a non-imported source location) empty is
|
||||
/// returned.
|
||||
llvm::Optional<std::pair<SourceLocation /*FromLoc*/, ASTUnit *>>
|
||||
getImportedFromSourceLocation(SourceLocation ToLoc) const;
|
||||
|
||||
/// Determine the original source location in the original TU for an
|
||||
/// imported source location.
|
||||
/// \p ToLoc Source location in the imported-to AST.
|
||||
/// \return Source location in the imported-from AST and the Preprocessor
|
||||
/// corresponding to the AST unit that originally contained the imported-from
|
||||
/// source location.
|
||||
/// If any error happens (ToLoc is a non-imported source location) empty is
|
||||
/// returned.
|
||||
llvm::Optional<std::pair<SourceLocation /*FromLoc*/, Preprocessor *>>
|
||||
getImportedFromSourceLocationWithPreprocessor(
|
||||
SourceLocation ToLoc) const override;
|
||||
getImportedFromSourceLocation(const clang::SourceLocation &ToLoc) const;
|
||||
|
||||
private:
|
||||
using ImportedFileIDMap =
|
||||
|
@ -28,6 +28,42 @@ ANALYSIS_CONSTRAINTS(RangeConstraints, "range",
|
||||
ANALYSIS_CONSTRAINTS(Z3Constraints, "z3", "Use Z3 contraint solver",
|
||||
CreateZ3ConstraintManager)
|
||||
|
||||
#ifndef ANALYSIS_DIAGNOSTICS
|
||||
#define ANALYSIS_DIAGNOSTICS(NAME, CMDFLAG, DESC, CREATEFN)
|
||||
#endif
|
||||
|
||||
ANALYSIS_DIAGNOSTICS(HTML, "html", "Output analysis results using HTML",
|
||||
createHTMLDiagnosticConsumer)
|
||||
|
||||
ANALYSIS_DIAGNOSTICS(
|
||||
HTML_SINGLE_FILE, "html-single-file",
|
||||
"Output analysis results using HTML (not allowing for multi-file bugs)",
|
||||
createHTMLSingleFileDiagnosticConsumer)
|
||||
|
||||
ANALYSIS_DIAGNOSTICS(PLIST, "plist", "Output analysis results using Plists",
|
||||
createPlistDiagnosticConsumer)
|
||||
|
||||
ANALYSIS_DIAGNOSTICS(
|
||||
PLIST_MULTI_FILE, "plist-multi-file",
|
||||
"Output analysis results using Plists (allowing for multi-file bugs)",
|
||||
createPlistMultiFileDiagnosticConsumer)
|
||||
|
||||
ANALYSIS_DIAGNOSTICS(PLIST_HTML, "plist-html",
|
||||
"Output analysis results using HTML wrapped with Plists",
|
||||
createPlistHTMLDiagnosticConsumer)
|
||||
|
||||
ANALYSIS_DIAGNOSTICS(SARIF, "sarif", "Output analysis results in a SARIF file",
|
||||
createSarifDiagnosticConsumer)
|
||||
|
||||
ANALYSIS_DIAGNOSTICS(TEXT, "text", "Text output of analysis results to stderr",
|
||||
createTextPathDiagnosticConsumer)
|
||||
|
||||
ANALYSIS_DIAGNOSTICS(TEXT_MINIMAL, "text-minimal",
|
||||
"Emits minimal diagnostics to stderr, stating only the "
|
||||
"warning message and the associated notes. Usually "
|
||||
"used in addition to other analysis types",
|
||||
createTextMinimalPathDiagnosticConsumer)
|
||||
|
||||
#ifndef ANALYSIS_PURGE
|
||||
#define ANALYSIS_PURGE(NAME, CMDFLAG, DESC)
|
||||
#endif
|
||||
@ -55,6 +91,7 @@ ANALYSIS_INLINING_MODE(
|
||||
|
||||
#undef ANALYSIS_STORE
|
||||
#undef ANALYSIS_CONSTRAINTS
|
||||
#undef ANALYSIS_DIAGNOSTICS
|
||||
#undef ANALYSIS_PURGE
|
||||
#undef ANALYSIS_INLINING_MODE
|
||||
#undef ANALYSIS_IPA
|
||||
|
@ -58,7 +58,7 @@ NumConstraints
|
||||
/// analysis results.
|
||||
enum AnalysisDiagClients {
|
||||
#define ANALYSIS_DIAGNOSTICS(NAME, CMDFLAG, DESC, CREATFN) PD_##NAME,
|
||||
#include "clang/Analysis/PathDiagnosticConsumers.def"
|
||||
#include "clang/StaticAnalyzer/Core/Analyses.def"
|
||||
PD_NONE,
|
||||
NUM_ANALYSIS_DIAG_CLIENTS
|
||||
};
|
||||
|
@ -18,24 +18,25 @@
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
#include "clang/Analysis/PathDiagnostic.h"
|
||||
|
||||
namespace clang {
|
||||
|
||||
class AnalyzerOptions;
|
||||
class Preprocessor;
|
||||
class CrossTUAnalysisHelper;
|
||||
namespace cross_tu {
|
||||
class CrossTranslationUnitContext;
|
||||
}
|
||||
|
||||
namespace ento {
|
||||
|
||||
class PathDiagnosticConsumer;
|
||||
typedef std::vector<PathDiagnosticConsumer *> PathDiagnosticConsumers;
|
||||
typedef std::vector<PathDiagnosticConsumer*> PathDiagnosticConsumers;
|
||||
|
||||
#define ANALYSIS_DIAGNOSTICS(NAME, CMDFLAG, DESC, CREATEFN) \
|
||||
void CREATEFN(PathDiagnosticConsumerOptions Diagopts, \
|
||||
PathDiagnosticConsumers &C, const std::string &Prefix, \
|
||||
const Preprocessor &PP, const CrossTUAnalysisHelper &CTU);
|
||||
#include "clang/Analysis/PathDiagnosticConsumers.def"
|
||||
const Preprocessor &PP, \
|
||||
const cross_tu::CrossTranslationUnitContext &CTU);
|
||||
#include "clang/StaticAnalyzer/Core/Analyses.def"
|
||||
|
||||
} // end 'ento' namespace
|
||||
} // end 'clang' namespace
|
@ -16,10 +16,10 @@
|
||||
|
||||
#include "clang/Analysis/AnalysisDeclContext.h"
|
||||
#include "clang/Analysis/PathDiagnostic.h"
|
||||
#include "clang/Analysis/PathDiagnosticConsumers.h"
|
||||
#include "clang/Lex/Preprocessor.h"
|
||||
#include "clang/StaticAnalyzer/Core/AnalyzerOptions.h"
|
||||
#include "clang/StaticAnalyzer/Core/BugReporter/BugReporter.h"
|
||||
#include "clang/StaticAnalyzer/Core/PathDiagnosticConsumers.h"
|
||||
|
||||
namespace clang {
|
||||
|
||||
|
@ -3,7 +3,6 @@ module Clang_Analysis {
|
||||
umbrella "Analysis"
|
||||
|
||||
textual header "Analysis/Analyses/ThreadSafetyOps.def"
|
||||
textual header "Analysis/PathDiagnosticConsumers.def"
|
||||
|
||||
module * { export * }
|
||||
|
||||
|
@ -18,19 +18,14 @@ add_clang_library(clangAnalysis
|
||||
CodeInjector.cpp
|
||||
Dominators.cpp
|
||||
ExprMutationAnalyzer.cpp
|
||||
HTMLPathDiagnosticConsumer.cpp
|
||||
IssueHash.cpp
|
||||
LiveVariables.cpp
|
||||
ObjCNoReturn.cpp
|
||||
PathDiagnostic.cpp
|
||||
PlistPathDiagnosticConsumer.cpp
|
||||
PlistHTMLPathDiagnosticConsumer.cpp
|
||||
PostOrderCFGView.cpp
|
||||
ProgramPoint.cpp
|
||||
ReachableCode.cpp
|
||||
RetainSummaryManager.cpp
|
||||
SarifPathDiagnosticConsumer.cpp
|
||||
TextPathDiagnosticConsumer.cpp
|
||||
ThreadSafety.cpp
|
||||
ThreadSafetyCommon.cpp
|
||||
ThreadSafetyLogical.cpp
|
||||
@ -42,8 +37,6 @@ add_clang_library(clangAnalysis
|
||||
clangASTMatchers
|
||||
clangBasic
|
||||
clangLex
|
||||
clangRewrite
|
||||
clangToolingCore
|
||||
|
||||
DEPENDS
|
||||
omp_gen
|
||||
|
@ -1,35 +0,0 @@
|
||||
//===--- PlistHTMLDiagnostics.cpp - The Plist-HTML Diagnostic Consumer. ---===//
|
||||
//
|
||||
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
||||
// See https://llvm.org/LICENSE.txt for license information.
|
||||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// This diagnostic consumer produces both the HTML output and the Plist output.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "clang/Analysis/PathDiagnostic.h"
|
||||
#include "clang/Analysis/PathDiagnosticConsumers.h"
|
||||
#include "clang/Basic/SourceManager.h"
|
||||
#include "clang/CrossTU/CrossTranslationUnit.h"
|
||||
#include "clang/Lex/Preprocessor.h"
|
||||
|
||||
using namespace clang;
|
||||
using namespace ento;
|
||||
|
||||
namespace clang {
|
||||
class CrossTUAnalysisHelper;
|
||||
}
|
||||
|
||||
void ento::createPlistHTMLDiagnosticConsumer(
|
||||
PathDiagnosticConsumerOptions DiagOpts, PathDiagnosticConsumers &C,
|
||||
const std::string &Prefix, const Preprocessor &PP,
|
||||
const CrossTUAnalysisHelper &CTU) {
|
||||
createHTMLDiagnosticConsumer(
|
||||
DiagOpts, C, std::string(llvm::sys::path::parent_path(Prefix)), PP, CTU);
|
||||
createPlistMultiFileDiagnosticConsumer(DiagOpts, C, Prefix, PP, CTU);
|
||||
createTextMinimalPathDiagnosticConsumer(std::move(DiagOpts), C, Prefix, PP,
|
||||
CTU);
|
||||
}
|
@ -765,7 +765,7 @@ CrossTranslationUnitContext::getOrCreateASTImporter(ASTUnit *Unit) {
|
||||
|
||||
llvm::Optional<std::pair<SourceLocation, ASTUnit *>>
|
||||
CrossTranslationUnitContext::getImportedFromSourceLocation(
|
||||
SourceLocation ToLoc) const {
|
||||
const clang::SourceLocation &ToLoc) const {
|
||||
const SourceManager &SM = Context.getSourceManager();
|
||||
auto DecToLoc = SM.getDecomposedLoc(ToLoc);
|
||||
|
||||
@ -781,16 +781,5 @@ CrossTranslationUnitContext::getImportedFromSourceLocation(
|
||||
return std::make_pair(FromLoc, Unit);
|
||||
}
|
||||
|
||||
llvm::Optional<std::pair<SourceLocation, Preprocessor *>>
|
||||
CrossTranslationUnitContext::getImportedFromSourceLocationWithPreprocessor(
|
||||
SourceLocation ToLoc) const {
|
||||
if (llvm::Optional<std::pair<SourceLocation, ASTUnit *>> LocAndUnit =
|
||||
getImportedFromSourceLocation(ToLoc)) {
|
||||
return std::make_pair(LocAndUnit->first,
|
||||
&LocAndUnit->second->getPreprocessor());
|
||||
}
|
||||
return None;
|
||||
}
|
||||
|
||||
} // namespace cross_tu
|
||||
} // namespace clang
|
||||
|
@ -571,7 +571,7 @@ static bool ParseAnalyzerArgs(AnalyzerOptions &Opts, ArgList &Args,
|
||||
AnalysisDiagClients Value = llvm::StringSwitch<AnalysisDiagClients>(Name)
|
||||
#define ANALYSIS_DIAGNOSTICS(NAME, CMDFLAG, DESC, CREATFN) \
|
||||
.Case(CMDFLAG, PD_##NAME)
|
||||
#include "clang/Analysis/PathDiagnosticConsumers.def"
|
||||
#include "clang/StaticAnalyzer/Core/Analyses.def"
|
||||
.Default(NUM_ANALYSIS_DIAG_CLIENTS);
|
||||
if (Value == NUM_ANALYSIS_DIAG_CLIENTS) {
|
||||
Diags.Report(diag::err_drv_invalid_value)
|
||||
|
@ -30,13 +30,16 @@ add_clang_library(clangStaticAnalyzerCore
|
||||
ExprEngineCallAndReturn.cpp
|
||||
ExprEngineObjC.cpp
|
||||
FunctionSummary.cpp
|
||||
HTMLDiagnostics.cpp
|
||||
LoopUnrolling.cpp
|
||||
LoopWidening.cpp
|
||||
MemRegion.cpp
|
||||
PlistDiagnostics.cpp
|
||||
ProgramState.cpp
|
||||
RangeConstraintManager.cpp
|
||||
RangedConstraintManager.cpp
|
||||
RegionStore.cpp
|
||||
SarifDiagnostics.cpp
|
||||
SimpleConstraintManager.cpp
|
||||
SimpleSValBuilder.cpp
|
||||
SMTConstraintManager.cpp
|
||||
@ -44,6 +47,7 @@ add_clang_library(clangStaticAnalyzerCore
|
||||
SValBuilder.cpp
|
||||
SVals.cpp
|
||||
SymbolManager.cpp
|
||||
TextDiagnostics.cpp
|
||||
WorkList.cpp
|
||||
|
||||
LINK_LIBS
|
||||
|
@ -1,4 +1,4 @@
|
||||
//===- HTMLPathDiagnosticConsumer.cpp - HTML Diagnostics for Paths --------===//
|
||||
//===- HTMLDiagnostics.cpp - HTML Diagnostics for Paths -------------------===//
|
||||
//
|
||||
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
||||
// See https://llvm.org/LICENSE.txt for license information.
|
||||
@ -6,13 +6,12 @@
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// This file defines the HTMLPathDiagnosticConsumer object.
|
||||
// This file defines the HTMLDiagnostics object.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "clang/Analysis/IssueHash.h"
|
||||
#include "clang/Analysis/PathDiagnostic.h"
|
||||
#include "clang/Analysis/PathDiagnosticConsumers.h"
|
||||
#include "clang/AST/Decl.h"
|
||||
#include "clang/AST/DeclBase.h"
|
||||
#include "clang/AST/Stmt.h"
|
||||
@ -25,6 +24,7 @@
|
||||
#include "clang/Lex/Token.h"
|
||||
#include "clang/Rewrite/Core/HTMLRewrite.h"
|
||||
#include "clang/Rewrite/Core/Rewriter.h"
|
||||
#include "clang/StaticAnalyzer/Core/PathDiagnosticConsumers.h"
|
||||
#include "llvm/ADT/ArrayRef.h"
|
||||
#include "llvm/ADT/SmallString.h"
|
||||
#include "llvm/ADT/StringRef.h"
|
||||
@ -50,17 +50,13 @@
|
||||
using namespace clang;
|
||||
using namespace ento;
|
||||
|
||||
namespace clang {
|
||||
class CrossTUAnalysisHelper;
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Boilerplate.
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
namespace {
|
||||
|
||||
class HTMLPathDiagnosticConsumer : public PathDiagnosticConsumer {
|
||||
class HTMLDiagnostics : public PathDiagnosticConsumer {
|
||||
PathDiagnosticConsumerOptions DiagOpts;
|
||||
std::string Directory;
|
||||
bool createdDir = false;
|
||||
@ -69,18 +65,20 @@ class HTMLPathDiagnosticConsumer : public PathDiagnosticConsumer {
|
||||
const bool SupportsCrossFileDiagnostics;
|
||||
|
||||
public:
|
||||
HTMLPathDiagnosticConsumer(PathDiagnosticConsumerOptions DiagOpts,
|
||||
const std::string &OutputDir,
|
||||
const Preprocessor &PP, bool SupportsMultipleFiles)
|
||||
: DiagOpts(std::move(DiagOpts)), Directory(OutputDir), PP(PP),
|
||||
SupportsCrossFileDiagnostics(SupportsMultipleFiles) {}
|
||||
HTMLDiagnostics(PathDiagnosticConsumerOptions DiagOpts,
|
||||
const std::string &OutputDir, const Preprocessor &pp,
|
||||
bool supportsMultipleFiles)
|
||||
: DiagOpts(std::move(DiagOpts)), Directory(OutputDir), PP(pp),
|
||||
SupportsCrossFileDiagnostics(supportsMultipleFiles) {}
|
||||
|
||||
~HTMLPathDiagnosticConsumer() override { FlushDiagnostics(nullptr); }
|
||||
~HTMLDiagnostics() override { FlushDiagnostics(nullptr); }
|
||||
|
||||
void FlushDiagnosticsImpl(std::vector<const PathDiagnostic *> &Diags,
|
||||
FilesMade *filesMade) override;
|
||||
|
||||
StringRef getName() const override { return "HTMLPathDiagnosticConsumer"; }
|
||||
StringRef getName() const override {
|
||||
return "HTMLDiagnostics";
|
||||
}
|
||||
|
||||
bool supportsCrossFileDiagnostics() const override {
|
||||
return SupportsCrossFileDiagnostics;
|
||||
@ -137,7 +135,7 @@ private:
|
||||
void ento::createHTMLDiagnosticConsumer(
|
||||
PathDiagnosticConsumerOptions DiagOpts, PathDiagnosticConsumers &C,
|
||||
const std::string &OutputDir, const Preprocessor &PP,
|
||||
const CrossTUAnalysisHelper &CTU) {
|
||||
const cross_tu::CrossTranslationUnitContext &CTU) {
|
||||
|
||||
// FIXME: HTML is currently our default output type, but if the output
|
||||
// directory isn't specified, it acts like if it was in the minimal text
|
||||
@ -150,36 +148,47 @@ void ento::createHTMLDiagnosticConsumer(
|
||||
if (OutputDir.empty())
|
||||
return;
|
||||
|
||||
C.push_back(
|
||||
new HTMLPathDiagnosticConsumer(std::move(DiagOpts), OutputDir, PP, true));
|
||||
C.push_back(new HTMLDiagnostics(std::move(DiagOpts), OutputDir, PP, true));
|
||||
}
|
||||
|
||||
void ento::createHTMLSingleFileDiagnosticConsumer(
|
||||
PathDiagnosticConsumerOptions DiagOpts, PathDiagnosticConsumers &C,
|
||||
const std::string &OutputDir, const Preprocessor &PP,
|
||||
const CrossTUAnalysisHelper &CTU) {
|
||||
const cross_tu::CrossTranslationUnitContext &CTU) {
|
||||
createTextMinimalPathDiagnosticConsumer(DiagOpts, C, OutputDir, PP, CTU);
|
||||
|
||||
// TODO: Emit an error here.
|
||||
if (OutputDir.empty())
|
||||
return;
|
||||
|
||||
C.push_back(new HTMLPathDiagnosticConsumer(std::move(DiagOpts), OutputDir, PP,
|
||||
false));
|
||||
C.push_back(new HTMLDiagnostics(std::move(DiagOpts), OutputDir, PP, false));
|
||||
}
|
||||
|
||||
void ento::createPlistHTMLDiagnosticConsumer(
|
||||
PathDiagnosticConsumerOptions DiagOpts, PathDiagnosticConsumers &C,
|
||||
const std::string &prefix, const Preprocessor &PP,
|
||||
const cross_tu::CrossTranslationUnitContext &CTU) {
|
||||
createHTMLDiagnosticConsumer(
|
||||
DiagOpts, C, std::string(llvm::sys::path::parent_path(prefix)), PP,
|
||||
CTU);
|
||||
createPlistMultiFileDiagnosticConsumer(DiagOpts, C, prefix, PP, CTU);
|
||||
createTextMinimalPathDiagnosticConsumer(std::move(DiagOpts), C, prefix, PP,
|
||||
CTU);
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Report processing.
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
void HTMLPathDiagnosticConsumer::FlushDiagnosticsImpl(
|
||||
std::vector<const PathDiagnostic *> &Diags, FilesMade *filesMade) {
|
||||
void HTMLDiagnostics::FlushDiagnosticsImpl(
|
||||
std::vector<const PathDiagnostic *> &Diags,
|
||||
FilesMade *filesMade) {
|
||||
for (const auto Diag : Diags)
|
||||
ReportDiag(*Diag, filesMade);
|
||||
}
|
||||
|
||||
void HTMLPathDiagnosticConsumer::ReportDiag(const PathDiagnostic &D,
|
||||
FilesMade *filesMade) {
|
||||
void HTMLDiagnostics::ReportDiag(const PathDiagnostic& D,
|
||||
FilesMade *filesMade) {
|
||||
// Create the HTML directory if it is missing.
|
||||
if (!createdDir) {
|
||||
createdDir = true;
|
||||
@ -287,11 +296,8 @@ void HTMLPathDiagnosticConsumer::ReportDiag(const PathDiagnostic &D,
|
||||
os << report;
|
||||
}
|
||||
|
||||
std::string HTMLPathDiagnosticConsumer::GenerateHTML(const PathDiagnostic &D,
|
||||
Rewriter &R,
|
||||
const SourceManager &SMgr,
|
||||
const PathPieces &path,
|
||||
const char *declName) {
|
||||
std::string HTMLDiagnostics::GenerateHTML(const PathDiagnostic& D, Rewriter &R,
|
||||
const SourceManager& SMgr, const PathPieces& path, const char *declName) {
|
||||
// Rewrite source files as HTML for every new file the path crosses
|
||||
std::vector<FileID> FileIDs;
|
||||
for (auto I : path) {
|
||||
@ -363,8 +369,9 @@ std::string HTMLPathDiagnosticConsumer::GenerateHTML(const PathDiagnostic &D,
|
||||
return os.str();
|
||||
}
|
||||
|
||||
void HTMLPathDiagnosticConsumer::dumpCoverageData(
|
||||
const PathDiagnostic &D, const PathPieces &path,
|
||||
void HTMLDiagnostics::dumpCoverageData(
|
||||
const PathDiagnostic &D,
|
||||
const PathPieces &path,
|
||||
llvm::raw_string_ostream &os) {
|
||||
|
||||
const FilesToLineNumsMap &ExecutedLines = D.getExecutedLines();
|
||||
@ -388,8 +395,8 @@ void HTMLPathDiagnosticConsumer::dumpCoverageData(
|
||||
os << "};";
|
||||
}
|
||||
|
||||
std::string HTMLPathDiagnosticConsumer::showRelevantLinesJavascript(
|
||||
const PathDiagnostic &D, const PathPieces &path) {
|
||||
std::string HTMLDiagnostics::showRelevantLinesJavascript(
|
||||
const PathDiagnostic &D, const PathPieces &path) {
|
||||
std::string s;
|
||||
llvm::raw_string_ostream os(s);
|
||||
os << "<script type='text/javascript'>\n";
|
||||
@ -453,10 +460,9 @@ document.addEventListener("DOMContentLoaded", function() {
|
||||
return os.str();
|
||||
}
|
||||
|
||||
void HTMLPathDiagnosticConsumer::FinalizeHTML(
|
||||
const PathDiagnostic &D, Rewriter &R, const SourceManager &SMgr,
|
||||
const PathPieces &path, FileID FID, const FileEntry *Entry,
|
||||
const char *declName) {
|
||||
void HTMLDiagnostics::FinalizeHTML(const PathDiagnostic& D, Rewriter &R,
|
||||
const SourceManager& SMgr, const PathPieces& path, FileID FID,
|
||||
const FileEntry *Entry, const char *declName) {
|
||||
// This is a cludge; basically we want to append either the full
|
||||
// working directory if we have no directory information. This is
|
||||
// a work in progress.
|
||||
@ -601,7 +607,7 @@ void HTMLPathDiagnosticConsumer::FinalizeHTML(
|
||||
html::AddHeaderFooterInternalBuiltinCSS(R, FID, Entry->getName());
|
||||
}
|
||||
|
||||
StringRef HTMLPathDiagnosticConsumer::showHelpJavascript() {
|
||||
StringRef HTMLDiagnostics::showHelpJavascript() {
|
||||
return R"<<<(
|
||||
<script type='text/javascript'>
|
||||
|
||||
@ -684,9 +690,8 @@ static void HandlePopUpPieceEndTag(Rewriter &R,
|
||||
}
|
||||
}
|
||||
|
||||
void HTMLPathDiagnosticConsumer::RewriteFile(Rewriter &R,
|
||||
const PathPieces &path,
|
||||
FileID FID) {
|
||||
void HTMLDiagnostics::RewriteFile(Rewriter &R,
|
||||
const PathPieces& path, FileID FID) {
|
||||
// Process the path.
|
||||
// Maintain the counts of extra note pieces separately.
|
||||
unsigned TotalPieces = path.size();
|
||||
@ -764,9 +769,10 @@ void HTMLPathDiagnosticConsumer::RewriteFile(Rewriter &R,
|
||||
html::HighlightMacros(R, FID, PP);
|
||||
}
|
||||
|
||||
void HTMLPathDiagnosticConsumer::HandlePiece(
|
||||
Rewriter &R, FileID BugFileID, const PathDiagnosticPiece &P,
|
||||
const std::vector<SourceRange> &PopUpRanges, unsigned num, unsigned max) {
|
||||
void HTMLDiagnostics::HandlePiece(Rewriter &R, FileID BugFileID,
|
||||
const PathDiagnosticPiece &P,
|
||||
const std::vector<SourceRange> &PopUpRanges,
|
||||
unsigned num, unsigned max) {
|
||||
// For now, just draw a box above the line in question, and emit the
|
||||
// warning.
|
||||
FullSourceLoc Pos = P.getLocation().asLocation();
|
||||
@ -998,8 +1004,9 @@ static void EmitAlphaCounter(raw_ostream &os, unsigned n) {
|
||||
os << char('a' + x);
|
||||
}
|
||||
|
||||
unsigned HTMLPathDiagnosticConsumer::ProcessMacroPiece(
|
||||
raw_ostream &os, const PathDiagnosticMacroPiece &P, unsigned num) {
|
||||
unsigned HTMLDiagnostics::ProcessMacroPiece(raw_ostream &os,
|
||||
const PathDiagnosticMacroPiece& P,
|
||||
unsigned num) {
|
||||
for (const auto &subPiece : P.subPieces) {
|
||||
if (const auto *MP = dyn_cast<PathDiagnosticMacroPiece>(subPiece.get())) {
|
||||
num = ProcessMacroPiece(os, *MP, num);
|
||||
@ -1021,10 +1028,10 @@ unsigned HTMLPathDiagnosticConsumer::ProcessMacroPiece(
|
||||
return num;
|
||||
}
|
||||
|
||||
void HTMLPathDiagnosticConsumer::HighlightRange(Rewriter &R, FileID BugFileID,
|
||||
SourceRange Range,
|
||||
const char *HighlightStart,
|
||||
const char *HighlightEnd) {
|
||||
void HTMLDiagnostics::HighlightRange(Rewriter& R, FileID BugFileID,
|
||||
SourceRange Range,
|
||||
const char *HighlightStart,
|
||||
const char *HighlightEnd) {
|
||||
SourceManager &SM = R.getSourceMgr();
|
||||
const LangOptions &LangOpts = R.getLangOpts();
|
||||
|
||||
@ -1059,7 +1066,7 @@ void HTMLPathDiagnosticConsumer::HighlightRange(Rewriter &R, FileID BugFileID,
|
||||
html::HighlightRange(R, InstantiationStart, E, HighlightStart, HighlightEnd);
|
||||
}
|
||||
|
||||
StringRef HTMLPathDiagnosticConsumer::generateKeyboardNavigationJavascript() {
|
||||
StringRef HTMLDiagnostics::generateKeyboardNavigationJavascript() {
|
||||
return R"<<<(
|
||||
<script type='text/javascript'>
|
||||
var digitMatcher = new RegExp("[0-9]+");
|
@ -1,4 +1,4 @@
|
||||
//===--- PlistPathDiagnosticConsumer.cpp - Plist Diagnostics ----*- C++ -*-===//
|
||||
//===--- PlistDiagnostics.cpp - Plist Diagnostics for Paths -----*- C++ -*-===//
|
||||
//
|
||||
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
||||
// See https://llvm.org/LICENSE.txt for license information.
|
||||
@ -6,21 +6,22 @@
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// This file defines the PlistPathDiagnosticConsumer object.
|
||||
// This file defines the PlistDiagnostics object.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "clang/Analysis/CrossTUAnalysisHelper.h"
|
||||
#include "clang/Analysis/IssueHash.h"
|
||||
#include "clang/Analysis/PathDiagnostic.h"
|
||||
#include "clang/Analysis/PathDiagnosticConsumers.h"
|
||||
#include "clang/Basic/FileManager.h"
|
||||
#include "clang/Basic/PlistSupport.h"
|
||||
#include "clang/Basic/SourceManager.h"
|
||||
#include "clang/Basic/Version.h"
|
||||
#include "clang/CrossTU/CrossTranslationUnit.h"
|
||||
#include "clang/Frontend/ASTUnit.h"
|
||||
#include "clang/Lex/Preprocessor.h"
|
||||
#include "clang/Lex/TokenConcatenation.h"
|
||||
#include "clang/Rewrite/Core/HTMLRewrite.h"
|
||||
#include "clang/StaticAnalyzer/Core/PathDiagnosticConsumers.h"
|
||||
#include "llvm/ADT/SmallPtrSet.h"
|
||||
#include "llvm/ADT/SmallVector.h"
|
||||
#include "llvm/ADT/Statistic.h"
|
||||
@ -37,29 +38,29 @@ using namespace markup;
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
namespace {
|
||||
class PlistPathDiagnosticConsumer : public PathDiagnosticConsumer {
|
||||
class PlistDiagnostics : public PathDiagnosticConsumer {
|
||||
PathDiagnosticConsumerOptions DiagOpts;
|
||||
const std::string OutputFile;
|
||||
const Preprocessor &PP;
|
||||
const CrossTUAnalysisHelper &CTU;
|
||||
const cross_tu::CrossTranslationUnitContext &CTU;
|
||||
const bool SupportsCrossFileDiagnostics;
|
||||
|
||||
void printBugPath(llvm::raw_ostream &o, const FIDMap &FM,
|
||||
const PathPieces &Path);
|
||||
|
||||
public:
|
||||
PlistPathDiagnosticConsumer(PathDiagnosticConsumerOptions DiagOpts,
|
||||
PlistDiagnostics(PathDiagnosticConsumerOptions DiagOpts,
|
||||
const std::string &OutputFile, const Preprocessor &PP,
|
||||
const CrossTUAnalysisHelper &CTU,
|
||||
const cross_tu::CrossTranslationUnitContext &CTU,
|
||||
bool supportsMultipleFiles);
|
||||
|
||||
~PlistPathDiagnosticConsumer() override {}
|
||||
~PlistDiagnostics() override {}
|
||||
|
||||
void FlushDiagnosticsImpl(std::vector<const PathDiagnostic *> &Diags,
|
||||
FilesMade *filesMade) override;
|
||||
|
||||
StringRef getName() const override {
|
||||
return "PlistPathDiagnosticConsumer";
|
||||
return "PlistDiagnostics";
|
||||
}
|
||||
|
||||
PathGenerationScheme getGenerationScheme() const override {
|
||||
@ -78,13 +79,13 @@ namespace {
|
||||
class PlistPrinter {
|
||||
const FIDMap& FM;
|
||||
const Preprocessor &PP;
|
||||
const CrossTUAnalysisHelper &CTU;
|
||||
const cross_tu::CrossTranslationUnitContext &CTU;
|
||||
llvm::SmallVector<const PathDiagnosticMacroPiece *, 0> MacroPieces;
|
||||
|
||||
public:
|
||||
PlistPrinter(const FIDMap& FM,
|
||||
const Preprocessor &PP,
|
||||
const CrossTUAnalysisHelper &CTU)
|
||||
const cross_tu::CrossTranslationUnitContext &CTU)
|
||||
: FM(FM), PP(PP), CTU(CTU) {
|
||||
}
|
||||
|
||||
@ -174,7 +175,7 @@ static void printCoverage(const PathDiagnostic *D,
|
||||
|
||||
static ExpansionInfo
|
||||
getExpandedMacro(SourceLocation MacroLoc, const Preprocessor &PP,
|
||||
const CrossTUAnalysisHelper &CTU);
|
||||
const cross_tu::CrossTranslationUnitContext &CTU);
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Methods of PlistPrinter.
|
||||
@ -515,12 +516,12 @@ static void printCoverage(const PathDiagnostic *D,
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Methods of PlistPathDiagnosticConsumer.
|
||||
// Methods of PlistDiagnostics.
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
PlistPathDiagnosticConsumer::PlistPathDiagnosticConsumer(
|
||||
PlistDiagnostics::PlistDiagnostics(
|
||||
PathDiagnosticConsumerOptions DiagOpts, const std::string &output,
|
||||
const Preprocessor &PP, const CrossTUAnalysisHelper &CTU,
|
||||
const Preprocessor &PP, const cross_tu::CrossTranslationUnitContext &CTU,
|
||||
bool supportsMultipleFiles)
|
||||
: DiagOpts(std::move(DiagOpts)), OutputFile(output), PP(PP), CTU(CTU),
|
||||
SupportsCrossFileDiagnostics(supportsMultipleFiles) {
|
||||
@ -531,14 +532,14 @@ PlistPathDiagnosticConsumer::PlistPathDiagnosticConsumer(
|
||||
void ento::createPlistDiagnosticConsumer(
|
||||
PathDiagnosticConsumerOptions DiagOpts, PathDiagnosticConsumers &C,
|
||||
const std::string &OutputFile, const Preprocessor &PP,
|
||||
const CrossTUAnalysisHelper &CTU) {
|
||||
const cross_tu::CrossTranslationUnitContext &CTU) {
|
||||
|
||||
// TODO: Emit an error here.
|
||||
if (OutputFile.empty())
|
||||
return;
|
||||
|
||||
C.push_back(new PlistPathDiagnosticConsumer(DiagOpts, OutputFile, PP, CTU,
|
||||
/*supportsMultipleFiles=*/false));
|
||||
C.push_back(new PlistDiagnostics(DiagOpts, OutputFile, PP, CTU,
|
||||
/*supportsMultipleFiles=*/false));
|
||||
createTextMinimalPathDiagnosticConsumer(std::move(DiagOpts), C, OutputFile,
|
||||
PP, CTU);
|
||||
}
|
||||
@ -546,21 +547,20 @@ void ento::createPlistDiagnosticConsumer(
|
||||
void ento::createPlistMultiFileDiagnosticConsumer(
|
||||
PathDiagnosticConsumerOptions DiagOpts, PathDiagnosticConsumers &C,
|
||||
const std::string &OutputFile, const Preprocessor &PP,
|
||||
const CrossTUAnalysisHelper &CTU) {
|
||||
const cross_tu::CrossTranslationUnitContext &CTU) {
|
||||
|
||||
// TODO: Emit an error here.
|
||||
if (OutputFile.empty())
|
||||
return;
|
||||
|
||||
C.push_back(new PlistPathDiagnosticConsumer(DiagOpts, OutputFile, PP, CTU,
|
||||
/*supportsMultipleFiles=*/true));
|
||||
C.push_back(new PlistDiagnostics(DiagOpts, OutputFile, PP, CTU,
|
||||
/*supportsMultipleFiles=*/true));
|
||||
createTextMinimalPathDiagnosticConsumer(std::move(DiagOpts), C, OutputFile,
|
||||
PP, CTU);
|
||||
}
|
||||
|
||||
void PlistPathDiagnosticConsumer::printBugPath(llvm::raw_ostream &o,
|
||||
const FIDMap &FM,
|
||||
const PathPieces &Path) {
|
||||
void PlistDiagnostics::printBugPath(llvm::raw_ostream &o, const FIDMap &FM,
|
||||
const PathPieces &Path) {
|
||||
PlistPrinter Printer(FM, PP, CTU);
|
||||
assert(std::is_partitioned(Path.begin(), Path.end(),
|
||||
[](const PathDiagnosticPieceRef &E) {
|
||||
@ -603,8 +603,9 @@ void PlistPathDiagnosticConsumer::printBugPath(llvm::raw_ostream &o,
|
||||
o << " </array>\n";
|
||||
}
|
||||
|
||||
void PlistPathDiagnosticConsumer::FlushDiagnosticsImpl(
|
||||
std::vector<const PathDiagnostic *> &Diags, FilesMade *filesMade) {
|
||||
void PlistDiagnostics::FlushDiagnosticsImpl(
|
||||
std::vector<const PathDiagnostic *> &Diags,
|
||||
FilesMade *filesMade) {
|
||||
// Build up a set of FIDs that we use by scanning the locations and
|
||||
// ranges of the diagnostics.
|
||||
FIDMap FM;
|
||||
@ -984,13 +985,12 @@ static const MacroInfo *getMacroInfoForLocation(const Preprocessor &PP,
|
||||
|
||||
static ExpansionInfo
|
||||
getExpandedMacro(SourceLocation MacroLoc, const Preprocessor &PP,
|
||||
const CrossTUAnalysisHelper &CTU) {
|
||||
const cross_tu::CrossTranslationUnitContext &CTU) {
|
||||
|
||||
const Preprocessor *PPToUse = &PP;
|
||||
if (auto LocAndUnit =
|
||||
CTU.getImportedFromSourceLocationWithPreprocessor(MacroLoc)) {
|
||||
if (auto LocAndUnit = CTU.getImportedFromSourceLocation(MacroLoc)) {
|
||||
MacroLoc = LocAndUnit->first;
|
||||
PPToUse = LocAndUnit->second;
|
||||
PPToUse = &LocAndUnit->second->getPreprocessor();
|
||||
}
|
||||
|
||||
llvm::SmallString<200> ExpansionBuf;
|
@ -1,4 +1,4 @@
|
||||
//===--- SarifPathDiagnosticConsumer.cpp - Sarif Diagnostics ---*- C++ -*-===//
|
||||
//===--- SarifDiagnostics.cpp - Sarif Diagnostics for Paths -----*- C++ -*-===//
|
||||
//
|
||||
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
||||
// See https://llvm.org/LICENSE.txt for license information.
|
||||
@ -6,15 +6,15 @@
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// This file defines the SarifPathDiagnosticConsumer object.
|
||||
// This file defines the SarifDiagnostics object.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "clang/Analysis/PathDiagnostic.h"
|
||||
#include "clang/Analysis/PathDiagnosticConsumers.h"
|
||||
#include "clang/Basic/FileManager.h"
|
||||
#include "clang/Basic/Version.h"
|
||||
#include "clang/Lex/Preprocessor.h"
|
||||
#include "clang/StaticAnalyzer/Core/PathDiagnosticConsumers.h"
|
||||
#include "llvm/ADT/STLExtras.h"
|
||||
#include "llvm/ADT/StringMap.h"
|
||||
#include "llvm/Support/ConvertUTF.h"
|
||||
@ -25,24 +25,20 @@ using namespace llvm;
|
||||
using namespace clang;
|
||||
using namespace ento;
|
||||
|
||||
namespace clang {
|
||||
class CrossTUAnalysisHelper;
|
||||
}
|
||||
|
||||
namespace {
|
||||
class SarifPathDiagnosticConsumer : public PathDiagnosticConsumer {
|
||||
class SarifDiagnostics : public PathDiagnosticConsumer {
|
||||
std::string OutputFile;
|
||||
const LangOptions &LO;
|
||||
|
||||
public:
|
||||
SarifPathDiagnosticConsumer(const std::string &Output, const LangOptions &LO)
|
||||
SarifDiagnostics(const std::string &Output, const LangOptions &LO)
|
||||
: OutputFile(Output), LO(LO) {}
|
||||
~SarifPathDiagnosticConsumer() override = default;
|
||||
~SarifDiagnostics() override = default;
|
||||
|
||||
void FlushDiagnosticsImpl(std::vector<const PathDiagnostic *> &Diags,
|
||||
FilesMade *FM) override;
|
||||
|
||||
StringRef getName() const override { return "SarifPathDiagnosticConsumer"; }
|
||||
StringRef getName() const override { return "SarifDiagnostics"; }
|
||||
PathGenerationScheme getGenerationScheme() const override { return Minimal; }
|
||||
bool supportsLogicalOpControlFlow() const override { return true; }
|
||||
bool supportsCrossFileDiagnostics() const override { return true; }
|
||||
@ -52,13 +48,13 @@ public:
|
||||
void ento::createSarifDiagnosticConsumer(
|
||||
PathDiagnosticConsumerOptions DiagOpts, PathDiagnosticConsumers &C,
|
||||
const std::string &Output, const Preprocessor &PP,
|
||||
const CrossTUAnalysisHelper &CTU) {
|
||||
const cross_tu::CrossTranslationUnitContext &CTU) {
|
||||
|
||||
// TODO: Emit an error here.
|
||||
if (Output.empty())
|
||||
return;
|
||||
|
||||
C.push_back(new SarifPathDiagnosticConsumer(Output, PP.getLangOpts()));
|
||||
C.push_back(new SarifDiagnostics(Output, PP.getLangOpts()));
|
||||
createTextMinimalPathDiagnosticConsumer(std::move(DiagOpts), C, Output, PP,
|
||||
CTU);
|
||||
}
|
||||
@ -303,9 +299,6 @@ static json::Object createResult(const LangOptions &LO,
|
||||
}
|
||||
|
||||
static StringRef getRuleDescription(StringRef CheckName) {
|
||||
// FIXME: This is a layering violation; it only works for the particular
|
||||
// use-case of clang static analyzer. This info should be provided
|
||||
// as part of PathDiagnostic itself.
|
||||
return llvm::StringSwitch<StringRef>(CheckName)
|
||||
#define GET_CHECKERS
|
||||
#define CHECKER(FULLNAME, CLASS, HELPTEXT, DOC_URI, IS_HIDDEN) \
|
||||
@ -317,9 +310,6 @@ static StringRef getRuleDescription(StringRef CheckName) {
|
||||
}
|
||||
|
||||
static StringRef getRuleHelpURIStr(StringRef CheckName) {
|
||||
// FIXME: This is a layering violation; it only works for the particular
|
||||
// use-case of clang static analyzer. This info should be provided
|
||||
// as part of PathDiagnostic itself.
|
||||
return llvm::StringSwitch<StringRef>(CheckName)
|
||||
#define GET_CHECKERS
|
||||
#define CHECKER(FULLNAME, CLASS, HELPTEXT, DOC_URI, IS_HIDDEN) \
|
||||
@ -387,7 +377,7 @@ static json::Object createRun(const LangOptions &LO,
|
||||
{"columnKind", "unicodeCodePoints"}};
|
||||
}
|
||||
|
||||
void SarifPathDiagnosticConsumer::FlushDiagnosticsImpl(
|
||||
void SarifDiagnostics::FlushDiagnosticsImpl(
|
||||
std::vector<const PathDiagnostic *> &Diags, FilesMade *) {
|
||||
// We currently overwrite the file if it already exists. However, it may be
|
||||
// useful to add a feature someday that allows the user to append a run to an
|
@ -1,4 +1,4 @@
|
||||
//===--- TextPathDiagnosticConsumer.cpp - Text Diagnostics ------*- C++ -*-===//
|
||||
//===--- TextDiagnostics.cpp - Text Diagnostics for Paths -------*- C++ -*-===//
|
||||
//
|
||||
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
||||
// See https://llvm.org/LICENSE.txt for license information.
|
||||
@ -6,17 +6,19 @@
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// This file defines the TextPathDiagnosticConsumer object.
|
||||
// This file defines the TextDiagnostics object.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "clang/Analysis/PathDiagnostic.h"
|
||||
#include "clang/Analysis/PathDiagnosticConsumers.h"
|
||||
#include "clang/Basic/SourceManager.h"
|
||||
#include "clang/Basic/Version.h"
|
||||
#include "clang/CrossTU/CrossTranslationUnit.h"
|
||||
#include "clang/Frontend/ASTUnit.h"
|
||||
#include "clang/Lex/Preprocessor.h"
|
||||
#include "clang/Rewrite/Core/Rewriter.h"
|
||||
#include "clang/StaticAnalyzer/Core/AnalyzerOptions.h"
|
||||
#include "clang/StaticAnalyzer/Core/PathDiagnosticConsumers.h"
|
||||
#include "clang/Tooling/Core/Replacement.h"
|
||||
#include "clang/Tooling/Tooling.h"
|
||||
#include "llvm/ADT/SmallPtrSet.h"
|
||||
@ -27,29 +29,25 @@ using namespace clang;
|
||||
using namespace ento;
|
||||
using namespace tooling;
|
||||
|
||||
namespace clang {
|
||||
class CrossTUAnalysisHelper;
|
||||
}
|
||||
|
||||
namespace {
|
||||
/// Emits minimal diagnostics (report message + notes) for the 'none' output
|
||||
/// Emitsd minimal diagnostics (report message + notes) for the 'none' output
|
||||
/// type to the standard error, or to to compliment many others. Emits detailed
|
||||
/// diagnostics in textual format for the 'text' output type.
|
||||
class TextPathDiagnosticConsumer : public PathDiagnosticConsumer {
|
||||
class TextDiagnostics : public PathDiagnosticConsumer {
|
||||
PathDiagnosticConsumerOptions DiagOpts;
|
||||
DiagnosticsEngine &DiagEng;
|
||||
const LangOptions &LO;
|
||||
bool ShouldDisplayPathNotes;
|
||||
|
||||
public:
|
||||
TextPathDiagnosticConsumer(PathDiagnosticConsumerOptions DiagOpts,
|
||||
DiagnosticsEngine &DiagEng, const LangOptions &LO,
|
||||
bool ShouldDisplayPathNotes)
|
||||
TextDiagnostics(PathDiagnosticConsumerOptions DiagOpts,
|
||||
DiagnosticsEngine &DiagEng, const LangOptions &LO,
|
||||
bool ShouldDisplayPathNotes)
|
||||
: DiagOpts(std::move(DiagOpts)), DiagEng(DiagEng), LO(LO),
|
||||
ShouldDisplayPathNotes(ShouldDisplayPathNotes) {}
|
||||
~TextPathDiagnosticConsumer() override {}
|
||||
~TextDiagnostics() override {}
|
||||
|
||||
StringRef getName() const override { return "TextPathDiagnosticConsumer"; }
|
||||
StringRef getName() const override { return "TextDiagnostics"; }
|
||||
|
||||
bool supportsLogicalOpControlFlow() const override { return true; }
|
||||
bool supportsCrossFileDiagnostics() const override { return true; }
|
||||
@ -141,17 +139,17 @@ public:
|
||||
void ento::createTextPathDiagnosticConsumer(
|
||||
PathDiagnosticConsumerOptions DiagOpts, PathDiagnosticConsumers &C,
|
||||
const std::string &Prefix, const clang::Preprocessor &PP,
|
||||
const CrossTUAnalysisHelper &CTU) {
|
||||
C.emplace_back(new TextPathDiagnosticConsumer(
|
||||
std::move(DiagOpts), PP.getDiagnostics(), PP.getLangOpts(),
|
||||
/*ShouldDisplayPathNotes=*/true));
|
||||
const cross_tu::CrossTranslationUnitContext &CTU) {
|
||||
C.emplace_back(new TextDiagnostics(std::move(DiagOpts), PP.getDiagnostics(),
|
||||
PP.getLangOpts(),
|
||||
/*ShouldDisplayPathNotes=*/true));
|
||||
}
|
||||
|
||||
void ento::createTextMinimalPathDiagnosticConsumer(
|
||||
PathDiagnosticConsumerOptions DiagOpts, PathDiagnosticConsumers &C,
|
||||
const std::string &Prefix, const clang::Preprocessor &PP,
|
||||
const CrossTUAnalysisHelper &CTU) {
|
||||
C.emplace_back(new TextPathDiagnosticConsumer(
|
||||
std::move(DiagOpts), PP.getDiagnostics(), PP.getLangOpts(),
|
||||
/*ShouldDisplayPathNotes=*/false));
|
||||
const cross_tu::CrossTranslationUnitContext &CTU) {
|
||||
C.emplace_back(new TextDiagnostics(std::move(DiagOpts), PP.getDiagnostics(),
|
||||
PP.getLangOpts(),
|
||||
/*ShouldDisplayPathNotes=*/false));
|
||||
}
|
@ -21,7 +21,6 @@
|
||||
#include "clang/Analysis/CallGraph.h"
|
||||
#include "clang/Analysis/CodeInjector.h"
|
||||
#include "clang/Analysis/PathDiagnostic.h"
|
||||
#include "clang/Analysis/PathDiagnosticConsumers.h"
|
||||
#include "clang/Basic/SourceManager.h"
|
||||
#include "clang/CrossTU/CrossTranslationUnit.h"
|
||||
#include "clang/Frontend/CompilerInstance.h"
|
||||
@ -31,6 +30,7 @@
|
||||
#include "clang/StaticAnalyzer/Core/AnalyzerOptions.h"
|
||||
#include "clang/StaticAnalyzer/Core/BugReporter/BugReporter.h"
|
||||
#include "clang/StaticAnalyzer/Core/CheckerManager.h"
|
||||
#include "clang/StaticAnalyzer/Core/PathDiagnosticConsumers.h"
|
||||
#include "clang/StaticAnalyzer/Core/PathSensitive/AnalysisManager.h"
|
||||
#include "clang/StaticAnalyzer/Core/PathSensitive/ExprEngine.h"
|
||||
#include "llvm/ADT/PostOrderIterator.h"
|
||||
@ -152,7 +152,7 @@ public:
|
||||
case PD_##NAME: \
|
||||
CREATEFN(Opts->getDiagOpts(), PathConsumers, OutDir, PP, CTU); \
|
||||
break;
|
||||
#include "clang/Analysis/PathDiagnosticConsumers.def"
|
||||
#include "clang/StaticAnalyzer/Core/Analyses.def"
|
||||
default:
|
||||
llvm_unreachable("Unknown analyzer output type!");
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user