balazske marked 4 inline comments as done.
balazske added a comment.

The difference of fread and fwrite comes from the fact that `fwrite` can always 
succeed, `fread` does not succeed in EOF state.
The plan is to add the file functions sequentially. From the currently 
implemented functions only `fread` needs the warning in EOF state. When any 
later function is added that fails in EOF state, the warning should be added 
for that function at that time.



================
Comment at: clang/lib/StaticAnalyzer/Checkers/StreamChecker.cpp:56
+  bool operator!=(const StreamErrorState &ES) const {
+    return NoError != ES.NoError || FEof != ES.FEof || FError != ES.FError;
+  }
----------------
Szelethus wrote:
> How about `return !(*this == ES)`?
Probably better (does not look better but is more bug-safe).


================
Comment at: clang/lib/StaticAnalyzer/Checkers/StreamChecker.cpp:456-463
+  SymbolRef Sym = StreamVal.getAsSymbol();
+  if (Sym && State->get<StreamMap>(Sym)) {
+    const StreamState *SS = State->get<StreamMap>(Sym);
+    if (SS->ErrorState & ErrorFEof)
+      reportFEofWarning(C, State);
+  } else {
+    C.addTransition(State);
----------------
Szelethus wrote:
> Do we not want this for `fwrite` as well?
It should be no problem to write into a file at the end of the file, the file 
is extended.


================
Comment at: clang/lib/StaticAnalyzer/Checkers/StreamChecker.cpp:495
+    return;
+  Optional<NonLoc> CountVal = Call.getArgSVal(2).getAs<NonLoc>();
+  if (!CountVal)
----------------
Szelethus wrote:
> `// The standard refers to this parameter as "nmemb", but almost everywhere 
> else its called "count".`
I looked up the functions in [[ https://en.cppreference.com/w/c/io/fread | 
cppreference.com ]], there it is called `count`. But probably it is better to 
use the standard name here?


================
Comment at: clang/lib/StaticAnalyzer/Checkers/StreamChecker.cpp:523
+  // FEOF).
+  if (!IsFread || (SS->ErrorState != ErrorFEof)) {
+    ProgramStateRef StateNotFailed =
----------------
Szelethus wrote:
> Aaaah okay it took me a while. I think `SS->ErrorState != ErrorFEof` isn't as 
> talkative as `isConstrained.*`, could you add just a line like "if we 
> **know** the state to be EOF..."?
> 
> On another note, why is fwrite so special in this context?
If it is an `fwrite`, the function call can always succeed (even after a 
previously EOF or error).
If it is an `fread`, it can succeed but not after an exactly-EOF state.

A success transition is not needed in an `fread` with exactly EOF condition. 
(If we have fread with non-exactly EOF, for example `ErrorFEof` and 
`ErrorFError`, the success is needed because the read in `ErrorFError` can 
succeed.)


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D80015/new/

https://reviews.llvm.org/D80015



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to