summaryrefslogtreecommitdiffstats
path: root/clang/test/Analysis/engine
diff options
context:
space:
mode:
authorAnna Zaks <ganna@apple.com>2012-06-01 23:48:44 +0000
committerAnna Zaks <ganna@apple.com>2012-06-01 23:48:44 +0000
commitbec49efdf2d7fe33a064a3e9faffa7704df87593 (patch)
tree3898a661532251c569ad9d696da686b66e9248dd /clang/test/Analysis/engine
parent1b37ea0a5fd0e4a3cc6187644de9f5e5ad8b7e7a (diff)
downloadbcm5719-llvm-bec49efdf2d7fe33a064a3e9faffa7704df87593.tar.gz
bcm5719-llvm-bec49efdf2d7fe33a064a3e9faffa7704df87593.zip
[analyzer] Fix a spurious undef value warning.
When we timeout or exceed a max number of blocks within an inlined function, we retry with no inlining starting from a node right before the CallEnter node. We assume the state of that node is the state of the program before we start evaluating the call. However, the node pruning removes this node as unimportant. Teach the node pruning to keep the predecessors of the call enter nodes. llvm-svn: 157860
Diffstat (limited to 'clang/test/Analysis/engine')
-rw-r--r--clang/test/Analysis/engine/replay-without-inlining.c57
1 files changed, 57 insertions, 0 deletions
diff --git a/clang/test/Analysis/engine/replay-without-inlining.c b/clang/test/Analysis/engine/replay-without-inlining.c
new file mode 100644
index 00000000000..9ec2d08f399
--- /dev/null
+++ b/clang/test/Analysis/engine/replay-without-inlining.c
@@ -0,0 +1,57 @@
+// RUN: %clang_cc1 -analyze -analyzer-checker=core,unix.Malloc -verify %s
+
+typedef struct {
+ char I[4];
+ int S;
+} Hdr;
+typedef struct {
+ short w;
+} Hdr2;
+typedef struct {
+ Hdr2 usedtobeundef;
+} Info;
+typedef struct {
+ const unsigned char *ib;
+ int cur;
+ int end;
+} IB;
+inline unsigned long gl(IB *input);
+inline void gbs(IB *input, unsigned char *buf, int count);
+void getB(IB *st, Hdr2 *usedtobeundef);
+inline unsigned char gb(IB *input) {
+ if (input->cur + 1 > input->end)
+ ;
+ return input->ib[(input->cur)++];
+}
+static void getID(IB *st, char str[4]) {
+ str[0] = gb(st);
+ str[1] = gb(st);
+ str[2] = gb(st);
+ str[3] = gb(st);
+}
+static void getH(IB *st, Hdr *header) {
+ getID (st, header->I);
+ header->S = gl(st);
+}
+static void readILBM(IB *st, Info *pic) {
+ // Initialize field;
+ pic->usedtobeundef.w = 5;
+
+ // Time out in the function so that we will be forced to retry with no inlining.
+ Hdr header;
+ getH (st, &header);
+ getID(st, header.I);
+ int i = 0;
+ while (st->cur < st->end && i < 4) {
+ i++;
+ getH (st, &header);
+ }
+}
+int bitmapImageRepFromIFF(IB st, const unsigned char *ib, int il) {
+ Info pic;
+ st.ib = ib;
+ st.cur = 0;
+ st.end = il;
+ readILBM(&st,&pic);
+ return pic.usedtobeundef.w; // No undefined value warning here.
+}
OpenPOWER on IntegriCloud