1 // RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -analyze -analyzer-checker=core,alpha.valist.Uninitialized,alpha.valist.CopyToSelf -analyzer-output=text -analyzer-store=region -verify %s
3 #include "Inputs/system-header-simulator-for-valist.h"
5 void f1(int fst, ...) {
7 (void)va_arg(va, int); //expected-warning{{va_arg() is called on an uninitialized va_list}} expected-note{{va_arg() is called on an uninitialized va_list}}
10 int f2(int fst, ...) {
12 va_start(va, fst); // expected-note{{Initialized va_list}}
13 va_end(va); // expected-note{{Ended va_list}}
14 return va_arg(va, int); //expected-warning{{va_arg() is called on an uninitialized va_list}} expected-note{{va_arg() is called on an uninitialized va_list}}
17 void f3(int fst, ...) {
22 (void)va_arg(va2, int);
26 void f4(int cond, ...) {
28 if (cond) { // expected-note{{Assuming 'cond' is 0}} expected-note{{Taking false branch}}
32 va_end(va); //expected-warning{{va_end() is called on an uninitialized va_list}} expected-note{{va_end() is called on an uninitialized va_list}}
35 void f5(va_list fst, ...) {
37 (void)va_arg(fst, int);
41 //FIXME: this should not cause a warning
42 void f6(va_list *fst, ...) {
44 (void)va_arg(*fst, int); //expected-warning{{va_arg() is called on an uninitialized va_list}} expected-note{{va_arg() is called on an uninitialized va_list}}
48 void f7(int *fst, ...) {
56 void f8(int *fst, ...) {
59 va_start(*y,fst); // expected-note{{Initialized va_list}}
60 va_end(x); // expected-note{{Ended va_list}}
61 (void)va_arg(*y, int); //expected-warning{{va_arg() is called on an uninitialized va_list}} expected-note{{va_arg() is called on an uninitialized va_list}}
64 // This only contains problems which are handled by varargs.Unterminated.
65 void reinit(int *fst, ...) {
69 (void)va_arg(va, int);
72 void reinitOk(int *fst, ...) {
75 (void)va_arg(va, int);
78 (void)va_arg(va, int);
82 void reinit3(int *fst, ...) {
84 va_start(va, fst); // expected-note{{Initialized va_list}}
85 (void)va_arg(va, int);
86 va_end(va); // expected-note{{Ended va_list}}
87 va_start(va, fst); // expected-note{{Initialized va_list}}
88 (void)va_arg(va, int);
89 va_end(va); // expected-note{{Ended va_list}}
90 (void)va_arg(va, int); //expected-warning{{va_arg() is called on an uninitialized va_list}} expected-note{{va_arg() is called on an uninitialized va_list}}
93 void copyself(int fst, ...) {
95 va_start(va, fst); // expected-note{{Initialized va_list}}
96 va_copy(va, va); // expected-warning{{va_list 'va' is copied onto itself}} expected-note{{va_list 'va' is copied onto itself}}
100 void copyselfUninit(int fst, ...) {
102 va_copy(va, va); // expected-warning{{va_list 'va' is copied onto itself}} expected-note{{va_list 'va' is copied onto itself}}
105 void copyOverwrite(int fst, ...) {
107 va_start(va, fst); // expected-note{{Initialized va_list}}
108 va_copy(va, va2); // expected-warning{{Initialized va_list 'va' is overwritten by an uninitialized one}} expected-note{{Initialized va_list 'va' is overwritten by an uninitialized one}}
111 void copyUnint(int fst, ...) {
113 va_copy(va, va2); // expected-warning{{Uninitialized va_list is copied}} expected-note{{Uninitialized va_list is copied}}
116 void g1(int fst, ...) {
118 va_end(va); // expected-warning{{va_end() is called on an uninitialized va_list}} expected-note{{va_end() is called on an uninitialized va_list}}
121 void g2(int fst, ...) {
123 va_start(va, fst); // expected-note{{Initialized va_list}}
124 va_end(va); // expected-note{{Ended va_list}}
125 va_end(va); // expected-warning{{va_end() is called on an uninitialized va_list}} expected-note{{va_end() is called on an uninitialized va_list}}
128 void is_sink(int fst, ...) {
130 va_end(va); // expected-warning{{va_end() is called on an uninitialized va_list}} expected-note{{va_end() is called on an uninitialized va_list}}
131 *((volatile int *)0) = 1; //no-warning
134 // NOTE: this is invalid, as the man page of va_end requires that "Each invocation of va_start()
135 // must be matched by a corresponding invocation of va_end() in the same function."
136 void ends_arg(va_list arg) {
140 void uses_arg(va_list arg) {
141 (void)va_arg(arg, int);
144 // This is the same function as the previous one, but it is called in call_uses_arg2(),
145 // and the warning is generated during the analysis of call_uses_arg2().
146 void inlined_uses_arg(va_list arg) {
147 (void)va_arg(arg, int); //expected-warning{{va_arg() is called on an uninitialized va_list}} expected-note{{va_arg() is called on an uninitialized va_list}}
150 void call_inlined_uses_arg(int fst, ...) {
152 inlined_uses_arg(va); // expected-note{{Calling 'inlined_uses_arg'}}
155 void call_vprintf_ok(int isstring, ...) {
157 va_start(va, isstring);
158 vprintf(isstring ? "%s" : "%d", va);
162 void call_vprintf_bad(int isstring, ...) {
164 vprintf(isstring ? "%s" : "%d", va); //expected-warning{{Function 'vprintf' is called with an uninitialized va_list argument}} expected-note{{Function 'vprintf' is called with an uninitialized va_list argument}} expected-note{{Assuming 'isstring' is 0}} expected-note{{'?' condition is false}}
167 void call_vsprintf_bad(char *buffer, ...) {
169 va_start(va, buffer); // expected-note{{Initialized va_list}}
170 va_end(va); // expected-note{{Ended va_list}}
171 vsprintf(buffer, "%s %d %d %lf %03d", va); //expected-warning{{Function 'vsprintf' is called with an uninitialized va_list argument}} expected-note{{Function 'vsprintf' is called with an uninitialized va_list argument}}
174 void call_some_other_func(int n, ...) {
176 some_library_function(n, va);