diff options
author | David Malcolm <dmalcolm@redhat.com> | 2021-07-21 19:19:31 -0400 |
---|---|---|
committer | David Malcolm <dmalcolm@redhat.com> | 2021-07-21 19:19:31 -0400 |
commit | 893b12cc12877aca1c9df6272123b26eddf12722 (patch) | |
tree | f3b93e8f957753d35dc1fa1f0fa827ad108c2bfc /gcc | |
parent | 87bd75cd49aac68e90bd9b6b5e14582d6e0ccafa (diff) | |
download | gcc-893b12cc12877aca1c9df6272123b26eddf12722.zip gcc-893b12cc12877aca1c9df6272123b26eddf12722.tar.gz gcc-893b12cc12877aca1c9df6272123b26eddf12722.tar.bz2 |
analyzer: bulletproof -Wanalyzer-file-leak [PR101547]
gcc/analyzer/ChangeLog:
PR analyzer/101547
* sm-file.cc (file_leak::emit): Handle m_arg being NULL.
(file_leak::describe_final_event): Handle ev.m_expr being NULL.
gcc/testsuite/ChangeLog:
PR analyzer/101547
* gcc.dg/analyzer/pr101547.c: New test.
Signed-off-by: David Malcolm <dmalcolm@redhat.com>
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/analyzer/sm-file.cc | 27 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/analyzer/pr101547.c | 11 |
2 files changed, 32 insertions, 6 deletions
diff --git a/gcc/analyzer/sm-file.cc b/gcc/analyzer/sm-file.cc index b40a9a1..6a17019 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 0000000..8791cff --- /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" } */ |