analyzer: show close event for use_after_close diagnostic
authorImmad Mir <mirimmad@outlook.com>
Wed, 6 Jul 2022 16:05:53 +0000 (21:35 +0530)
committerImmad Mir <mirimmad@outlook.com>
Wed, 6 Jul 2022 16:06:07 +0000 (21:36 +0530)
This patch saves the "close" event in use_after_close diagnostic
and shows it where possible.

gcc/analyzer/ChangeLog:
* sm-fd.cc (use_after_close): save the "close" event and
show it where possible.

gcc/testsuite/ChangeLog:
* gcc.dg/analyzer/fd-4.c (test_3): change the message note to conform to the
changes in analyzer/sm-fd.cc
(test_4): Likewise.

Signed-off-by: Immad Mir <mirimmad@outlook.com>
gcc/analyzer/sm-fd.cc
gcc/testsuite/gcc.dg/analyzer/fd-4.c

index 4058ac5..8196d33 100644 (file)
@@ -454,7 +454,10 @@ public:
       return label_text::borrow ("opened here");\r
 \r
     if (change.m_new_state == m_sm.m_closed)\r
-      return change.formatted_print ("closed here");\r
+      {\r
+        m_first_close_event = change.m_event_id;\r
+        return change.formatted_print ("closed here");\r
+      }\r
 \r
     return fd_diagnostic::describe_state_change (change);\r
   }\r
@@ -462,11 +465,17 @@ public:
   label_text\r
   describe_final_event (const evdesc::final_event &ev) final override\r
   {\r
-    return ev.formatted_print ("%qE on closed file descriptor %qE here",\r
-                               m_callee_fndecl, m_arg);\r
+    if (m_first_close_event.known_p ())\r
+      return ev.formatted_print (\r
+          "%qE on closed file descriptor %qE; %qs was at %@", m_callee_fndecl,\r
+          m_arg, "close", &m_first_close_event);\r
+    else\r
+      return ev.formatted_print ("%qE on closed file descriptor %qE",\r
+                                 m_callee_fndecl, m_arg);\r
   }\r
 \r
 private:\r
+  diagnostic_event_id_t m_first_close_event;\r
   const tree m_callee_fndecl;\r
 };\r
 \r
index a973704..c992db6 100644 (file)
@@ -45,7 +45,7 @@ test_3 (const char *path, void *buf)
     {\r
         close(fd); /* {dg-message "\\(2\\) closed here"} */\r
         read(fd, buf, 1); /* { dg-warning "'read' on closed file descriptor 'fd'" }  */\r
-        /* {dg-message "\\(3\\) 'read' on closed file descriptor 'fd' here" "" {target *-*-*} .-1 } */\r
+        /* {dg-message "\\(3\\) 'read' on closed file descriptor 'fd'; 'close' was at \\(2\\)" "" {target *-*-*} .-1 } */\r
     }\r
 }\r
 \r
@@ -57,6 +57,6 @@ test_4 (const char *path, void *buf)
     {\r
         close(fd); /* {dg-message "\\(2\\) closed here"} */\r
         write(fd, buf, 1); /* { dg-warning "'write' on closed file descriptor 'fd'" }  */\r
-        /* {dg-message "\\(3\\) 'write' on closed file descriptor 'fd' here" "" {target *-*-*} .-1 } */\r
+        /* {dg-message "\\(3\\) 'write' on closed file descriptor 'fd'; 'close' was at \\(2\\)" "" {target *-*-*} .-1 } */\r
     }\r
 }\r