From: benjamin priour
Plenty useful, thanks David. I've adjusted some few things, especially
the artifacts of earlier versions I missed when building the commit.
I didn't how to test for warnings within , I couldn't figure a portable
test.
I cannot pinpoint the line the warning is issued at in an inline DejaGNU
directive,
nor can I safely say the stack depth if I check a multiline-output (nor the
methods names)
In the end, I found out an alternative, I am checking for the presence of event
"entry of 'main'".
Indeed, diagnostic_manager::finish_pruning comment's reads
If all we're left with is in one function, then filter function entry events.
The provided test case can only goes into main and std::* frames, so if "entry
of 'main'" exists,
it means we are also going into std::* frames.
I've also adjusted the comment of prune_system_headers, analyzer.opt and added
an entry to invoker.texi.
Successfully regstrapped off trunk
54be338589ea93ad4ff53d22adde476a0582537b on x86_64-linux-gnu.
Thanks,
Benjamin.
Patch below.
This patch introduces -fanalyzer-show-events-in-system-headers,
disabled by default.
This option reduces the noise of the analyzer emitted diagnostics
when dealing with system headers.
The new option only affects the display of the diagnostics,
but doesn't hinder the actual analysis.
Given a diagnostics path diving into a system header in the form
[
prefix events...,
system header call,
system header entry,
events within system headers...,
system header return,
suffix events...
]
then disabling the option (either by default or explicitly)
will shorten the path into:
[
prefix events...,
system header call,
system header return,
suffix events...
]
Signed-off-by: benjamin priour
gcc/analyzer/ChangeLog:
PR analyzer/110543
* analyzer.opt: Add new option.
* diagnostic-manager.cc
(diagnostic_manager::prune_path): Call prune_system_headers.
(prune_frame): New function that deletes all events in a frame.
(diagnostic_manager::prune_system_headers): New function.
* diagnostic-manager.h: Add prune_system_headers declaration.
gcc/ChangeLog:
PR analyzer/110543
* doc/invoke.texi: Add documentation of
fanalyzer-show-events-in-system-headers
gcc/testsuite/ChangeLog:
PR analyzer/110543
* g++.dg/analyzer/fanalyzer-show-events-in-system-headers-default.C:
New test.
* g++.dg/analyzer/fanalyzer-show-events-in-system-headers-no.C:
New test.
* g++.dg/analyzer/fanalyzer-show-events-in-system-headers.C:
New test.
---
gcc/analyzer/analyzer.opt | 4 +
gcc/analyzer/diagnostic-manager.cc| 96 +++
gcc/analyzer/diagnostic-manager.h | 1 +
gcc/doc/invoke.texi | 9 ++
...er-show-events-in-system-headers-default.C | 18
...nalyzer-show-events-in-system-headers-no.C | 19
.../fanalyzer-show-events-in-system-headers.C | 14 +++
7 files changed, 161 insertions(+)
create mode 100644
gcc/testsuite/g++.dg/analyzer/fanalyzer-show-events-in-system-headers-default.C
create mode 100644
gcc/testsuite/g++.dg/analyzer/fanalyzer-show-events-in-system-headers-no.C
create mode 100644
gcc/testsuite/g++.dg/analyzer/fanalyzer-show-events-in-system-headers.C
diff --git a/gcc/analyzer/analyzer.opt b/gcc/analyzer/analyzer.opt
index 2760aaa8151..7917473d122 100644
--- a/gcc/analyzer/analyzer.opt
+++ b/gcc/analyzer/analyzer.opt
@@ -290,6 +290,10 @@ fanalyzer-transitivity
Common Var(flag_analyzer_transitivity) Init(0)
Enable transitivity of constraints during analysis.
+fanalyzer-show-events-in-system-headers
+Common Var(flag_analyzer_show_events_in_system_headers) Init(0)
+Show events within system headers in analyzer execution paths.
+
fanalyzer-call-summaries
Common Var(flag_analyzer_call_summaries) Init(0)
Approximate the effect of function calls to simplify analysis.
diff --git a/gcc/analyzer/diagnostic-manager.cc
b/gcc/analyzer/diagnostic-manager.cc
index cfca305d552..430c4dc3d58 100644
--- a/gcc/analyzer/diagnostic-manager.cc
+++ b/gcc/analyzer/diagnostic-manager.cc
@@ -23,6 +23,7 @@ along with GCC; see the file COPYING3. If not see
#include "system.h"
#include "coretypes.h"
#include "tree.h"
+#include "input.h"
#include "pretty-print.h"
#include "gcc-rich-location.h"
#include "gimple-pretty-print.h"
@@ -2281,6 +2282,8 @@ diagnostic_manager::prune_path (checker_path *path,
path->maybe_log (get_logger (), "path");
prune_for_sm_diagnostic (path, sm, sval, state);
prune_interproc_events (path);
+ if (! flag_analyzer_show_events_in_system_headers)
+prune_system_headers (path);
consolidate_conditions (path);
finish_pruning (path);
path->maybe_log (get_logger (), "pruned");
@@ -2667,6 +2670,99 @@ diagnostic_manager::prune_interproc_events (checker_path
*path) const
while (changed);
}
+/* Remove everything within [call