[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:
Kristof Umann 2018-08-13 18:22:22 +00:00
parent 56963aec8b
commit a37bba4727
3 changed files with 17 additions and 16 deletions

View File

@ -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;
};

View File

@ -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)

View File

@ -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"