https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93355

--- Comment #4 from David Malcolm <dmalcolm at gcc dot gnu.org> ---
Current status is that there is testcase coverage for this in git, but the test
requires:
    /* { dg-additional-options "-Wno-analyzer-too-complex
-fno-analyzer-feasibility" } */

(a) It happens to successfully explore enough of the graph to find the leak,
but hits complexity limits at 1 program point:

pr93355-localealias.c:263:41: warning: terminating analysis for this program
point: callstring: [(SN: 66 -> SN: 85 in _nl_expand_alias)] before (SN: 21
stmt: 0):  _7 = *cp_107;EN: 163, EN: 170, EN: 177, EN: 370, EN: 557, EN: 794,
EN: 801, EN: 808 [-Wanalyzer-too-complex]
  263 |       while (isspace ((unsigned char) cp[0]))
      |                                       ~~^~~

(b) Without -fno-analyzer-feasibility, it falsely rejects the path as
infeasible at the "locale_alias_path[0] != '\0'" within _nl_expand_alias:

    |  185 |       added = 0;
    |      |       ~~~~~~~~~
    |      |             |
    |      |             (3) ...to here
    |  186 |       while (added == 0 && locale_alias_path[0] != '\0')
    |      |              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    |      |                         |                   |
    |      |                         |                   (5) ...to here
    |      |                         (4) following ‘true’ branch (when ‘added
== 0’)...
    |      |                         (6) following ‘true’ branch...
    |
  ‘_nl_expand_alias’: event 7
    |
    |cc1:
    | (7): ...to here
    |
  ‘_nl_expand_alias’: events 8-9
    |
    |  198 |           if (start < locale_alias_path)
    |      |               ~~~~~~^~~~~~~~~~~~~~~~~~~
    |      |                     |
    |      |                     (8) this path would have been rejected as
infeasible at this edge: edge from EN: 88 to EN: 90; rejected constraint:
INIT_VAL((*INIT_VAL(locale_alias_path))) == (const char)0;

    where region: {start_39, value: INIT_VAL(locale_alias_path)}
    which looks like an instance of PR 96374.


(c) Also, the path it reports for the leak is rather verbose: it reports
various events in _nl_expand_alias leading to the call into read_alias_file,
but it really ought to just report the events in read_alias_file. 
diagnostic_manager ought to prune leading interprocedural events (I think I had
code for this in one of my working copies)

Reply via email to