Szelethus accepted this revision.
Szelethus added a comment.
This revision is now accepted and ready to land.

This patch is great. LGTM!

In D80015#2043263 <https://reviews.llvm.org/D80015#2043263>, @balazske wrote:

> If the unit of the change is adding `fread` and `fwrite` completely, the 
> warning with FEOF at `fread` is correct to add because it belongs to `fread`. 
> I was planning to add some file handling functions to the checker that have a 
> basic functionality implemented. In this case, it is the fread-fwrite 
> functions, but the "indeterminate file position" is still missing here (that 
> is a bigger change), so it is the "basic functionality" that is added. The 
> FEOF warning is probably too small to add it in a separate patch, also it is 
> added only to one place now.


Very well, I'm sold. I didn't check that we don't really model another function 
that needs it. Woops :^)

> There is intentionally no warning about ferror state, first reason is that 
> often ferror and "indeterminate file position" comes together and then the 
> warning will be produced for "indeterminate position" in the next change. 
> Next reason is that ferror in itself is not always cause for warning and we 
> can currently not decide about it. There was the example about write into a 
> file that is open in read mode that results in a ferror state, then the next 
> read should work (with ferror state at start). Another reason, the program 
> should still always handle if a file operation fails. If an operation starts 
> in ferror state, it will probably fail again but that error should be handled 
> by the application.
> 
> Intent of these warnings is not to check that the error case was handled by 
> the user code, that is a more difficult thing. We could make a new warning 
> that warns if between two possible failing operations no `ferror` or `feof` 
> was called, this would check if the user handled the error. But not accurate 
> because the error can be handled based on the return value of the failed 
> function, without calling `ferror` or `feof` (except some special cases like 
> the `fgetc`). The only safe warning is to add if a function is called in 
> really unuseful way, for example fread in already FEOF state that do never 
> succeed, and the "indeterminate file position" case.

The question is what is a good practice on ferror -- a check on `errno` and 
then a `clearerr`? In any case, you are right, this another discussion for 
another time.

> My goal with these changes was to have a check for the CERT FIO34-C case, not 
> for the complete `StreamChecker` that could contain many other features. So 
> probably not even all file handling functions will be added for now.

Sure, shoot me down if you feel I'm trying to dictate the direction of your 
project! :)



================
Comment at: clang/lib/StaticAnalyzer/Checkers/StreamChecker.cpp:523
+  // FEOF).
+  if (!IsFread || (SS->ErrorState != ErrorFEof)) {
+    ProgramStateRef StateNotFailed =
----------------
balazske wrote:
> 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.)
> 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..."?

Could you please add these few words before commiting?


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