[PATCH] D75682: [Analyzer][StreamChecker] Introduction of stream error handling.
Balázs Kéri via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Fri Mar 13 09:39:48 PDT 2020
balazske marked an inline comment as done.
balazske added inline comments.
================
Comment at: clang/lib/StaticAnalyzer/Checkers/StreamChecker.cpp:393-394
+
+ // Make the return value accordingly to the error.
+ State = State->assume(RetVal, (SS->*IsOfError)());
+ assert(State && "Return value should not be constrained already.");
----------------
Szelethus wrote:
> Is this correct? We set the `feof()` return value whether we know the state of the stream to be EOF, but in this case we would incorrectly mark it as non-EOF:
> ```lang=bash
> $ cat a.txt # contains a single newline
>
> $ cat test.cpp
> ```
> ```lang=cpp
> #include <cstdio>
>
> void tryRead(FILE *F) {
> char C = fgetc(F);
>
> if (feof(F))
> printf("The stream is EOF!\n");
> else
> printf("The stream is good! Read '%c'\n", C);
> }
>
> int main() {
> FILE *F = fopen("a.txt", "r");
> tryRead(F);
> tryRead(F); // Incorrectly mark F to be non-EOF
> }
> ```
> ```lang=bash
> $ clang test.cpp -fsanitize=address && ./a.out
> The stream is good! Read '
> '
> The stream is EOF!
> ```
>
> Wouldn't it be safer to assume it to be `true` if we **know** its EOF and do nothing otherwise? How about a state split?
>
> (I know this functions also handler FError, but you see what my point is.)
The problem in this code seems to be that `fgetc` is not handled (yet) by the checker. The plan is to handle every possible file operation. The handler of `fgetc` would split the state to EOF and non-EOF case. In the current state this is a real "bug", it could be handled somehow by checking for escaped stream (the `fgetc` here should cause escape of the file pointer if not recognized as file operation). But this means again a new patch before this one. Or add every file operation to this patch with some simple implementation or with "forgetting" the stream?
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D75682/new/
https://reviews.llvm.org/D75682
More information about the cfe-commits
mailing list