https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100540

            Bug ID: 100540
           Summary: -Wanalyzer-file-leak false positive due to
                    conditionals
           Product: gcc
           Version: 11.1.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: analyzer
          Assignee: dmalcolm at gcc dot gnu.org
          Reporter: andrew at ishiboo dot com
  Target Milestone: ---

Test program:

#include <stdio.h>
#include <string.h>

char foo(const char *filename) {
    FILE *fp;
    if (!filename || strcmp(filename, "-") == 0) {
        fp = stdin;
    } else {
        fp = fopen(filename, "r");
    }

    char c = fgetc(fp);

    if (fp != stdin) {
        fclose(fp);
    }

    return c;
}

int main(int argc, char **argv) {
    if (argc > 1) {
        char c = foo(argv[1]);
        printf("%c\n", c);
    }
    return 0;
}

False positive:

$ gcc-11 -fanalyzer -c /tmp/test.c  
/tmp/test.c: In function 'foo':
/tmp/test.c:18:12: warning: leak of FILE 'fp' [CWE-775] [-Wanalyzer-file-leak]
   18 |     return c;
      |            ^
  'foo': events 1-6
    |
    |    6 |     if (!filename || strcmp(filename, "-") == 0) {
    |      |        ^
    |      |        |
    |      |        (1) following 'false' branch...
    |......
    |    9 |         fp = fopen(filename, "r");
    |      |              ~~~~~~~~~~~~~~~~~~~~
    |      |              |
    |      |              (2) ...to here
    |      |              (3) opened here
    |......
    |   14 |     if (fp != stdin) {
    |      |        ~
    |      |        |
    |      |        (4) following 'false' branch...
    |......
    |   18 |     return c;
    |      |            ~
    |      |            |
    |      |            (5) ...to here
    |      |            (6) 'fp' leaks here; was opened at (3)
    |


Expected outcome:

The analyzer should understand that without anything modifying stdin, stdout,
stderr, the return of fopen() can not be stdin, stdout, or stderr, so
fclose(fp) must be hit.

Reply via email to