balazske added a comment. > I'd like to test cases where the very same function call gets a different > note message depending on the BugType:
These tests are doing this: void check_indeterminate_notes_fseek_no_feof_no_ferror() { FILE *F; char Buf[10]; F = fopen("foo1.c", "r"); if (!F) // expected-note {{Taking false branch}} expected-note {{'F' is non-null}} return; fseek(F, 1, SEEK_SET); // expected-note {{Assuming this stream operation fails and leaves the file position indeterminate}} if (!ferror(F) && !feof(F)) // expected-note {{The error flag is not set on the stream}} expected-note {{The end-of-file flag is not set on the stream}} // expected-note@-1 {{Taking true branch}} expected-note@-1 {{Left side of '&&' is true}} fread(Buf, 1, 1, F); // expected-warning{{File position of the stream might be 'indeterminate' after a failed operation. Can cause undefined behavior}} // expected-note@-1{{File position of the stream might be 'indeterminate' after a failed operation. Can cause undefined behavior}} fclose(F); } void check_feof_notes_fseek() { FILE *F; char Buf[10]; F = fopen("foo1.c", "r"); if (!F) // expected-note {{Taking false branch}} expected-note {{'F' is non-null}} return; fseek(F, 1, SEEK_SET); // expected-note {{Assuming stream reaches end-of-file here}} if (feof(F)) // expected-note{{The end-of-file flag is set on the stream}} expected-note {{Taking true branch}} fread(Buf, 1, 1, F); // expected-warning {{Read function called when stream is in EOF state. Function has no effect}} // expected-note@-1 {{Read function called when stream is in EOF state. Function has no effect}} fclose(F); } Why is the last test not sufficient and I should use instead this test? void check_notes_fseek_caused_feof() { FILE *F; char Buf[10]; F = fopen("foo1.c", "r"); if (!F) // expected-note {{Taking false branch}} expected-note {{'F' is non-null}} return; fseek(F, 1, SEEK_SET); // expected-note {{Assuming stream reaches end-of-file here}} if (ferror(F)) { // expected-note {{The error flag is not set on the stream}} // expected-note@-1 {{Taking false branch}} fclose(F); return; } StreamTesterChecker_clear_indeterminate_file_position(F); fread(Buf, 1, 1, F); // expected-warning{{Read function called when stream is in EOF state. Function has no effect}} // expected-note@-1{{Read function called when stream is in EOF state. Function has no effect}} fclose(F); } In the first case before the `fread` the EOF bit is on. In the second there are 2 possibilities, one is when `fseek` did not fail at all, other when it failed and then EOF is on. This are really 3 execution paths: `fseek` did not fail, `fseek` failed with EOF, and `fseek` failed without FEOF or FERROR but leaves indeterminate position (that is cleared, so we get the same state as after success). Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D106262/new/ https://reviews.llvm.org/D106262 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits