forked from OSchip/llvm-project
86 lines
2.7 KiB
C
86 lines
2.7 KiB
C
// RUN: %clang_analyze_cc1 -analyzer-checker=core -analyzer-checker=debug.StreamTester,debug.ExprInspection -analyzer-store region -verify %s
|
|
|
|
#include "Inputs/system-header-simulator.h"
|
|
|
|
void clang_analyzer_eval(int);
|
|
void StreamTesterChecker_make_feof_stream(FILE *);
|
|
void StreamTesterChecker_make_ferror_stream(FILE *);
|
|
|
|
void error_fopen() {
|
|
FILE *F = fopen("file", "r");
|
|
if (!F)
|
|
return;
|
|
clang_analyzer_eval(feof(F)); // expected-warning {{FALSE}}
|
|
clang_analyzer_eval(ferror(F)); // expected-warning {{FALSE}}
|
|
fclose(F);
|
|
}
|
|
|
|
void error_freopen() {
|
|
FILE *F = fopen("file", "r");
|
|
if (!F)
|
|
return;
|
|
F = freopen(0, "w", F);
|
|
if (!F)
|
|
return;
|
|
clang_analyzer_eval(feof(F)); // expected-warning {{FALSE}}
|
|
clang_analyzer_eval(ferror(F)); // expected-warning {{FALSE}}
|
|
fclose(F);
|
|
}
|
|
|
|
void stream_error_feof() {
|
|
FILE *F = fopen("file", "r");
|
|
if (!F)
|
|
return;
|
|
StreamTesterChecker_make_feof_stream(F);
|
|
clang_analyzer_eval(feof(F)); // expected-warning {{TRUE}}
|
|
clang_analyzer_eval(ferror(F)); // expected-warning {{FALSE}}
|
|
clearerr(F);
|
|
clang_analyzer_eval(feof(F)); // expected-warning {{FALSE}}
|
|
clang_analyzer_eval(ferror(F)); // expected-warning {{FALSE}}
|
|
fclose(F);
|
|
}
|
|
|
|
void stream_error_ferror() {
|
|
FILE *F = fopen("file", "r");
|
|
if (!F)
|
|
return;
|
|
StreamTesterChecker_make_ferror_stream(F);
|
|
clang_analyzer_eval(feof(F)); // expected-warning {{FALSE}}
|
|
clang_analyzer_eval(ferror(F)); // expected-warning {{TRUE}}
|
|
clearerr(F);
|
|
clang_analyzer_eval(feof(F)); // expected-warning {{FALSE}}
|
|
clang_analyzer_eval(ferror(F)); // expected-warning {{FALSE}}
|
|
fclose(F);
|
|
}
|
|
|
|
void error_fseek() {
|
|
FILE *F = fopen("file", "r");
|
|
if (!F)
|
|
return;
|
|
int rc = fseek(F, 0, SEEK_SET);
|
|
if (rc) {
|
|
int IsFEof = feof(F), IsFError = ferror(F);
|
|
// Get feof or ferror or no error.
|
|
clang_analyzer_eval(IsFEof || IsFError);
|
|
// expected-warning@-1 {{FALSE}}
|
|
// expected-warning@-2 {{TRUE}}
|
|
clang_analyzer_eval(IsFEof && IsFError); // expected-warning {{FALSE}}
|
|
// Error flags should not change.
|
|
if (IsFEof)
|
|
clang_analyzer_eval(feof(F)); // expected-warning {{TRUE}}
|
|
else
|
|
clang_analyzer_eval(feof(F)); // expected-warning {{FALSE}}
|
|
if (IsFError)
|
|
clang_analyzer_eval(ferror(F)); // expected-warning {{TRUE}}
|
|
else
|
|
clang_analyzer_eval(ferror(F)); // expected-warning {{FALSE}}
|
|
} else {
|
|
clang_analyzer_eval(feof(F)); // expected-warning {{FALSE}}
|
|
clang_analyzer_eval(ferror(F)); // expected-warning {{FALSE}}
|
|
// Error flags should not change.
|
|
clang_analyzer_eval(feof(F)); // expected-warning {{FALSE}}
|
|
clang_analyzer_eval(ferror(F)); // expected-warning {{FALSE}}
|
|
}
|
|
fclose(F);
|
|
}
|