diff options
author | Ted Kremenek <kremenek@apple.com> | 2009-04-23 17:49:43 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2009-04-23 17:49:43 +0000 |
commit | b3cfd58c9b13325d994e5f9b5065e6a22d91911d (patch) | |
tree | e5267611bc54dd9c7d982a06b43a3956d1f53627 | |
parent | 04c5f4f3c0e6e751d34351d1b517fb589232878c (diff) |
Fix PR 4033: the analyzer shouldn't crash on computed gotos involving symbolic
target addresses.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@69900 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Analysis/GRExprEngine.cpp | 3 | ||||
-rw-r--r-- | test/Analysis/misc-ps.m | 14 |
2 files changed, 14 insertions, 3 deletions
diff --git a/lib/Analysis/GRExprEngine.cpp b/lib/Analysis/GRExprEngine.cpp index 4db00d2a6b..5a3f9871f7 100644 --- a/lib/Analysis/GRExprEngine.cpp +++ b/lib/Analysis/GRExprEngine.cpp @@ -763,8 +763,7 @@ void GRExprEngine::ProcessIndirectGoto(IndirectGotoNodeBuilder& builder) { } // This is really a catch-all. We don't support symbolics yet. - - assert (V.isUnknown()); + // FIXME: Implement dispatch for symbolic pointers. for (iterator I=builder.begin(), E=builder.end(); I != E; ++I) builder.generateNode(I, state); diff --git a/test/Analysis/misc-ps.m b/test/Analysis/misc-ps.m index ec0e95a465..005109fb73 100644 --- a/test/Analysis/misc-ps.m +++ b/test/Analysis/misc-ps.m @@ -249,7 +249,6 @@ void rdar_6777003(int x) { // regardless of how well the underlying StoreManager reasons about pointer // arithmetic. // <rdar://problem/6777209> - void rdar_6777209(char *p) { if (p == 0) return; @@ -260,3 +259,16 @@ void rdar_6777209(char *p) { if (p == 0) *p = 'c'; // no-warning } + +// PR 4033. A symbolic 'void *' pointer can be used as the address for a +// computed goto. +typedef void *Opcode; +Opcode pr_4033_getOpcode(); +void pr_4033(void) { +next_opcode: + { + Opcode op = pr_4033_getOpcode(); + if (op) goto *op; + } +} + |