1*730ca47aSAlejandro Álvarez Ayllón // RUN: %clang_analyze_cc1 -analyzer-checker=core,unix,debug.ExprInspection -verify %s
2*730ca47aSAlejandro Álvarez Ayllón
3*730ca47aSAlejandro Álvarez Ayllón #include "Inputs/system-header-simulator.h"
4*730ca47aSAlejandro Álvarez Ayllón #include "Inputs/system-header-simulator-for-malloc.h"
5*730ca47aSAlejandro Álvarez Ayllón #include "Inputs/system-header-simulator-for-valist.h"
6*730ca47aSAlejandro Álvarez Ayllón
7*730ca47aSAlejandro Álvarez Ayllón void clang_analyzer_eval(int);
8*730ca47aSAlejandro Álvarez Ayllón void clang_analyzer_dump_int(int);
9*730ca47aSAlejandro Álvarez Ayllón void clang_analyzer_dump_ptr(void*);
10*730ca47aSAlejandro Álvarez Ayllón void clang_analyzer_warnIfReached();
11*730ca47aSAlejandro Álvarez Ayllón
test_getline_null_lineptr()12*730ca47aSAlejandro Álvarez Ayllón void test_getline_null_lineptr() {
13*730ca47aSAlejandro Álvarez Ayllón FILE *F1 = tmpfile();
14*730ca47aSAlejandro Álvarez Ayllón if (!F1)
15*730ca47aSAlejandro Álvarez Ayllón return;
16*730ca47aSAlejandro Álvarez Ayllón
17*730ca47aSAlejandro Álvarez Ayllón char **buffer = NULL;
18*730ca47aSAlejandro Álvarez Ayllón size_t n = 0;
19*730ca47aSAlejandro Álvarez Ayllón getline(buffer, &n, F1); // expected-warning {{Line pointer might be NULL}}
20*730ca47aSAlejandro Álvarez Ayllón fclose(F1);
21*730ca47aSAlejandro Álvarez Ayllón }
22*730ca47aSAlejandro Álvarez Ayllón
test_getline_null_size()23*730ca47aSAlejandro Álvarez Ayllón void test_getline_null_size() {
24*730ca47aSAlejandro Álvarez Ayllón FILE *F1 = tmpfile();
25*730ca47aSAlejandro Álvarez Ayllón if (!F1)
26*730ca47aSAlejandro Álvarez Ayllón return;
27*730ca47aSAlejandro Álvarez Ayllón char *buffer = NULL;
28*730ca47aSAlejandro Álvarez Ayllón getline(&buffer, NULL, F1); // expected-warning {{Size pointer might be NULL}}
29*730ca47aSAlejandro Álvarez Ayllón fclose(F1);
30*730ca47aSAlejandro Álvarez Ayllón }
31*730ca47aSAlejandro Álvarez Ayllón
test_getline_null_buffer_size_gt0()32*730ca47aSAlejandro Álvarez Ayllón void test_getline_null_buffer_size_gt0() {
33*730ca47aSAlejandro Álvarez Ayllón FILE *F1 = tmpfile();
34*730ca47aSAlejandro Álvarez Ayllón if (!F1)
35*730ca47aSAlejandro Álvarez Ayllón return;
36*730ca47aSAlejandro Álvarez Ayllón char *buffer = NULL;
37*730ca47aSAlejandro Álvarez Ayllón size_t n = 8;
38*730ca47aSAlejandro Álvarez Ayllón getline(&buffer, &n, F1); // ok since posix 2018
39*730ca47aSAlejandro Álvarez Ayllón free(buffer);
40*730ca47aSAlejandro Álvarez Ayllón fclose(F1);
41*730ca47aSAlejandro Álvarez Ayllón }
42*730ca47aSAlejandro Álvarez Ayllón
test_getline_null_buffer_size_gt0_2(size_t n)43*730ca47aSAlejandro Álvarez Ayllón void test_getline_null_buffer_size_gt0_2(size_t n) {
44*730ca47aSAlejandro Álvarez Ayllón FILE *F1 = tmpfile();
45*730ca47aSAlejandro Álvarez Ayllón if (!F1)
46*730ca47aSAlejandro Álvarez Ayllón return;
47*730ca47aSAlejandro Álvarez Ayllón char *buffer = NULL;
48*730ca47aSAlejandro Álvarez Ayllón if (n > 0) {
49*730ca47aSAlejandro Álvarez Ayllón getline(&buffer, &n, F1); // ok since posix 2018
50*730ca47aSAlejandro Álvarez Ayllón }
51*730ca47aSAlejandro Álvarez Ayllón free(buffer);
52*730ca47aSAlejandro Álvarez Ayllón fclose(F1);
53*730ca47aSAlejandro Álvarez Ayllón }
54*730ca47aSAlejandro Álvarez Ayllón
test_getline_null_buffer_unknown_size(size_t n)55*730ca47aSAlejandro Álvarez Ayllón void test_getline_null_buffer_unknown_size(size_t n) {
56*730ca47aSAlejandro Álvarez Ayllón FILE *F1 = tmpfile();
57*730ca47aSAlejandro Álvarez Ayllón if (!F1)
58*730ca47aSAlejandro Álvarez Ayllón return;
59*730ca47aSAlejandro Álvarez Ayllón char *buffer = NULL;
60*730ca47aSAlejandro Álvarez Ayllón
61*730ca47aSAlejandro Álvarez Ayllón getline(&buffer, &n, F1); // ok
62*730ca47aSAlejandro Álvarez Ayllón fclose(F1);
63*730ca47aSAlejandro Álvarez Ayllón free(buffer);
64*730ca47aSAlejandro Álvarez Ayllón }
65*730ca47aSAlejandro Álvarez Ayllón
test_getline_null_buffer_undef_size()66*730ca47aSAlejandro Álvarez Ayllón void test_getline_null_buffer_undef_size() {
67*730ca47aSAlejandro Álvarez Ayllón FILE *F1 = tmpfile();
68*730ca47aSAlejandro Álvarez Ayllón if (!F1)
69*730ca47aSAlejandro Álvarez Ayllón return;
70*730ca47aSAlejandro Álvarez Ayllón
71*730ca47aSAlejandro Álvarez Ayllón char *buffer = NULL;
72*730ca47aSAlejandro Álvarez Ayllón size_t n;
73*730ca47aSAlejandro Álvarez Ayllón
74*730ca47aSAlejandro Álvarez Ayllón getline(&buffer, &n, F1); // ok since posix 2018
75*730ca47aSAlejandro Álvarez Ayllón fclose(F1);
76*730ca47aSAlejandro Álvarez Ayllón free(buffer);
77*730ca47aSAlejandro Álvarez Ayllón }
78*730ca47aSAlejandro Álvarez Ayllón
test_getline_buffer_size_0()79*730ca47aSAlejandro Álvarez Ayllón void test_getline_buffer_size_0() {
80*730ca47aSAlejandro Álvarez Ayllón FILE *F1 = tmpfile();
81*730ca47aSAlejandro Álvarez Ayllón if (!F1)
82*730ca47aSAlejandro Álvarez Ayllón return;
83*730ca47aSAlejandro Álvarez Ayllón
84*730ca47aSAlejandro Álvarez Ayllón char *buffer = malloc(10);
85*730ca47aSAlejandro Álvarez Ayllón size_t n = 0;
86*730ca47aSAlejandro Álvarez Ayllón if (buffer != NULL)
87*730ca47aSAlejandro Álvarez Ayllón getline(&buffer, &n, F1); // ok, the buffer is enough for 0 character
88*730ca47aSAlejandro Álvarez Ayllón fclose(F1);
89*730ca47aSAlejandro Álvarez Ayllón free(buffer);
90*730ca47aSAlejandro Álvarez Ayllón }
91*730ca47aSAlejandro Álvarez Ayllón
test_getline_buffer_bad_size()92*730ca47aSAlejandro Álvarez Ayllón void test_getline_buffer_bad_size() {
93*730ca47aSAlejandro Álvarez Ayllón FILE *F1 = tmpfile();
94*730ca47aSAlejandro Álvarez Ayllón if (!F1)
95*730ca47aSAlejandro Álvarez Ayllón return;
96*730ca47aSAlejandro Álvarez Ayllón
97*730ca47aSAlejandro Álvarez Ayllón char *buffer = malloc(10);
98*730ca47aSAlejandro Álvarez Ayllón size_t n = 100;
99*730ca47aSAlejandro Álvarez Ayllón if (buffer != NULL)
100*730ca47aSAlejandro Álvarez Ayllón getline(&buffer, &n, F1); // expected-warning {{The buffer from the first argument is smaller than the size specified by the second parameter}}
101*730ca47aSAlejandro Álvarez Ayllón fclose(F1);
102*730ca47aSAlejandro Álvarez Ayllón free(buffer);
103*730ca47aSAlejandro Álvarez Ayllón }
104*730ca47aSAlejandro Álvarez Ayllón
test_getline_buffer_smaller_size()105*730ca47aSAlejandro Álvarez Ayllón void test_getline_buffer_smaller_size() {
106*730ca47aSAlejandro Álvarez Ayllón FILE *F1 = tmpfile();
107*730ca47aSAlejandro Álvarez Ayllón if (!F1)
108*730ca47aSAlejandro Álvarez Ayllón return;
109*730ca47aSAlejandro Álvarez Ayllón
110*730ca47aSAlejandro Álvarez Ayllón char *buffer = malloc(100);
111*730ca47aSAlejandro Álvarez Ayllón size_t n = 10;
112*730ca47aSAlejandro Álvarez Ayllón if (buffer != NULL)
113*730ca47aSAlejandro Álvarez Ayllón getline(&buffer, &n, F1); // ok, there is enough space for 10 characters
114*730ca47aSAlejandro Álvarez Ayllón fclose(F1);
115*730ca47aSAlejandro Álvarez Ayllón free(buffer);
116*730ca47aSAlejandro Álvarez Ayllón }
117*730ca47aSAlejandro Álvarez Ayllón
test_getline_buffer_undef_size()118*730ca47aSAlejandro Álvarez Ayllón void test_getline_buffer_undef_size() {
119*730ca47aSAlejandro Álvarez Ayllón FILE *F1 = tmpfile();
120*730ca47aSAlejandro Álvarez Ayllón if (!F1)
121*730ca47aSAlejandro Álvarez Ayllón return;
122*730ca47aSAlejandro Álvarez Ayllón
123*730ca47aSAlejandro Álvarez Ayllón char *buffer = malloc(100);
124*730ca47aSAlejandro Álvarez Ayllón size_t n;
125*730ca47aSAlejandro Álvarez Ayllón if (buffer != NULL)
126*730ca47aSAlejandro Álvarez Ayllón getline(&buffer, &n, F1); // expected-warning {{The buffer from the first argument is not NULL, but the size specified by the second parameter is undefined}}
127*730ca47aSAlejandro Álvarez Ayllón fclose(F1);
128*730ca47aSAlejandro Álvarez Ayllón free(buffer);
129*730ca47aSAlejandro Álvarez Ayllón }
130*730ca47aSAlejandro Álvarez Ayllón
131*730ca47aSAlejandro Álvarez Ayllón
test_getline_null_buffer()132*730ca47aSAlejandro Álvarez Ayllón void test_getline_null_buffer() {
133*730ca47aSAlejandro Álvarez Ayllón FILE *F1 = tmpfile();
134*730ca47aSAlejandro Álvarez Ayllón if (!F1)
135*730ca47aSAlejandro Álvarez Ayllón return;
136*730ca47aSAlejandro Álvarez Ayllón char *buffer = NULL;
137*730ca47aSAlejandro Álvarez Ayllón size_t n = 0;
138*730ca47aSAlejandro Álvarez Ayllón ssize_t r = getline(&buffer, &n, F1);
139*730ca47aSAlejandro Álvarez Ayllón // getline returns -1 on failure, number of char reads on success (>= 0)
140*730ca47aSAlejandro Álvarez Ayllón if (r < -1) {
141*730ca47aSAlejandro Álvarez Ayllón clang_analyzer_warnIfReached(); // must not happen
142*730ca47aSAlejandro Álvarez Ayllón } else {
143*730ca47aSAlejandro Álvarez Ayllón // The buffer could be allocated both on failure and success
144*730ca47aSAlejandro Álvarez Ayllón clang_analyzer_dump_int(n); // expected-warning {{conj_$}}
145*730ca47aSAlejandro Álvarez Ayllón clang_analyzer_dump_ptr(buffer); // expected-warning {{conj_$}}
146*730ca47aSAlejandro Álvarez Ayllón }
147*730ca47aSAlejandro Álvarez Ayllón free(buffer);
148*730ca47aSAlejandro Álvarez Ayllón fclose(F1);
149*730ca47aSAlejandro Álvarez Ayllón }
150*730ca47aSAlejandro Álvarez Ayllón
test_getdelim_null_size()151*730ca47aSAlejandro Álvarez Ayllón void test_getdelim_null_size() {
152*730ca47aSAlejandro Álvarez Ayllón FILE *F1 = tmpfile();
153*730ca47aSAlejandro Álvarez Ayllón if (!F1)
154*730ca47aSAlejandro Álvarez Ayllón return;
155*730ca47aSAlejandro Álvarez Ayllón char *buffer = NULL;
156*730ca47aSAlejandro Álvarez Ayllón getdelim(&buffer, NULL, ',', F1); // expected-warning {{Size pointer might be NULL}}
157*730ca47aSAlejandro Álvarez Ayllón fclose(F1);
158*730ca47aSAlejandro Álvarez Ayllón }
159*730ca47aSAlejandro Álvarez Ayllón
test_getdelim_null_buffer_size_gt0()160*730ca47aSAlejandro Álvarez Ayllón void test_getdelim_null_buffer_size_gt0() {
161*730ca47aSAlejandro Álvarez Ayllón FILE *F1 = tmpfile();
162*730ca47aSAlejandro Álvarez Ayllón if (!F1)
163*730ca47aSAlejandro Álvarez Ayllón return;
164*730ca47aSAlejandro Álvarez Ayllón char *buffer = NULL;
165*730ca47aSAlejandro Álvarez Ayllón size_t n = 8;
166*730ca47aSAlejandro Álvarez Ayllón getdelim(&buffer, &n, ';', F1); // ok since posix 2018
167*730ca47aSAlejandro Álvarez Ayllón free(buffer);
168*730ca47aSAlejandro Álvarez Ayllón fclose(F1);
169*730ca47aSAlejandro Álvarez Ayllón }
170*730ca47aSAlejandro Álvarez Ayllón
test_getdelim_null_buffer_size_gt0_2(size_t n)171*730ca47aSAlejandro Álvarez Ayllón void test_getdelim_null_buffer_size_gt0_2(size_t n) {
172*730ca47aSAlejandro Álvarez Ayllón FILE *F1 = tmpfile();
173*730ca47aSAlejandro Álvarez Ayllón if (!F1)
174*730ca47aSAlejandro Álvarez Ayllón return;
175*730ca47aSAlejandro Álvarez Ayllón char *buffer = NULL;
176*730ca47aSAlejandro Álvarez Ayllón if (n > 0) {
177*730ca47aSAlejandro Álvarez Ayllón getdelim(&buffer, &n, ' ', F1); // ok since posix 2018
178*730ca47aSAlejandro Álvarez Ayllón }
179*730ca47aSAlejandro Álvarez Ayllón free(buffer);
180*730ca47aSAlejandro Álvarez Ayllón fclose(F1);
181*730ca47aSAlejandro Álvarez Ayllón }
182*730ca47aSAlejandro Álvarez Ayllón
test_getdelim_null_buffer_unknown_size(size_t n)183*730ca47aSAlejandro Álvarez Ayllón void test_getdelim_null_buffer_unknown_size(size_t n) {
184*730ca47aSAlejandro Álvarez Ayllón FILE *F1 = tmpfile();
185*730ca47aSAlejandro Álvarez Ayllón if (!F1)
186*730ca47aSAlejandro Álvarez Ayllón return;
187*730ca47aSAlejandro Álvarez Ayllón char *buffer = NULL;
188*730ca47aSAlejandro Álvarez Ayllón getdelim(&buffer, &n, '-', F1); // ok
189*730ca47aSAlejandro Álvarez Ayllón fclose(F1);
190*730ca47aSAlejandro Álvarez Ayllón free(buffer);
191*730ca47aSAlejandro Álvarez Ayllón }
192*730ca47aSAlejandro Álvarez Ayllón
test_getdelim_null_buffer()193*730ca47aSAlejandro Álvarez Ayllón void test_getdelim_null_buffer() {
194*730ca47aSAlejandro Álvarez Ayllón FILE *F1 = tmpfile();
195*730ca47aSAlejandro Álvarez Ayllón if (!F1)
196*730ca47aSAlejandro Álvarez Ayllón return;
197*730ca47aSAlejandro Álvarez Ayllón char *buffer = NULL;
198*730ca47aSAlejandro Álvarez Ayllón size_t n = 0;
199*730ca47aSAlejandro Álvarez Ayllón ssize_t r = getdelim(&buffer, &n, '\r', F1);
200*730ca47aSAlejandro Álvarez Ayllón // getdelim returns -1 on failure, number of char reads on success (>= 0)
201*730ca47aSAlejandro Álvarez Ayllón if (r < -1) {
202*730ca47aSAlejandro Álvarez Ayllón clang_analyzer_warnIfReached(); // must not happen
203*730ca47aSAlejandro Álvarez Ayllón }
204*730ca47aSAlejandro Álvarez Ayllón else {
205*730ca47aSAlejandro Álvarez Ayllón // The buffer could be allocated both on failure and success
206*730ca47aSAlejandro Álvarez Ayllón clang_analyzer_dump_int(n); // expected-warning {{conj_$}}
207*730ca47aSAlejandro Álvarez Ayllón clang_analyzer_dump_ptr(buffer); // expected-warning {{conj_$}}
208*730ca47aSAlejandro Álvarez Ayllón }
209*730ca47aSAlejandro Álvarez Ayllón free(buffer);
210*730ca47aSAlejandro Álvarez Ayllón fclose(F1);
211*730ca47aSAlejandro Álvarez Ayllón }
212*730ca47aSAlejandro Álvarez Ayllón
test_getline_while()213*730ca47aSAlejandro Álvarez Ayllón void test_getline_while() {
214*730ca47aSAlejandro Álvarez Ayllón FILE *file = fopen("file.txt", "r");
215*730ca47aSAlejandro Álvarez Ayllón if (file == NULL) {
216*730ca47aSAlejandro Álvarez Ayllón return;
217*730ca47aSAlejandro Álvarez Ayllón }
218*730ca47aSAlejandro Álvarez Ayllón
219*730ca47aSAlejandro Álvarez Ayllón char *line = NULL;
220*730ca47aSAlejandro Álvarez Ayllón size_t len = 0;
221*730ca47aSAlejandro Álvarez Ayllón ssize_t read;
222*730ca47aSAlejandro Álvarez Ayllón
223*730ca47aSAlejandro Álvarez Ayllón while ((read = getline(&line, &len, file)) != -1) {
224*730ca47aSAlejandro Álvarez Ayllón printf("%s\n", line);
225*730ca47aSAlejandro Álvarez Ayllón }
226*730ca47aSAlejandro Álvarez Ayllón
227*730ca47aSAlejandro Álvarez Ayllón free(line);
228*730ca47aSAlejandro Álvarez Ayllón fclose(file);
229*730ca47aSAlejandro Álvarez Ayllón }
230*730ca47aSAlejandro Álvarez Ayllón
test_getline_return_check()231*730ca47aSAlejandro Álvarez Ayllón void test_getline_return_check() {
232*730ca47aSAlejandro Álvarez Ayllón FILE *file = fopen("file.txt", "r");
233*730ca47aSAlejandro Álvarez Ayllón if (file == NULL) {
234*730ca47aSAlejandro Álvarez Ayllón return;
235*730ca47aSAlejandro Álvarez Ayllón }
236*730ca47aSAlejandro Álvarez Ayllón
237*730ca47aSAlejandro Álvarez Ayllón char *line = NULL;
238*730ca47aSAlejandro Álvarez Ayllón size_t len = 0;
239*730ca47aSAlejandro Álvarez Ayllón ssize_t r = getline(&line, &len, file);
240*730ca47aSAlejandro Álvarez Ayllón
241*730ca47aSAlejandro Álvarez Ayllón if (r != -1) {
242*730ca47aSAlejandro Álvarez Ayllón if (line[0] == '\0') {} // ok
243*730ca47aSAlejandro Álvarez Ayllón }
244*730ca47aSAlejandro Álvarez Ayllón free(line);
245*730ca47aSAlejandro Álvarez Ayllón fclose(file);
246*730ca47aSAlejandro Álvarez Ayllón }
247*730ca47aSAlejandro Álvarez Ayllón
test_getline_clear_eof()248*730ca47aSAlejandro Álvarez Ayllón void test_getline_clear_eof() {
249*730ca47aSAlejandro Álvarez Ayllón FILE *file = fopen("file.txt", "r");
250*730ca47aSAlejandro Álvarez Ayllón if (file == NULL) {
251*730ca47aSAlejandro Álvarez Ayllón return;
252*730ca47aSAlejandro Álvarez Ayllón }
253*730ca47aSAlejandro Álvarez Ayllón
254*730ca47aSAlejandro Álvarez Ayllón size_t n = 10;
255*730ca47aSAlejandro Álvarez Ayllón char *buffer = malloc(n);
256*730ca47aSAlejandro Álvarez Ayllón ssize_t read = fread(buffer, n, 1, file);
257*730ca47aSAlejandro Álvarez Ayllón if (feof(file)) {
258*730ca47aSAlejandro Álvarez Ayllón clearerr(file);
259*730ca47aSAlejandro Álvarez Ayllón getline(&buffer, &n, file); // ok
260*730ca47aSAlejandro Álvarez Ayllón }
261*730ca47aSAlejandro Álvarez Ayllón fclose(file);
262*730ca47aSAlejandro Álvarez Ayllón free(buffer);
263*730ca47aSAlejandro Álvarez Ayllón }
264*730ca47aSAlejandro Álvarez Ayllón
test_getline_not_null(char ** buffer,size_t * size)265*730ca47aSAlejandro Álvarez Ayllón void test_getline_not_null(char **buffer, size_t *size) {
266*730ca47aSAlejandro Álvarez Ayllón FILE *file = fopen("file.txt", "r");
267*730ca47aSAlejandro Álvarez Ayllón if (file == NULL) {
268*730ca47aSAlejandro Álvarez Ayllón return;
269*730ca47aSAlejandro Álvarez Ayllón }
270*730ca47aSAlejandro Álvarez Ayllón
271*730ca47aSAlejandro Álvarez Ayllón getline(buffer, size, file);
272*730ca47aSAlejandro Álvarez Ayllón fclose(file);
273*730ca47aSAlejandro Álvarez Ayllón
274*730ca47aSAlejandro Álvarez Ayllón if (size == NULL || buffer == NULL) {
275*730ca47aSAlejandro Álvarez Ayllón clang_analyzer_warnIfReached(); // must not happen
276*730ca47aSAlejandro Álvarez Ayllón }
277*730ca47aSAlejandro Álvarez Ayllón }
278*730ca47aSAlejandro Álvarez Ayllón
test_getline_size_constraint(size_t size)279*730ca47aSAlejandro Álvarez Ayllón void test_getline_size_constraint(size_t size) {
280*730ca47aSAlejandro Álvarez Ayllón FILE *file = fopen("file.txt", "r");
281*730ca47aSAlejandro Álvarez Ayllón if (file == NULL) {
282*730ca47aSAlejandro Álvarez Ayllón return;
283*730ca47aSAlejandro Álvarez Ayllón }
284*730ca47aSAlejandro Álvarez Ayllón
285*730ca47aSAlejandro Álvarez Ayllón size_t old_size = size;
286*730ca47aSAlejandro Álvarez Ayllón char *buffer = malloc(10);
287*730ca47aSAlejandro Álvarez Ayllón if (buffer != NULL) {
288*730ca47aSAlejandro Álvarez Ayllón ssize_t r = getline(&buffer, &size, file);
289*730ca47aSAlejandro Álvarez Ayllón if (r >= 0) {
290*730ca47aSAlejandro Álvarez Ayllón // Since buffer has a size of 10, old_size must be less than or equal to 10.
291*730ca47aSAlejandro Álvarez Ayllón // Otherwise, there would be UB.
292*730ca47aSAlejandro Álvarez Ayllón clang_analyzer_eval(old_size <= 10); // expected-warning{{TRUE}}
293*730ca47aSAlejandro Álvarez Ayllón }
294*730ca47aSAlejandro Álvarez Ayllón }
295*730ca47aSAlejandro Álvarez Ayllón fclose(file);
296*730ca47aSAlejandro Álvarez Ayllón free(buffer);
297*730ca47aSAlejandro Álvarez Ayllón }
298*730ca47aSAlejandro Álvarez Ayllón
test_getline_negative_buffer()299*730ca47aSAlejandro Álvarez Ayllón void test_getline_negative_buffer() {
300*730ca47aSAlejandro Álvarez Ayllón FILE *file = fopen("file.txt", "r");
301*730ca47aSAlejandro Álvarez Ayllón if (file == NULL) {
302*730ca47aSAlejandro Álvarez Ayllón return;
303*730ca47aSAlejandro Álvarez Ayllón }
304*730ca47aSAlejandro Álvarez Ayllón
305*730ca47aSAlejandro Álvarez Ayllón char *buffer = NULL;
306*730ca47aSAlejandro Álvarez Ayllón size_t n = -1;
307*730ca47aSAlejandro Álvarez Ayllón getline(&buffer, &n, file); // ok since posix 2018
308*730ca47aSAlejandro Álvarez Ayllón free(buffer);
309*730ca47aSAlejandro Álvarez Ayllón fclose(file);
310*730ca47aSAlejandro Álvarez Ayllón }
311*730ca47aSAlejandro Álvarez Ayllón
test_getline_negative_buffer_2(char * buffer)312*730ca47aSAlejandro Álvarez Ayllón void test_getline_negative_buffer_2(char *buffer) {
313*730ca47aSAlejandro Álvarez Ayllón FILE *file = fopen("file.txt", "r");
314*730ca47aSAlejandro Álvarez Ayllón if (file == NULL) {
315*730ca47aSAlejandro Álvarez Ayllón return;
316*730ca47aSAlejandro Álvarez Ayllón }
317*730ca47aSAlejandro Álvarez Ayllón
318*730ca47aSAlejandro Álvarez Ayllón size_t n = -1;
319*730ca47aSAlejandro Álvarez Ayllón (void)getline(&buffer, &n, file); // ok
320*730ca47aSAlejandro Álvarez Ayllón free(buffer);
321*730ca47aSAlejandro Álvarez Ayllón fclose(file);
322*730ca47aSAlejandro Álvarez Ayllón }
323