summaryrefslogtreecommitdiff
path: root/clang/test/Analysis/stream.c
diff options
context:
space:
mode:
Diffstat (limited to 'clang/test/Analysis/stream.c')
-rw-r--r--clang/test/Analysis/stream.c28
1 files changed, 25 insertions, 3 deletions
diff --git a/clang/test/Analysis/stream.c b/clang/test/Analysis/stream.c
index 758b40cca493..10e6e5381ee6 100644
--- a/clang/test/Analysis/stream.c
+++ b/clang/test/Analysis/stream.c
@@ -519,14 +519,36 @@ void reopen_std_stream(void) {
if (!fp) return;
stdout = fp; // Let's make them alias.
- clang_analyzer_eval(fp == oldStdout); // expected-warning {{UNKNOWN}}
- clang_analyzer_eval(fp == stdout); // expected-warning {{TRUE}} no-FALSE
- clang_analyzer_eval(oldStdout == stdout); // expected-warning {{UNKNOWN}}
+ clang_analyzer_eval(fp == oldStdout); // expected-warning {{FALSE}}
+ clang_analyzer_eval(fp == stdout); // expected-warning {{TRUE}}
+ clang_analyzer_eval(oldStdout == stdout); // expected-warning {{FALSE}}
}
void only_success_path_does_not_alias_with_stdout(void) {
if (stdout) return;
FILE *f = fopen("/tmp/foof", "r"); // no-crash
+ clang_analyzer_eval(f == 0);// expected-warning {{TRUE}} expected-warning {{FALSE}}
if (!f) return;
fclose(f);
}
+
+extern void do_something();
+
+void test_no_invalidate_at_system_call() {
+ FILE *old_stdin = stdin;
+ if ((stdin = fopen("x/y/z", "r")) == NULL)
+ return;
+ clang_analyzer_eval(old_stdin == stdin); // expected-warning{{FALSE}}
+ free(malloc(100));
+ clang_analyzer_eval(old_stdin == stdin); // expected-warning{{FALSE}}
+ fclose(stdin);
+}
+
+void test_invalidate_at_non_system_call() {
+ FILE *old_stdin = stdin;
+ if ((stdin = fopen("x/y/z", "r")) == NULL)
+ return;
+ clang_analyzer_eval(old_stdin == stdin); // expected-warning{{FALSE}}
+ do_something();
+ clang_analyzer_eval(old_stdin == stdin); // expected-warning{{UNKNOWN}}
+}