-
Notifications
You must be signed in to change notification settings - Fork 14.3k
[clang][analyzer] Improve documentation of StreamChecker (NFC). #83858
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -3020,44 +3020,82 @@ Check for misuses of stream APIs. Check for misuses of stream APIs: ``fopen, fcl | |
|
||
alpha.unix.Stream (C) | ||
""""""""""""""""""""" | ||
Check stream handling functions: ``fopen, tmpfile, fclose, fread, fwrite, fseek, ftell, rewind, fgetpos,`` | ||
``fsetpos, clearerr, feof, ferror, fileno``. | ||
Check C stream handling functions: | ||
``fopen, fdopen, freopen, tmpfile, fclose, fread, fwrite, fgetc, fgets, fputc, fputs, fprintf, fscanf, ungetc, getdelim, getline, fseek, fseeko, ftell, ftello, fflush, rewind, fgetpos, fsetpos, clearerr, feof, ferror, fileno``. | ||
|
||
The checker maintains information about the C stream objects (``FILE *``) and | ||
can detect error conditions related to use of streams. The following conditions | ||
are detected: | ||
|
||
* The ``FILE *`` pointer passed to the function is NULL (the single exception is | ||
``fflush`` where NULL is allowed). | ||
* Use of stream after close. | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. after '' fclose '' ? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This is not meant to be a function name, just "close of a stream" (I do not know why it is displayed in blue color). |
||
* Opened stream is not closed. | ||
* Read from a stream after end-of-file. (This is not a fatal error but reported | ||
by the checker. Stream remains in EOF state and the read operation fails.) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I can see There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I have the feeling that these words (NULL, EOF) are relatively commonly used (NULL is an abbrevation for null pointer, EOF = end-of-file). Probably |
||
* Use of stream when the file position is indeterminate after a previous failed | ||
operation. Some functions (like ``ferror``, ``clearerr``, ``fseek``) are | ||
allowed in this state. | ||
* Invalid 3rd ("``whence``") argument to ``fseek``. | ||
|
||
The checker does not track the correspondence between integer file descriptors | ||
and ``FILE *`` pointers. Operations on standard streams like ``stdin`` are not | ||
treated specially and are therefore often not recognized (because these streams | ||
are usually not opened explicitly by the program, and are global variables). | ||
|
||
.. code-block:: c | ||
|
||
void test() { | ||
void test1() { | ||
FILE *p = fopen("foo", "r"); | ||
} // warn: opened file is never closed | ||
|
||
void test() { | ||
void test2() { | ||
FILE *p = fopen("foo", "r"); | ||
fseek(p, 1, SEEK_SET); // warn: stream pointer might be NULL | ||
fclose(p); | ||
} | ||
|
||
void test() { | ||
void test3() { | ||
FILE *p = fopen("foo", "r"); | ||
if (p) { | ||
fseek(p, 1, 3); // warn: third arg should be SEEK_SET, SEEK_END, or SEEK_CUR | ||
fclose(p); | ||
} | ||
} | ||
|
||
if (p) | ||
fseek(p, 1, 3); | ||
// warn: third arg should be SEEK_SET, SEEK_END, or SEEK_CUR | ||
void test4() { | ||
FILE *p = fopen("foo", "r"); | ||
if (!p) | ||
return; | ||
|
||
fclose(p); | ||
fclose(p); // warn: stream already closed | ||
} | ||
|
||
void test() { | ||
void test5() { | ||
FILE *p = fopen("foo", "r"); | ||
if (!p) | ||
return; | ||
|
||
fgetc(p); | ||
if (!ferror(p)) | ||
fgetc(p); // warn: possible read after end-of-file | ||
|
||
fclose(p); | ||
fclose(p); // warn: already closed | ||
} | ||
|
||
void test() { | ||
FILE *p = tmpfile(); | ||
ftell(p); // warn: stream pointer might be NULL | ||
void test6() { | ||
FILE *p = fopen("foo", "r"); | ||
if (!p) | ||
return; | ||
|
||
fgetc(p); | ||
if (!feof(p)) | ||
fgetc(p); // warn: file position may be indeterminate after I/O error | ||
|
||
fclose(p); | ||
} | ||
|
||
|
||
.. _alpha-unix-cstring-BufferOverlap: | ||
|
||
alpha.unix.cstring.BufferOverlap (C) | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
... related to use of these streams.
English is not my first language, maybe my suggestion is not good.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I do not know but "can detect error conditions related to use of streams" is good in itself so I would leave it.