aboutsummaryrefslogtreecommitdiff
path: root/gcc/analyzer
diff options
context:
space:
mode:
authorDavid Malcolm <dmalcolm@redhat.com>2020-09-29 15:55:33 -0400
committerDavid Malcolm <dmalcolm@redhat.com>2020-09-29 18:31:48 -0400
commitd60d63a00bb50ba6896939705c589578177b404d (patch)
tree2390b33d72cd9991a58cf27f41884a809a2a3141 /gcc/analyzer
parent6649df18f98d5baf89b56a09b816b5eeb5f67bcb (diff)
downloadgcc-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.cc22
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