diff options
Diffstat (limited to 'clang/Analysis/GRConstants.cpp')
| -rw-r--r-- | clang/Analysis/GRConstants.cpp | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/clang/Analysis/GRConstants.cpp b/clang/Analysis/GRConstants.cpp index 6d5bdbd1199..36ad5fe20a8 100644 --- a/clang/Analysis/GRConstants.cpp +++ b/clang/Analysis/GRConstants.cpp @@ -842,6 +842,10 @@ public: return St; } + + bool isUninitControlFlow(const NodeTy* N) const { + return N->isSink() && UninitBranches.count(const_cast<NodeTy*>(N)) != 0; + } /// ProcessStmt - Called by GREngine. Used to generate new successor /// nodes by processing the 'effects' of a block-level statement. @@ -1474,6 +1478,8 @@ StateTy GRConstants::Assume(StateTy St, NonLValue Cond, bool Assumption, //===----------------------------------------------------------------------===// #ifndef NDEBUG +static GRConstants* GraphPrintCheckerState; + namespace llvm { template<> struct VISIBILITY_HIDDEN DOTGraphTraits<GRConstants::NodeTy*> : @@ -1566,6 +1572,10 @@ struct VISIBILITY_HIDDEN DOTGraphTraits<GRConstants::NodeTy*> : Out << "\\l"; } + + if (GraphPrintCheckerState->isUninitControlFlow(N)) { + Out << "\\|Control-flow based on\\lUninitialized value.\\l"; + } } } @@ -1587,7 +1597,9 @@ void RunGRConstants(CFG& cfg, FunctionDecl& FD, ASTContext& Ctx) { GREngine<GRConstants> Engine(cfg, FD, Ctx); Engine.ExecuteWorkList(); #ifndef NDEBUG + GraphPrintCheckerState = &Engine.getCheckerState(); llvm::ViewGraph(*Engine.getGraph().roots_begin(),"GRConstants"); + GraphPrintCheckerState = NULL; #endif } } // end clang namespace |

