59 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			59 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| // RUN: %clang_cc1 -analyze -analyzer-checker=core,unix.Malloc -verify %s
 | |
| // expected-no-diagnostics
 | |
| 
 | |
| 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;
 | |
| 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.
 | |
| }
 | 
