diff --git a/gcc/analyzer/sm-file.cc b/gcc/analyzer/sm-file.cc index b40a9a1edb93..6a17019448e4 100644 --- a/gcc/analyzer/sm-file.cc +++ b/gcc/analyzer/sm-file.cc @@ -193,9 +193,13 @@ public: /* CWE-775: "Missing Release of File Descriptor or Handle after Effective Lifetime". */ m.add_cwe (775); - return warning_meta (rich_loc, m, OPT_Wanalyzer_file_leak, - "leak of FILE %qE", - m_arg); + if (m_arg) + return warning_meta (rich_loc, m, OPT_Wanalyzer_file_leak, + "leak of FILE %qE", + m_arg); + else + return warning_meta (rich_loc, m, OPT_Wanalyzer_file_leak, + "leak of FILE"); } label_text describe_state_change (const evdesc::state_change &change) @@ -212,10 +216,21 @@ public: label_text describe_final_event (const evdesc::final_event &ev) FINAL OVERRIDE { if (m_fopen_event.known_p ()) - return ev.formatted_print ("%qE leaks here; was opened at %@", - ev.m_expr, &m_fopen_event); + { + if (ev.m_expr) + return ev.formatted_print ("%qE leaks here; was opened at %@", + ev.m_expr, &m_fopen_event); + else + return ev.formatted_print ("leaks here; was opened at %@", + &m_fopen_event); + } else - return ev.formatted_print ("%qE leaks here", ev.m_expr); + { + if (ev.m_expr) + return ev.formatted_print ("%qE leaks here", ev.m_expr); + else + return ev.formatted_print ("leaks here"); + } } private: diff --git a/gcc/testsuite/gcc.dg/analyzer/pr101547.c b/gcc/testsuite/gcc.dg/analyzer/pr101547.c new file mode 100644 index 000000000000..8791cffa2b63 --- /dev/null +++ b/gcc/testsuite/gcc.dg/analyzer/pr101547.c @@ -0,0 +1,11 @@ +char * +fopen (const char *restrict, const char *restrict); + +void +k2 (void) +{ + char *setfiles[1]; + int i; + + setfiles[i] = fopen ("", ""); /* { dg-warning "use of uninitialized value 'i'" } */ +} /* { dg-warning "leak of FILE" } */