[cfe-commits] r110974 - /cfe/trunk/lib/Checker/UnreachableCodeChecker.cpp
Tom Care
tcare at apple.com
Thu Aug 12 16:01:06 PDT 2010
Author: tcare
Date: Thu Aug 12 18:01:06 2010
New Revision: 110974
URL: http://llvm.org/viewvc/llvm-project?rev=110974&view=rev
Log:
Small changes to UnreachableCodeChecker
- Added detection of Empty CFGBlocks (artificial blocks)
- Relaxed an assertion based on an incorrect assumption until further investigation
Modified:
cfe/trunk/lib/Checker/UnreachableCodeChecker.cpp
Modified: cfe/trunk/lib/Checker/UnreachableCodeChecker.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Checker/UnreachableCodeChecker.cpp?rev=110974&r1=110973&r2=110974&view=diff
==============================================================================
--- cfe/trunk/lib/Checker/UnreachableCodeChecker.cpp (original)
+++ cfe/trunk/lib/Checker/UnreachableCodeChecker.cpp Thu Aug 12 18:01:06 2010
@@ -41,6 +41,7 @@
static inline const Stmt *getUnreachableStmt(const CFGBlock *CB);
void FindUnreachableEntryPoints(const CFGBlock *CB);
static bool isInvalidPath(const CFGBlock *CB, const ParentMap &PM);
+ static inline bool isEmptyCFGBlock(const CFGBlock *CB);
llvm::SmallSet<unsigned, DEFAULT_CFGBLOCKS> reachable;
llvm::SmallSet<unsigned, DEFAULT_CFGBLOCKS> visited;
@@ -66,8 +67,8 @@
CFG *C = 0;
ParentMap *PM = 0;
// Iterate over ExplodedGraph
- for (ExplodedGraph::node_iterator I = G.nodes_begin(); I != G.nodes_end();
- ++I) {
+ for (ExplodedGraph::node_iterator I = G.nodes_begin(), E = G.nodes_end();
+ I != E; ++I) {
const ProgramPoint &P = I->getLocation();
const LocationContext *LC = P.getLocationContext();
@@ -96,6 +97,10 @@
if (reachable.count(CB->getBlockID()))
continue;
+ // Check if the block is empty (an artificial block)
+ if (isEmptyCFGBlock(CB))
+ continue;
+
// Find the entry points for this block
FindUnreachableEntryPoints(CB);
@@ -194,7 +199,12 @@
// Get the predecessor block's terminator conditon
const Stmt *cond = pred->getTerminatorCondition();
- assert(cond && "CFGBlock's predecessor has a terminator condition");
+
+ //assert(cond && "CFGBlock's predecessor has a terminator condition");
+ // The previous assertion is invalid in some cases (eg do/while). Leaving
+ // reporting of these situations on at the moment to help triage these cases.
+ if (!cond)
+ return false;
// Run each of the checks on the conditions
if (containsMacro(cond) || containsEnum(cond)
@@ -204,3 +214,10 @@
return false;
}
+
+// Returns true if the given CFGBlock is empty
+bool UnreachableCodeChecker::isEmptyCFGBlock(const CFGBlock *CB) {
+ return CB->getLabel() == 0 // No labels
+ && CB->size() == 0 // No statements
+ && CB->getTerminator() == 0; // No terminator
+}
More information about the cfe-commits
mailing list