1183ff2aaacbc1995ed64d5e2ffea4456fd871633Anna Zaks// RUN: %clang_cc1 -analyze -analyzer-checker=core,unix.Malloc -verify %s
28e8fb3be5bd78f0564444eca02b404566a5f3b5dAndy Gibbs// expected-no-diagnostics
3183ff2aaacbc1995ed64d5e2ffea4456fd871633Anna Zaks
4183ff2aaacbc1995ed64d5e2ffea4456fd871633Anna Zakstypedef struct {
5183ff2aaacbc1995ed64d5e2ffea4456fd871633Anna Zaks    char I[4];
6183ff2aaacbc1995ed64d5e2ffea4456fd871633Anna Zaks    int S;
7183ff2aaacbc1995ed64d5e2ffea4456fd871633Anna Zaks} Hdr;
8183ff2aaacbc1995ed64d5e2ffea4456fd871633Anna Zakstypedef struct {
9183ff2aaacbc1995ed64d5e2ffea4456fd871633Anna Zaks    short w;
10183ff2aaacbc1995ed64d5e2ffea4456fd871633Anna Zaks} Hdr2;
11183ff2aaacbc1995ed64d5e2ffea4456fd871633Anna Zakstypedef struct {
12183ff2aaacbc1995ed64d5e2ffea4456fd871633Anna Zaks    Hdr2 usedtobeundef;
13183ff2aaacbc1995ed64d5e2ffea4456fd871633Anna Zaks} Info;
14183ff2aaacbc1995ed64d5e2ffea4456fd871633Anna Zakstypedef struct {
15183ff2aaacbc1995ed64d5e2ffea4456fd871633Anna Zaks    const unsigned char *ib;
16183ff2aaacbc1995ed64d5e2ffea4456fd871633Anna Zaks    int cur;
17183ff2aaacbc1995ed64d5e2ffea4456fd871633Anna Zaks    int end;
18183ff2aaacbc1995ed64d5e2ffea4456fd871633Anna Zaks} IB;
19cd0655b17249c4c4908ca91462657f62285017e6Nick Lewyckyunsigned long gl(IB *input);
20183ff2aaacbc1995ed64d5e2ffea4456fd871633Anna Zaksinline void gbs(IB *input, unsigned char *buf, int count);
21183ff2aaacbc1995ed64d5e2ffea4456fd871633Anna Zaksvoid getB(IB *st, Hdr2 *usedtobeundef);
22183ff2aaacbc1995ed64d5e2ffea4456fd871633Anna Zaksinline unsigned char gb(IB *input) {
23183ff2aaacbc1995ed64d5e2ffea4456fd871633Anna Zaks    if (input->cur + 1 > input->end)
24183ff2aaacbc1995ed64d5e2ffea4456fd871633Anna Zaks      ;
25183ff2aaacbc1995ed64d5e2ffea4456fd871633Anna Zaks    return input->ib[(input->cur)++];
26183ff2aaacbc1995ed64d5e2ffea4456fd871633Anna Zaks}
27183ff2aaacbc1995ed64d5e2ffea4456fd871633Anna Zaksstatic void getID(IB *st, char str[4]) {
28183ff2aaacbc1995ed64d5e2ffea4456fd871633Anna Zaks    str[0] = gb(st);
29183ff2aaacbc1995ed64d5e2ffea4456fd871633Anna Zaks    str[1] = gb(st);
30183ff2aaacbc1995ed64d5e2ffea4456fd871633Anna Zaks    str[2] = gb(st);
31183ff2aaacbc1995ed64d5e2ffea4456fd871633Anna Zaks    str[3] = gb(st);
32183ff2aaacbc1995ed64d5e2ffea4456fd871633Anna Zaks}
33183ff2aaacbc1995ed64d5e2ffea4456fd871633Anna Zaksstatic void getH(IB *st, Hdr *header) {
34183ff2aaacbc1995ed64d5e2ffea4456fd871633Anna Zaks    getID (st, header->I);
35183ff2aaacbc1995ed64d5e2ffea4456fd871633Anna Zaks    header->S = gl(st);
36183ff2aaacbc1995ed64d5e2ffea4456fd871633Anna Zaks}
37183ff2aaacbc1995ed64d5e2ffea4456fd871633Anna Zaksstatic void readILBM(IB *st, Info *pic) {
38183ff2aaacbc1995ed64d5e2ffea4456fd871633Anna Zaks    // Initialize field;
39183ff2aaacbc1995ed64d5e2ffea4456fd871633Anna Zaks    pic->usedtobeundef.w = 5;
40183ff2aaacbc1995ed64d5e2ffea4456fd871633Anna Zaks
41183ff2aaacbc1995ed64d5e2ffea4456fd871633Anna Zaks    // Time out in the function so that we will be forced to retry with no inlining.
42183ff2aaacbc1995ed64d5e2ffea4456fd871633Anna Zaks    Hdr header;
43183ff2aaacbc1995ed64d5e2ffea4456fd871633Anna Zaks    getH (st, &header);
44183ff2aaacbc1995ed64d5e2ffea4456fd871633Anna Zaks    getID(st, header.I);
45183ff2aaacbc1995ed64d5e2ffea4456fd871633Anna Zaks    int i = 0;
46183ff2aaacbc1995ed64d5e2ffea4456fd871633Anna Zaks    while (st->cur < st->end && i < 4) {
47183ff2aaacbc1995ed64d5e2ffea4456fd871633Anna Zaks      i++;
48183ff2aaacbc1995ed64d5e2ffea4456fd871633Anna Zaks      getH (st, &header);
49183ff2aaacbc1995ed64d5e2ffea4456fd871633Anna Zaks    }
50183ff2aaacbc1995ed64d5e2ffea4456fd871633Anna Zaks}
51183ff2aaacbc1995ed64d5e2ffea4456fd871633Anna Zaksint bitmapImageRepFromIFF(IB st, const unsigned char *ib, int il) {
52183ff2aaacbc1995ed64d5e2ffea4456fd871633Anna Zaks    Info pic;
53183ff2aaacbc1995ed64d5e2ffea4456fd871633Anna Zaks    st.ib = ib;
54183ff2aaacbc1995ed64d5e2ffea4456fd871633Anna Zaks    st.cur = 0;
55183ff2aaacbc1995ed64d5e2ffea4456fd871633Anna Zaks    st.end = il;
56183ff2aaacbc1995ed64d5e2ffea4456fd871633Anna Zaks    readILBM(&st,&pic);
57183ff2aaacbc1995ed64d5e2ffea4456fd871633Anna Zaks    return pic.usedtobeundef.w; // No undefined value warning here.
58183ff2aaacbc1995ed64d5e2ffea4456fd871633Anna Zaks}
59