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