1*67e74705SXin Li // RUN: %clang_cc1 -analyze -analyzer-checker=core,unix.Malloc -verify %s
2*67e74705SXin Li // expected-no-diagnostics
3*67e74705SXin Li
4*67e74705SXin Li typedef struct {
5*67e74705SXin Li char I[4];
6*67e74705SXin Li int S;
7*67e74705SXin Li } Hdr;
8*67e74705SXin Li typedef struct {
9*67e74705SXin Li short w;
10*67e74705SXin Li } Hdr2;
11*67e74705SXin Li typedef struct {
12*67e74705SXin Li Hdr2 usedtobeundef;
13*67e74705SXin Li } Info;
14*67e74705SXin Li typedef struct {
15*67e74705SXin Li const unsigned char *ib;
16*67e74705SXin Li int cur;
17*67e74705SXin Li int end;
18*67e74705SXin Li } IB;
19*67e74705SXin Li unsigned long gl(IB *input);
20*67e74705SXin Li inline void gbs(IB *input, unsigned char *buf, int count);
21*67e74705SXin Li void getB(IB *st, Hdr2 *usedtobeundef);
gb(IB * input)22*67e74705SXin Li inline unsigned char gb(IB *input) {
23*67e74705SXin Li if (input->cur + 1 > input->end)
24*67e74705SXin Li ;
25*67e74705SXin Li return input->ib[(input->cur)++];
26*67e74705SXin Li }
getID(IB * st,char str[4])27*67e74705SXin Li static void getID(IB *st, char str[4]) {
28*67e74705SXin Li str[0] = gb(st);
29*67e74705SXin Li str[1] = gb(st);
30*67e74705SXin Li str[2] = gb(st);
31*67e74705SXin Li str[3] = gb(st);
32*67e74705SXin Li }
getH(IB * st,Hdr * header)33*67e74705SXin Li static void getH(IB *st, Hdr *header) {
34*67e74705SXin Li getID (st, header->I);
35*67e74705SXin Li header->S = gl(st);
36*67e74705SXin Li }
readILBM(IB * st,Info * pic)37*67e74705SXin Li static void readILBM(IB *st, Info *pic) {
38*67e74705SXin Li // Initialize field;
39*67e74705SXin Li pic->usedtobeundef.w = 5;
40*67e74705SXin Li
41*67e74705SXin Li // Time out in the function so that we will be forced to retry with no inlining.
42*67e74705SXin Li Hdr header;
43*67e74705SXin Li getH (st, &header);
44*67e74705SXin Li getID(st, header.I);
45*67e74705SXin Li int i = 0;
46*67e74705SXin Li while (st->cur < st->end && i < 4) {
47*67e74705SXin Li i++;
48*67e74705SXin Li getH (st, &header);
49*67e74705SXin Li }
50*67e74705SXin Li }
bitmapImageRepFromIFF(IB st,const unsigned char * ib,int il)51*67e74705SXin Li int bitmapImageRepFromIFF(IB st, const unsigned char *ib, int il) {
52*67e74705SXin Li Info pic;
53*67e74705SXin Li st.ib = ib;
54*67e74705SXin Li st.cur = 0;
55*67e74705SXin Li st.end = il;
56*67e74705SXin Li readILBM(&st,&pic);
57*67e74705SXin Li return pic.usedtobeundef.w; // No undefined value warning here.
58*67e74705SXin Li }
59