================ @@ -339,3 +363,138 @@ void fflush_on_open_failed_stream(void) { } fclose(F); } + +void test_fscanf_eof() { + FILE *F1 = tmpfile(); + if (!F1) + return; + + int a; + unsigned b; + int ret = fscanf(F1, "%d %u", &a, &b); + char c = fgetc(F1); // expected-warning {{Read function called when stream is in EOF state. Function has no effect}} + // expected-warning@-1 {{File position of the stream might be 'indeterminate' after a failed operation. Can cause undefined behavior}} + fclose(F1); +} + +void test_fscanf_escape() { + FILE *F1 = tmpfile(); + if (!F1) + return; + + int a = 48; + unsigned b = 127; + char buffer[] = "FSCANF"; // 70 83 67 65 78 70 + + clang_analyzer_dump_int(a); // expected-warning {{48 S32b}} + clang_analyzer_dump_int(b); // expected-warning {{127 S32b}} + clang_analyzer_dump_char(buffer[2]); // expected-warning {{67 S8b}} + + int ret = fscanf(F1, "%d %u %s", &a, &b, buffer); + if (ret != EOF) { + clang_analyzer_dump_int(a); // expected-warning {{conj_$}} + clang_analyzer_dump_int(b); // expected-warning {{conj_$}} + clang_analyzer_dump_char(buffer[2]); // expected-warning {{derived_$}} + } else { + clang_analyzer_dump_int(a); // expected-warning {{48 S32b}} + clang_analyzer_dump_int(b); // expected-warning {{127 S32b}} + clang_analyzer_dump_char(buffer[2]); // expected-warning {{67 S8b}} + } + + if (ret != EOF) { + char c = fgetc(F1); // ok + } + + fclose(F1); +} + +void test_fputc() { + FILE *F1 = tmpfile(); + if (!F1) + return; + + char a = 'y'; // 'y' = 121 ASCII + char r = fputc(a, F1); + if (r != EOF) { + clang_analyzer_dump_char(r); // expected-warning {{121 S8b}} + char z = fgetc(F1); + } else { + clang_analyzer_dump_char(r); // expected-warning {{-1 S8b}} + } + + fclose(F1); +} + +void test_fputs() { + FILE *F1 = tmpfile(); + if (!F1) + return; + + char buffer[] = "HELLO"; + int r = fputs(buffer, F1); + if (r >= 0) { + // fputs does not invalidate the input buffer (72 is ascii for 'H') + clang_analyzer_dump_char(buffer[0]); // expected-warning {{72 S8b}} + } else if (r == EOF) { + // fputs does not invalidate the input buffer, *and* this branch + // can happen + clang_analyzer_dump_char(buffer[0]); // expected-warning {{72 S8b}} + } else { + // This branch can not happen ---------------- balazske wrote:
`clang_analyzer_warnIfReached` can be used here, but really this case is tested in another test in **stream_error.c** too. https://github.com/llvm/llvm-project/pull/82476 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits