diff options
author | Richard Smith <richard-llvm@metafoo.co.uk> | 2012-07-02 23:23:04 +0000 |
---|---|---|
committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2012-07-02 23:23:04 +0000 |
commit | a9e8b9e3e90fcfe10a04624a89c39b63c32614d1 (patch) | |
tree | c7c964f3ee4549e29043b90e1eb5c7fbec99aea0 /lib/Analysis/UninitializedValues.cpp | |
parent | af50aab0c317462129d73ae8000c6394c718598d (diff) |
-Wuninitialized: assume that an __attribute__((returns_twice)) function might
initialize any variable. This is extremely conservative, but is sufficient for
now.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@159620 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Analysis/UninitializedValues.cpp')
-rw-r--r-- | lib/Analysis/UninitializedValues.cpp | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/lib/Analysis/UninitializedValues.cpp b/lib/Analysis/UninitializedValues.cpp index fbfa46c443..1f97c58946 100644 --- a/lib/Analysis/UninitializedValues.cpp +++ b/lib/Analysis/UninitializedValues.cpp @@ -116,6 +116,7 @@ public: BVPair &getValueVectors(const CFGBlock *block, bool shouldLazyCreate); + void setAllScratchValues(Value V); void mergeIntoScratch(ValueVector const &source, bool isFirst); bool updateValueVectorWithScratch(const CFGBlock *block); bool updateValueVectors(const CFGBlock *block, const BVPair &newVals); @@ -240,6 +241,11 @@ static void printVector(const char *name, ValueVector const &bv) { } #endif +void CFGBlockValues::setAllScratchValues(Value V) { + for (unsigned I = 0, E = scratch.size(); I != E; ++I) + scratch[I] = V; +} + void CFGBlockValues::mergeIntoScratch(ValueVector const &source, bool isFirst) { if (isFirst) @@ -374,6 +380,7 @@ public: void reportUse(const Expr *ex, const VarDecl *vd); void VisitBlockExpr(BlockExpr *be); + void VisitCallExpr(CallExpr *ce); void VisitDeclStmt(DeclStmt *ds); void VisitDeclRefExpr(DeclRefExpr *dr); void VisitUnaryOperator(UnaryOperator *uo); @@ -576,6 +583,17 @@ void TransferFunctions::VisitBlockExpr(BlockExpr *be) { } } +void TransferFunctions::VisitCallExpr(CallExpr *ce) { + // After a call to a function like setjmp or vfork, any variable which is + // initialized anywhere within this function may now be initialized. For now, + // just assume such a call initializes all variables. + // FIXME: Only mark variables as initialized if they have an initializer which + // is reachable from here. + Decl *Callee = ce->getCalleeDecl(); + if (Callee && Callee->hasAttr<ReturnsTwiceAttr>()) + vals.setAllScratchValues(Initialized); +} + void TransferFunctions::VisitDeclRefExpr(DeclRefExpr *dr) { // Record the last DeclRefExpr seen. This is an lvalue computation. // We use this value to later detect if a variable "escapes" the analysis. |