system-header-simulator.h revision b7a747b0c271faeeb8d0f886f0e691eb25f637d9
1865f88afc0d59d886fb2ad50429e584ecf17fa81Brian// Like the compiler, the static analyzer treats some functions differently if 2865f88afc0d59d886fb2ad50429e584ecf17fa81Brian// they come from a system header -- for example, it is assumed that system 3827e72de7537e62cac9652f8b7344ff356de9bb1Brian// functions do not arbitrarily free() their parameters, and that some bugs 4865f88afc0d59d886fb2ad50429e584ecf17fa81Brian// found in system headers cannot be fixed by the user and should be 5827e72de7537e62cac9652f8b7344ff356de9bb1Brian// suppressed. 6865f88afc0d59d886fb2ad50429e584ecf17fa81Brian#pragma clang system_header 7865f88afc0d59d886fb2ad50429e584ecf17fa81Brian 8865f88afc0d59d886fb2ad50429e584ecf17fa81Brian#ifdef __cplusplus 9865f88afc0d59d886fb2ad50429e584ecf17fa81Brian#define restrict /*restrict*/ 10865f88afc0d59d886fb2ad50429e584ecf17fa81Brian#endif 11865f88afc0d59d886fb2ad50429e584ecf17fa81Brian 12865f88afc0d59d886fb2ad50429e584ecf17fa81Briantypedef struct _FILE FILE; 13865f88afc0d59d886fb2ad50429e584ecf17fa81Brianextern FILE *stdin; 14865f88afc0d59d886fb2ad50429e584ecf17fa81Brianextern FILE *stdout; 15865f88afc0d59d886fb2ad50429e584ecf17fa81Brianextern FILE *stderr; 16865f88afc0d59d886fb2ad50429e584ecf17fa81Brian// Include a variant of standard streams that occur in the pre-processed file. 17865f88afc0d59d886fb2ad50429e584ecf17fa81Brianextern FILE *__stdinp; 18865f88afc0d59d886fb2ad50429e584ecf17fa81Brianextern FILE *__stdoutp; 19865f88afc0d59d886fb2ad50429e584ecf17fa81Brianextern FILE *__stderrp; 20865f88afc0d59d886fb2ad50429e584ecf17fa81Brian 21865f88afc0d59d886fb2ad50429e584ecf17fa81Brianint scanf(const char *restrict format, ...); 22865f88afc0d59d886fb2ad50429e584ecf17fa81Brianint fscanf(FILE *restrict, const char *restrict, ...); 23865f88afc0d59d886fb2ad50429e584ecf17fa81Brianint printf(const char *restrict format, ...); 24865f88afc0d59d886fb2ad50429e584ecf17fa81Brianint fprintf(FILE *restrict, const char *restrict, ...); 25c223c6b663cd5db39ba19c2be74b88cc3b8f53f3Brianint getchar(void); 26c223c6b663cd5db39ba19c2be74b88cc3b8f53f3Brian 27c223c6b663cd5db39ba19c2be74b88cc3b8f53f3Brian// Note, on some platforms errno macro gets replaced with a function call. 28c223c6b663cd5db39ba19c2be74b88cc3b8f53f3Brianextern int errno; 29c223c6b663cd5db39ba19c2be74b88cc3b8f53f3Brian 30865f88afc0d59d886fb2ad50429e584ecf17fa81Briantypedef __typeof(sizeof(int)) size_t; 31c968d3d410a1897ecbb41d3557adaef69a4c627aBrian 32865f88afc0d59d886fb2ad50429e584ecf17fa81Briansize_t strlen(const char *); 33865f88afc0d59d886fb2ad50429e584ecf17fa81Brian 34865f88afc0d59d886fb2ad50429e584ecf17fa81Brianchar *strcpy(char *restrict, const char *restrict); 35865f88afc0d59d886fb2ad50429e584ecf17fa81Brianvoid *memcpy(void *dst, const void *src, size_t n); 3654c62ba5c36f3e2b279151f5df851d2ceee15319Brian Paul 3754c62ba5c36f3e2b279151f5df851d2ceee15319Brian Paultypedef unsigned long __darwin_pthread_key_t; 3854c62ba5c36f3e2b279151f5df851d2ceee15319Brian Paultypedef __darwin_pthread_key_t pthread_key_t; 3954c62ba5c36f3e2b279151f5df851d2ceee15319Brian Paulint pthread_setspecific(pthread_key_t, const void *); 4054c62ba5c36f3e2b279151f5df851d2ceee15319Brian Paul 4154c62ba5c36f3e2b279151f5df851d2ceee15319Brian Paultypedef long long __int64_t; 4254c62ba5c36f3e2b279151f5df851d2ceee15319Brian Paultypedef __int64_t __darwin_off_t; 4354c62ba5c36f3e2b279151f5df851d2ceee15319Brian Paultypedef __darwin_off_t fpos_t; 4454c62ba5c36f3e2b279151f5df851d2ceee15319Brian Paul 4554c62ba5c36f3e2b279151f5df851d2ceee15319Brian Paulvoid setbuf(FILE * restrict, char * restrict); 4654c62ba5c36f3e2b279151f5df851d2ceee15319Brian Paulint setvbuf(FILE * restrict, char * restrict, int, size_t); 4754c62ba5c36f3e2b279151f5df851d2ceee15319Brian Paul 4854c62ba5c36f3e2b279151f5df851d2ceee15319Brian PaulFILE *fopen(const char * restrict, const char * restrict); 4954c62ba5c36f3e2b279151f5df851d2ceee15319Brian Paulint fclose(FILE *); 5054c62ba5c36f3e2b279151f5df851d2ceee15319Brian PaulFILE *funopen(const void *, 5154c62ba5c36f3e2b279151f5df851d2ceee15319Brian Paul int (*)(void *, char *, int), 5254c62ba5c36f3e2b279151f5df851d2ceee15319Brian Paul int (*)(void *, const char *, int), 5354c62ba5c36f3e2b279151f5df851d2ceee15319Brian Paul fpos_t (*)(void *, fpos_t, int), 5454c62ba5c36f3e2b279151f5df851d2ceee15319Brian Paul int (*)(void *)); 5554c62ba5c36f3e2b279151f5df851d2ceee15319Brian Paul 5654c62ba5c36f3e2b279151f5df851d2ceee15319Brian Paulint sqlite3_bind_text_my(int, const char*, int n, void(*)(void*)); 5754c62ba5c36f3e2b279151f5df851d2ceee15319Brian Paul 5854c62ba5c36f3e2b279151f5df851d2ceee15319Brian Paultypedef void (*freeCallback) (void*); 5954c62ba5c36f3e2b279151f5df851d2ceee15319Brian Paultypedef struct { 6054c62ba5c36f3e2b279151f5df851d2ceee15319Brian Paul int i; 6154c62ba5c36f3e2b279151f5df851d2ceee15319Brian Paul freeCallback fc; 6254c62ba5c36f3e2b279151f5df851d2ceee15319Brian Paul} StWithCallback; 6354c62ba5c36f3e2b279151f5df851d2ceee15319Brian Paul 6454c62ba5c36f3e2b279151f5df851d2ceee15319Brian Paulint dealocateMemWhenDoneByVal(void*, StWithCallback); 65ade508312c701ce89d3c2cd717994dbbabb4f207Brian Paulint dealocateMemWhenDoneByRef(StWithCallback*, const void*); 66ade508312c701ce89d3c2cd717994dbbabb4f207Brian Paul 67865f88afc0d59d886fb2ad50429e584ecf17fa81Briantypedef struct CGContext *CGContextRef; 68865f88afc0d59d886fb2ad50429e584ecf17fa81BrianCGContextRef CGBitmapContextCreate(void *data/*, size_t width, size_t height, 69ade508312c701ce89d3c2cd717994dbbabb4f207Brian Paul size_t bitsPerComponent, size_t bytesPerRow, 70ade508312c701ce89d3c2cd717994dbbabb4f207Brian Paul CGColorSpaceRef space, 71865f88afc0d59d886fb2ad50429e584ecf17fa81Brian CGBitmapInfo bitmapInfo*/); 72827e72de7537e62cac9652f8b7344ff356de9bb1Brianvoid *CGBitmapContextGetData(CGContextRef context); 73865f88afc0d59d886fb2ad50429e584ecf17fa81Brian 74be1a76f88f4c3482e61e0a048a0b28b6b628f223Brian Paul// Include xpc. 75be1a76f88f4c3482e61e0a048a0b28b6b628f223Brian Paultypedef struct _xpc_connection_s * xpc_connection_t; 76be1a76f88f4c3482e61e0a048a0b28b6b628f223Brian Paultypedef void (*xpc_finalizer_t)(void *value); 77be1a76f88f4c3482e61e0a048a0b28b6b628f223Brian Paulvoid xpc_connection_set_context(xpc_connection_t connection, void *context); 78c71fa34728ef4eddd074aeb2bee49ae6a7acb3d1Brian Paulvoid xpc_connection_set_finalizer_f(xpc_connection_t connection, xpc_finalizer_t finalizer); 79ade508312c701ce89d3c2cd717994dbbabb4f207Brian Paulvoid xpc_connection_resume(xpc_connection_t connection); 80be1a76f88f4c3482e61e0a048a0b28b6b628f223Brian Paul 81be1a76f88f4c3482e61e0a048a0b28b6b628f223Brian Paul//The following are fake system header functions for generic testing. 82be1a76f88f4c3482e61e0a048a0b28b6b628f223Brian Paulvoid fakeSystemHeaderCallInt(int *); 83be1a76f88f4c3482e61e0a048a0b28b6b628f223Brian Paulvoid fakeSystemHeaderCallIntPtr(int **); 8454c62ba5c36f3e2b279151f5df851d2ceee15319Brian Paul 85be1a76f88f4c3482e61e0a048a0b28b6b628f223Brian Paultypedef struct __SomeStruct { 86be1a76f88f4c3482e61e0a048a0b28b6b628f223Brian Paul char * p; 8788f3656ea7ae57d22141225db0c5d90ceab420ddBrian Paul} SomeStruct; 88be1a76f88f4c3482e61e0a048a0b28b6b628f223Brian Paulvoid fakeSystemHeaderCall(SomeStruct *); 89865f88afc0d59d886fb2ad50429e584ecf17fa81Brian