Skip to content

Commit 570bc5d

Browse files
committed
Revert "[clang][analyzer] StreamChecker: Model getc, vfscanf, putc, vfprintf (llvm#82476)"
This reverts commit ffe7049. This commit breaks on e.g. arm: Example: https://lab.llvm.org/buildbot/#/builders/245/builds/21177/steps/5/logs/FAIL__Clang__stream_c ``` ******************** TEST 'Clang :: Analysis/stream.c' FAILED ******************** Exit Code: 1 Command Output (stderr): -- RUN: at line 1: /home/tcwg-buildbot/worker/clang-armv8-quick/stage1/bin/clang -cc1 -internal-isystem /home/tcwg-buildbot/worker/clang-armv8-quick/stage1/lib/clang/19/include -nostdsysteminc -analyze -analyzer-constraints=range -setup-static-analyzer -analyzer-checker=core,alpha.unix.Stream,debug.ExprInspection -verify /home/tcwg-buildbot/worker/clang-armv8-quick/llvm/clang/test/Analysis/stream.c + /home/tcwg-buildbot/worker/clang-armv8-quick/stage1/bin/clang -cc1 -internal-isystem /home/tcwg-buildbot/worker/clang-armv8-quick/stage1/lib/clang/19/include -nostdsysteminc -analyze -analyzer-constraints=range -setup-static-analyzer -analyzer-checker=core,alpha.unix.Stream,debug.ExprInspection -verify /home/tcwg-buildbot/worker/clang-armv8-quick/llvm/clang/test/Analysis/stream.c error: 'expected-warning' diagnostics expected but not seen: File /home/tcwg-buildbot/worker/clang-armv8-quick/llvm/clang/test/Analysis/stream.c Line 147: Stream pointer might be NULL File /home/tcwg-buildbot/worker/clang-armv8-quick/llvm/clang/test/Analysis/stream.c Line 153: Stream pointer might be NULL error: 'expected-warning' diagnostics seen but not expected: File /home/tcwg-buildbot/worker/clang-armv8-quick/llvm/clang/test/Analysis/stream.c Line 148: Stream pointer might be NULL [alpha.unix.Stream] File /home/tcwg-buildbot/worker/clang-armv8-quick/llvm/clang/test/Analysis/stream.c Line 154: Stream pointer might be NULL [alpha.unix.Stream] 4 errors generated. -- ******************** ```
1 parent 1f74f5f commit 570bc5d

File tree

6 files changed

+5
-105
lines changed

6 files changed

+5
-105
lines changed

clang/lib/StaticAnalyzer/Checkers/StreamChecker.cpp

Lines changed: 4 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -348,30 +348,18 @@ class StreamChecker : public Checker<check::PreCall, eval::Call,
348348
{{{"fgets"}, 3},
349349
{std::bind(&StreamChecker::preReadWrite, _1, _2, _3, _4, true),
350350
std::bind(&StreamChecker::evalFgetx, _1, _2, _3, _4, false), 2}},
351-
{{{"getc"}, 1},
352-
{std::bind(&StreamChecker::preReadWrite, _1, _2, _3, _4, true),
353-
std::bind(&StreamChecker::evalFgetx, _1, _2, _3, _4, true), 0}},
354351
{{{"fputc"}, 2},
355352
{std::bind(&StreamChecker::preReadWrite, _1, _2, _3, _4, false),
356353
std::bind(&StreamChecker::evalFputx, _1, _2, _3, _4, true), 1}},
357354
{{{"fputs"}, 2},
358355
{std::bind(&StreamChecker::preReadWrite, _1, _2, _3, _4, false),
359356
std::bind(&StreamChecker::evalFputx, _1, _2, _3, _4, false), 1}},
360-
{{{"putc"}, 2},
361-
{std::bind(&StreamChecker::preReadWrite, _1, _2, _3, _4, false),
362-
std::bind(&StreamChecker::evalFputx, _1, _2, _3, _4, true), 1}},
363357
{{{"fprintf"}},
364358
{std::bind(&StreamChecker::preReadWrite, _1, _2, _3, _4, false),
365359
std::bind(&StreamChecker::evalFprintf, _1, _2, _3, _4), 0}},
366-
{{{"vfprintf"}, 3},
367-
{std::bind(&StreamChecker::preReadWrite, _1, _2, _3, _4, false),
368-
std::bind(&StreamChecker::evalFprintf, _1, _2, _3, _4), 0}},
369360
{{{"fscanf"}},
370361
{std::bind(&StreamChecker::preReadWrite, _1, _2, _3, _4, true),
371362
std::bind(&StreamChecker::evalFscanf, _1, _2, _3, _4), 0}},
372-
{{{"vfscanf"}, 3},
373-
{std::bind(&StreamChecker::preReadWrite, _1, _2, _3, _4, true),
374-
std::bind(&StreamChecker::evalFscanf, _1, _2, _3, _4), 0}},
375363
{{{"ungetc"}, 2},
376364
{std::bind(&StreamChecker::preReadWrite, _1, _2, _3, _4, false),
377365
std::bind(&StreamChecker::evalUngetc, _1, _2, _3, _4), 1}},
@@ -1050,13 +1038,10 @@ void StreamChecker::evalFscanf(const FnDescription *Desc, const CallEvent &Call,
10501038
if (!StateNotFailed)
10511039
return;
10521040

1053-
if (auto const *Callee = Call.getCalleeIdentifier();
1054-
!Callee || !Callee->getName().equals("vfscanf")) {
1055-
SmallVector<unsigned int> EscArgs;
1056-
for (auto EscArg : llvm::seq(2u, Call.getNumArgs()))
1057-
EscArgs.push_back(EscArg);
1058-
StateNotFailed = escapeArgs(StateNotFailed, C, Call, EscArgs);
1059-
}
1041+
SmallVector<unsigned int> EscArgs;
1042+
for (auto EscArg : llvm::seq(2u, Call.getNumArgs()))
1043+
EscArgs.push_back(EscArg);
1044+
StateNotFailed = escapeArgs(StateNotFailed, C, Call, EscArgs);
10601045

10611046
if (StateNotFailed)
10621047
C.addTransition(StateNotFailed);

clang/test/Analysis/Inputs/system-header-simulator-for-simple-stream.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
// suppressed.
66
#pragma clang system_header
77

8-
typedef struct _FILE {
8+
typedef struct __sFILE {
99
unsigned char *_p;
1010
} FILE;
1111
FILE *fopen(const char *restrict, const char *restrict) __asm("_" "fopen" );

clang/test/Analysis/Inputs/system-header-simulator-for-valist.h

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,6 @@
1010
#define restrict /*restrict*/
1111
#endif
1212

13-
typedef struct _FILE FILE;
14-
1513
typedef __builtin_va_list va_list;
1614

1715
#define va_start(ap, param) __builtin_va_start(ap, param)
@@ -23,10 +21,6 @@ int vprintf (const char *restrict format, va_list arg);
2321

2422
int vsprintf (char *restrict s, const char *restrict format, va_list arg);
2523

26-
int vfprintf(FILE *stream, const char *format, va_list ap);
27-
28-
int vfscanf(FILE *stream, const char *format, va_list ap);
29-
3024
int some_library_function(int n, va_list arg);
3125

3226
// No warning from system header.

clang/test/Analysis/Inputs/system-header-simulator.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -73,9 +73,6 @@ int ferror(FILE *stream);
7373
int fileno(FILE *stream);
7474
int fflush(FILE *stream);
7575

76-
77-
int getc(FILE *stream);
78-
7976
size_t strlen(const char *);
8077

8178
char *strcpy(char *restrict, const char *restrict);

clang/test/Analysis/stream-invalidate.c

Lines changed: 0 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
// RUN: -analyzer-checker=debug.ExprInspection
55

66
#include "Inputs/system-header-simulator.h"
7-
#include "Inputs/system-header-simulator-for-valist.h"
87

98
void clang_analyzer_eval(int);
109
void clang_analyzer_dump(int);
@@ -146,44 +145,3 @@ void test_fgetpos() {
146145

147146
fclose(F);
148147
}
149-
150-
void test_fprintf() {
151-
FILE *F1 = tmpfile();
152-
if (!F1)
153-
return;
154-
155-
unsigned a = 42;
156-
char *output = "HELLO";
157-
int r = fprintf(F1, "%s\t%u\n", output, a);
158-
// fprintf does not invalidate any of its input
159-
// 69 is ascii for 'E'
160-
clang_analyzer_dump(a); // expected-warning {{42 S32b}}
161-
clang_analyzer_dump(output[1]); // expected-warning {{69 S32b}}
162-
fclose(F1);
163-
}
164-
165-
int test_vfscanf_inner(const char *fmt, ...) {
166-
FILE *F1 = tmpfile();
167-
if (!F1)
168-
return EOF;
169-
170-
va_list ap;
171-
va_start(ap, fmt);
172-
173-
int r = vfscanf(F1, fmt, ap);
174-
175-
fclose(F1);
176-
va_end(ap);
177-
return r;
178-
}
179-
180-
void test_vfscanf() {
181-
int i = 42;
182-
int j = 43;
183-
int r = test_vfscanf_inner("%d", &i);
184-
if (r != EOF) {
185-
// i gets invalidated by the call to test_vfscanf_inner, not by vfscanf.
186-
clang_analyzer_dump(i); // expected-warning {{conj_$}}
187-
clang_analyzer_dump(j); // expected-warning {{43 S32b}}
188-
}
189-
}

clang/test/Analysis/stream.c

Lines changed: 0 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
// RUN: %clang_analyze_cc1 -analyzer-checker=core,alpha.unix.Stream,debug.ExprInspection -verify %s
22

33
#include "Inputs/system-header-simulator.h"
4-
#include "Inputs/system-header-simulator-for-valist.h"
54

65
void clang_analyzer_eval(int);
76

@@ -66,24 +65,12 @@ void check_fseek(void) {
6665
fclose(fp);
6766
}
6867

69-
void check_fseeko(void) {
70-
FILE *fp = tmpfile();
71-
fseeko(fp, 0, 0); // expected-warning {{Stream pointer might be NULL}}
72-
fclose(fp);
73-
}
74-
7568
void check_ftell(void) {
7669
FILE *fp = tmpfile();
7770
ftell(fp); // expected-warning {{Stream pointer might be NULL}}
7871
fclose(fp);
7972
}
8073

81-
void check_ftello(void) {
82-
FILE *fp = tmpfile();
83-
ftello(fp); // expected-warning {{Stream pointer might be NULL}}
84-
fclose(fp);
85-
}
86-
8774
void check_rewind(void) {
8875
FILE *fp = tmpfile();
8976
rewind(fp); // expected-warning {{Stream pointer might be NULL}}
@@ -142,18 +129,6 @@ void f_dopen(int fd) {
142129
fclose(F);
143130
}
144131

145-
void f_vfprintf(int fd, va_list args) {
146-
FILE *F = fdopen(fd, "r");
147-
vfprintf(F, "%d", args); // expected-warning {{Stream pointer might be NULL}}
148-
fclose(F);
149-
}
150-
151-
void f_vfscanf(int fd, va_list args) {
152-
FILE *F = fdopen(fd, "r");
153-
vfscanf(F, "%u", args); // expected-warning {{Stream pointer might be NULL}}
154-
fclose(F);
155-
}
156-
157132
void f_seek(void) {
158133
FILE *p = fopen("foo", "r");
159134
if (!p)
@@ -163,15 +138,6 @@ void f_seek(void) {
163138
fclose(p);
164139
}
165140

166-
void f_seeko(void) {
167-
FILE *p = fopen("foo", "r");
168-
if (!p)
169-
return;
170-
fseeko(p, 1, SEEK_SET); // no-warning
171-
fseeko(p, 1, 3); // expected-warning {{The whence argument to fseek() should be SEEK_SET, SEEK_END, or SEEK_CUR}}
172-
fclose(p);
173-
}
174-
175141
void f_double_close(void) {
176142
FILE *p = fopen("foo", "r");
177143
if (!p)

0 commit comments

Comments
 (0)