[analyzer][UninitializedObjectChecker] Refactoring p3.: printTail moved out from FieldChainInfo
This is a standalone part of the effort to reduce FieldChainInfos inteerface. Differential Revision: https://reviews.llvm.org/D50505 llvm-svn: 339596
This commit is contained in:
parent
56963aec8b
commit
a37bba4727
|
@ -35,6 +35,7 @@ namespace ento {
|
|||
/// constructor calls.
|
||||
class FieldChainInfo {
|
||||
public:
|
||||
using FieldChainImpl = llvm::ImmutableListImpl<const FieldRegion *>;
|
||||
using FieldChain = llvm::ImmutableList<const FieldRegion *>;
|
||||
|
||||
private:
|
||||
|
@ -48,7 +49,8 @@ public:
|
|||
FieldChainInfo(FieldChain::Factory &F) : Factory(F) {}
|
||||
|
||||
FieldChainInfo(const FieldChainInfo &Other, const bool IsDereferenced)
|
||||
: Factory(Other.Factory), Chain(Other.Chain), IsDereferenced(IsDereferenced) {}
|
||||
: Factory(Other.Factory), Chain(Other.Chain),
|
||||
IsDereferenced(IsDereferenced) {}
|
||||
|
||||
FieldChainInfo(const FieldChainInfo &Other, const FieldRegion *FR,
|
||||
const bool IsDereferenced = false);
|
||||
|
@ -64,12 +66,6 @@ public:
|
|||
void print(llvm::raw_ostream &Out) const;
|
||||
|
||||
private:
|
||||
/// Prints every element except the last to `Out`. Since ImmutableLists store
|
||||
/// elements in reverse order, and have no reverse iterators, we use a
|
||||
/// recursive function to print the fieldchain correctly. The last element in
|
||||
/// the chain is to be printed by `print`.
|
||||
static void printTail(llvm::raw_ostream &Out,
|
||||
const llvm::ImmutableListImpl<const FieldRegion *> *L);
|
||||
friend struct FieldChainInfoComparator;
|
||||
};
|
||||
|
||||
|
|
|
@ -46,8 +46,8 @@
|
|||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "UninitializedObject.h"
|
||||
#include "ClangSACheckers.h"
|
||||
#include "UninitializedObject.h"
|
||||
#include "clang/StaticAnalyzer/Core/BugReporter/BugType.h"
|
||||
#include "clang/StaticAnalyzer/Core/Checker.h"
|
||||
#include "clang/StaticAnalyzer/Core/PathSensitive/CheckerContext.h"
|
||||
|
@ -87,7 +87,7 @@ getObjectVal(const CXXConstructorDecl *CtorDecl, CheckerContext &Context);
|
|||
/// (e.g. if the object is a field of another object, in which case we'd check
|
||||
/// it multiple times).
|
||||
static bool willObjectBeAnalyzedLater(const CXXConstructorDecl *Ctor,
|
||||
CheckerContext &Context);
|
||||
CheckerContext &Context);
|
||||
|
||||
/// Constructs a note message for a given FieldChainInfo object.
|
||||
static void printNoteMessage(llvm::raw_ostream &Out,
|
||||
|
@ -346,6 +346,13 @@ const FieldDecl *FieldChainInfo::getEndOfChain() const {
|
|||
return (*Chain.begin())->getDecl();
|
||||
}
|
||||
|
||||
/// Prints every element except the last to `Out`. Since ImmutableLists store
|
||||
/// elements in reverse order, and have no reverse iterators, we use a
|
||||
/// recursive function to print the fieldchain correctly. The last element in
|
||||
/// the chain is to be printed by `print`.
|
||||
static void printTail(llvm::raw_ostream &Out,
|
||||
const FieldChainInfo::FieldChainImpl *L);
|
||||
|
||||
// TODO: This function constructs an incorrect string if a void pointer is a
|
||||
// part of the chain:
|
||||
//
|
||||
|
@ -383,15 +390,13 @@ void FieldChainInfo::print(llvm::raw_ostream &Out) const {
|
|||
if (Chain.isEmpty())
|
||||
return;
|
||||
|
||||
const llvm::ImmutableListImpl<const FieldRegion *> *L =
|
||||
Chain.getInternalPointer();
|
||||
const FieldChainImpl *L = Chain.getInternalPointer();
|
||||
printTail(Out, L->getTail());
|
||||
Out << getVariableName(L->getHead()->getDecl());
|
||||
}
|
||||
|
||||
void FieldChainInfo::printTail(
|
||||
llvm::raw_ostream &Out,
|
||||
const llvm::ImmutableListImpl<const FieldRegion *> *L) {
|
||||
static void printTail(llvm::raw_ostream &Out,
|
||||
const FieldChainInfo::FieldChainImpl *L) {
|
||||
if (!L)
|
||||
return;
|
||||
|
||||
|
@ -420,7 +425,7 @@ getObjectVal(const CXXConstructorDecl *CtorDecl, CheckerContext &Context) {
|
|||
}
|
||||
|
||||
static bool willObjectBeAnalyzedLater(const CXXConstructorDecl *Ctor,
|
||||
CheckerContext &Context) {
|
||||
CheckerContext &Context) {
|
||||
|
||||
Optional<nonloc::LazyCompoundVal> CurrentObject = getObjectVal(Ctor, Context);
|
||||
if (!CurrentObject)
|
||||
|
|
|
@ -18,8 +18,8 @@
|
|||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "UninitializedObject.h"
|
||||
#include "ClangSACheckers.h"
|
||||
#include "UninitializedObject.h"
|
||||
#include "clang/StaticAnalyzer/Core/BugReporter/BugType.h"
|
||||
#include "clang/StaticAnalyzer/Core/Checker.h"
|
||||
#include "clang/StaticAnalyzer/Core/PathSensitive/CheckerContext.h"
|
||||
|
|
Loading…
Reference in New Issue