Home | History | Annotate | Line # | Download | only in analyzer
      1 /* An overview of the state machine from sm-file.cc.
      2    Copyright (C) 2022-2024 Free Software Foundation, Inc.
      3    Contributed by David Malcolm <dmalcolm (at) redhat.com>.
      4 
      5 This file is part of GCC.
      6 
      7 GCC is free software; you can redistribute it and/or modify it
      8 under the terms of the GNU General Public License as published by
      9 the Free Software Foundation; either version 3, or (at your option)
     10 any later version.
     11 
     12 GCC is distributed in the hope that it will be useful, but
     13 WITHOUT ANY WARRANTY; without even the implied warranty of
     14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     15 General Public License for more details.
     16 
     17 You should have received a copy of the GNU General Public License
     18 along with GCC; see the file COPYING3.  If not see
     19 <http://www.gnu.org/licenses/>.  */
     20 
     21 /* Keep this in-sync with sm-file.cc  */
     22 
     23 digraph "file" {
     24 
     25   /* STATES. */
     26 
     27   /* Start state.  */
     28   start;
     29 
     30   /* State for a FILE * returned from fopen that hasn't been checked for
     31      NULL.
     32      It could be an open stream, or could be NULL.  */
     33   unchecked;
     34 
     35   /* State for a FILE * that's known to be NULL.  */
     36   null;
     37 
     38   /* State for a FILE * that's known to be a non-NULL open stream.  */
     39   nonnull;
     40 
     41   /* State for a FILE * that's had fclose called on it.  */
     42   closed;
     43 
     44   /* Stop state, for a FILE * we don't want to track any more.  */
     45   stop;
     46 
     47   /* TRANSITIONS. */
     48 
     49   /* On "fopen".  */
     50   start -> unchecked [label="on 'X = fopen(...);'"];
     51 
     52   /* On "fclose".  */
     53   start -> closed [label="on 'close(X);'"];
     54   /* TODO: is it safe to call fclose (NULL) ? */
     55   unchecked -> closed [label="on 'close(X);'"];
     56   null -> closed [label="on 'close(X);'"];
     57   nonnull -> closed [label="on 'close(X);'"];
     58   closed -> stop [label="on 'close(X);':\nWarn('double fclose')"];
     59 
     60   /* on_condition.  */
     61   unchecked -> nonnull [label="on 'X != 0'"];
     62   unchecked -> null [label="on 'X == 0'"];
     63 
     64   /* Leaks.  */
     65   unchecked -> stop [label="on leak:\nWarn('leak')"];
     66   nonnull -> stop [label="on leak:\nWarn('leak')"];
     67 }
     68