diff options
| author | Ted Kremenek <kremenek@apple.com> | 2009-12-03 00:46:16 +0000 |
|---|---|---|
| committer | Ted Kremenek <kremenek@apple.com> | 2009-12-03 00:46:16 +0000 |
| commit | f66b72094a9d537a2ec15e6c4d2871b8f58c9aea (patch) | |
| tree | a25b1c7ac14456971f76b1d307cc4e79c0087c58 | |
| parent | 1ed59c63e3ad386ad4b2dca16153ad9e8f4dfa51 (diff) | |
| download | bcm5719-llvm-f66b72094a9d537a2ec15e6c4d2871b8f58c9aea.tar.gz bcm5719-llvm-f66b72094a9d537a2ec15e6c4d2871b8f58c9aea.zip | |
Add a heuristic to the dead stores checker to prune dead stores for variables annotated with '__block'. This is overly conservative, but now the analyzer doesn't report dead stores for variables that can be updated by a block call.
llvm-svn: 90364
| -rw-r--r-- | clang/lib/Analysis/CheckDeadStores.cpp | 3 | ||||
| -rw-r--r-- | clang/test/Analysis/dead-stores.c | 21 |
2 files changed, 23 insertions, 1 deletions
diff --git a/clang/lib/Analysis/CheckDeadStores.cpp b/clang/lib/Analysis/CheckDeadStores.cpp index ad63eb4122b..ec13328447a 100644 --- a/clang/lib/Analysis/CheckDeadStores.cpp +++ b/clang/lib/Analysis/CheckDeadStores.cpp @@ -84,7 +84,8 @@ public: const LiveVariables::AnalysisDataTy& AD, const LiveVariables::ValTy& Live) { - if (VD->hasLocalStorage() && !Live(VD, AD) && !VD->getAttr<UnusedAttr>()) + if (VD->hasLocalStorage() && !Live(VD, AD) && + !(VD->getAttr<UnusedAttr>() || VD->getAttr<BlocksAttr>())) Report(VD, dsk, Ex->getSourceRange().getBegin(), Val->getSourceRange()); } diff --git a/clang/test/Analysis/dead-stores.c b/clang/test/Analysis/dead-stores.c index ae5e3e36735..7cf8c31cd22 100644 --- a/clang/test/Analysis/dead-stores.c +++ b/clang/test/Analysis/dead-stores.c @@ -406,3 +406,24 @@ int f24_D(int y) { return x; } +// This example shows that writing to a variable captured by a block means that it might +// not be dead. +int f25(int y) { + __block int x = (y > 2); + __block int z = 0; + void (^foo)() = ^{ z = x + y; }; + x = 4; // no-warning + foo(); + return z; +} + +// This test is mostly the same as 'f25', but shows that the heuristic of pruning out dead +// stores for variables that are just marked '__block' is overly conservative. +int f25_b(int y) { + // FIXME: we should eventually report a dead store here. + __block int x = (y > 2); + __block int z = 0; + x = 4; // no-warning + return z; +} + |

