diff options
author | David Malcolm <dmalcolm@redhat.com> | 2020-09-29 15:55:33 -0400 |
---|---|---|
committer | David Malcolm <dmalcolm@redhat.com> | 2020-09-29 18:31:48 -0400 |
commit | d60d63a00bb50ba6896939705c589578177b404d (patch) | |
tree | 2390b33d72cd9991a58cf27f41884a809a2a3141 /gcc/analyzer | |
parent | 6649df18f98d5baf89b56a09b816b5eeb5f67bcb (diff) | |
download | gcc-d60d63a00bb50ba6896939705c589578177b404d.zip gcc-d60d63a00bb50ba6896939705c589578177b404d.tar.gz gcc-d60d63a00bb50ba6896939705c589578177b404d.tar.bz2 |
analyzer: fix signal-handler registration location [PR95188]
PR analyzer/95188 reports that diagnostics from
-Wanalyzer-unsafe-call-within-signal-handler use the wrong
source location when reporting the signal-handler registration
event in the diagnostic_path. The diagnostics erroneously use the
location of the first stmt in the basic block containing the call
to "signal", rather than that of the call itself.
Fixed thusly.
gcc/analyzer/ChangeLog:
PR analyzer/95188
* engine.cc (stmt_requires_new_enode_p): Split enodes before
"signal" calls.
gcc/testsuite/ChangeLog:
PR analyzer/95188
* gcc.dg/analyzer/signal-registration-loc.c: New test.
Diffstat (limited to 'gcc/analyzer')
-rw-r--r-- | gcc/analyzer/engine.cc | 22 |
1 files changed, 16 insertions, 6 deletions
diff --git a/gcc/analyzer/engine.cc b/gcc/analyzer/engine.cc index c15d119..0e79254 100644 --- a/gcc/analyzer/engine.cc +++ b/gcc/analyzer/engine.cc @@ -2677,13 +2677,23 @@ static bool stmt_requires_new_enode_p (const gimple *stmt, const gimple *prev_stmt) { - /* Stop consolidating at calls to - "__analyzer_dump_exploded_nodes", so they always appear at the - start of an exploded_node. */ if (const gcall *call = dyn_cast <const gcall *> (stmt)) - if (is_special_named_call_p (call, "__analyzer_dump_exploded_nodes", - 1)) - return true; + { + /* Stop consolidating at calls to + "__analyzer_dump_exploded_nodes", so they always appear at the + start of an exploded_node. */ + if (is_special_named_call_p (call, "__analyzer_dump_exploded_nodes", + 1)) + return true; + + /* sm-signal.cc injects an additional custom eedge at "signal" calls + from the registration enode to the handler enode, separate from the + regular next state, which defeats the "detect state change" logic + in process_node. Work around this via special-casing, to ensure + we split the enode immediately before any "signal" call. */ + if (is_special_named_call_p (call, "signal", 2)) + return true; + } /* If we had a PREV_STMT with an unknown location, and this stmt has a known location, then if a state change happens here, it |