On Wed, 2022-07-06 at 19:55 +0530, Immad Mir wrote: > From: Immad Mir <mirimma...@gmail.com> > > This patch saves the "close" event in use_after_close diagnostic > and shows it where possible.
This patch is OK to push to trunk (assuming you've done the usual testing). Thanks Dave > > 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 <mirim...@outlook.com> > --- > gcc/analyzer/sm-fd.cc | 15 ++++++++++++--- > gcc/testsuite/gcc.dg/analyzer/fd-4.c | 4 ++-- > 2 files changed, 14 insertions(+), 5 deletions(-) > > diff --git a/gcc/analyzer/sm-fd.cc b/gcc/analyzer/sm-fd.cc > index 4058ac53308..8196d33223a 100644 > --- a/gcc/analyzer/sm-fd.cc > +++ b/gcc/analyzer/sm-fd.cc > @@ -454,7 +454,10 @@ public: > return label_text::borrow ("opened here"); > > if (change.m_new_state == m_sm.m_closed) > - return change.formatted_print ("closed here"); > + { > + m_first_close_event = change.m_event_id; > + return change.formatted_print ("closed here"); > + } > > return fd_diagnostic::describe_state_change (change); > } > @@ -462,11 +465,17 @@ public: > label_text > describe_final_event (const evdesc::final_event &ev) final > override > { > - return ev.formatted_print ("%qE on closed file descriptor %qE > here", > - m_callee_fndecl, m_arg); > + if (m_first_close_event.known_p ()) > + return ev.formatted_print ( > + "%qE on closed file descriptor %qE; %qs was at %@", > m_callee_fndecl, > + m_arg, "close", &m_first_close_event); > + else > + return ev.formatted_print ("%qE on closed file descriptor > %qE", > + m_callee_fndecl, m_arg); > } > > private: > + diagnostic_event_id_t m_first_close_event; > const tree m_callee_fndecl; > }; > > diff --git a/gcc/testsuite/gcc.dg/analyzer/fd-4.c > b/gcc/testsuite/gcc.dg/analyzer/fd-4.c > index a973704f403..c992db619e7 100644 > --- a/gcc/testsuite/gcc.dg/analyzer/fd-4.c > +++ b/gcc/testsuite/gcc.dg/analyzer/fd-4.c > @@ -45,7 +45,7 @@ test_3 (const char *path, void *buf) > { > close(fd); /* {dg-message "\\(2\\) closed here"} */ > read(fd, buf, 1); /* { dg-warning "'read' on closed file > descriptor 'fd'" } */ > - /* {dg-message "\\(3\\) 'read' on closed file descriptor > 'fd' here" "" {target *-*-*} .-1 } */ > + /* {dg-message "\\(3\\) 'read' on closed file descriptor > 'fd'; 'close' was at \\(2\\)" "" {target *-*-*} .-1 } */ > } > } > > @@ -57,6 +57,6 @@ test_4 (const char *path, void *buf) > { > close(fd); /* {dg-message "\\(2\\) closed here"} */ > write(fd, buf, 1); /* { dg-warning "'write' on closed file > descriptor 'fd'" } */ > - /* {dg-message "\\(3\\) 'write' on closed file descriptor > 'fd' here" "" {target *-*-*} .-1 } */ > + /* {dg-message "\\(3\\) 'write' on closed file descriptor > 'fd'; 'close' was at \\(2\\)" "" {target *-*-*} .-1 } */ > } > }