| 1 | // Like the compiler, the static analyzer treats some functions differently if |
| 2 | // they come from a system header -- for example, it is assumed that system |
| 3 | // functions do not arbitrarily free() their parameters, and that some bugs |
| 4 | // found in system headers cannot be fixed by the user and should be |
| 5 | // suppressed. |
| 6 | |
| 7 | #pragma clang system_header |
| 8 | |
| 9 | #ifdef __cplusplus |
| 10 | #define restrict /*restrict*/ |
| 11 | #endif |
| 12 | |
| 13 | typedef __builtin_va_list va_list; |
| 14 | |
| 15 | #define va_start(ap, param) __builtin_va_start(ap, param) |
| 16 | #define va_end(ap) __builtin_va_end(ap) |
| 17 | #define va_arg(ap, type) __builtin_va_arg(ap, type) |
| 18 | #define va_copy(dst, src) __builtin_va_copy(dst, src) |
| 19 | |
| 20 | int vprintf (const char *restrict format, va_list arg); |
| 21 | |
| 22 | int vsprintf (char *restrict s, const char *restrict format, va_list arg); |
| 23 | |
| 24 | int some_library_function(int n, va_list arg); |
| 25 | |
| 26 | // No warning from system header. |
| 27 | inline void __impl_detail(int fst, ...) { |
| 28 | va_list va; |
| 29 | (void)va_arg(va, int); |
| 30 | } |
| 31 | |