diff options
author | David Malcolm <dmalcolm@redhat.com> | 2020-09-23 06:55:51 -0400 |
---|---|---|
committer | David Malcolm <dmalcolm@redhat.com> | 2020-09-23 21:16:01 -0400 |
commit | 84fb35466654ec179fa16e718a5014fbe9f41357 (patch) | |
tree | 8c1102256b9609bb2744c227c31d974ec63ced12 /gcc/doc/analyzer.texi | |
parent | 10a83805e047a583348e8bef18b966ecb8eee5d4 (diff) | |
download | gcc-84fb35466654ec179fa16e718a5014fbe9f41357.zip gcc-84fb35466654ec179fa16e718a5014fbe9f41357.tar.gz gcc-84fb35466654ec179fa16e718a5014fbe9f41357.tar.bz2 |
analyzer: add -fno-analyzer-feasibility
This patch provides a new option "-fno-analyzer-feasibility" as a way
to disable feasibility-checking of the constraints along the control
flow paths for -fanalyzer diagnostics. I'm adding this in the hope of
making it easier to debug issues involving the feasibility-checking
logic.
The patch adds a new rejected_constraint object which is captured if
exploded_path::feasible_p fails, and adds logic that uses this to emit
an additional custom_event within the checker_path for the diagnostic,
showing where in the control flow path the diagnostic would have been
rejected, and giving details of why.
gcc/analyzer/ChangeLog:
* analyzer.h (struct rejected_constraint): New decl.
* analyzer.opt (fanalyzer-feasibility): New option.
* diagnostic-manager.cc (path_builder::path_builder): Add
"problem" param and use it to initialize new field.
(path_builder::get_feasibility_problem): New accessor.
(path_builder::m_feasibility_problem): New field.
(dedupe_winners::add): Remove inversion of logic in "if" clause,
swapping if/else suites. In the !feasible_p suite, inspect
flag_analyzer_feasibility and add code to handle when this
is off, accepting the infeasible path, but recording the
feasibility_problem.
(diagnostic_manager::emit_saved_diagnostic): Pass the
feasibility_problem to the path_builder.
(diagnostic_manager::add_events_for_eedge): If we have
a feasibility_problem at this edge, use it to add a custom event.
* engine.cc (exploded_path::feasible_p): Pass a
rejected_constraint ** to model.maybe_update_for_edge and transfer
ownership of any created instance to any feasibility_problem.
(feasibility_problem::dump_to_pp): New.
* exploded-graph.h (feasibility_problem::feasibility_problem):
Drop "model" param; add rejected_constraint * param.
(feasibility_problem::~feasibility_problem): New.
(feasibility_problem::dump_to_pp): New decl.
(feasibility_problem::m_model): Drop field.
(feasibility_problem::m_rc): New field.
* program-point.cc (function_point::get_location): Handle
PK_BEFORE_SUPERNODE and PK_AFTER_SUPERNODE.
* program-state.cc (program_state::on_edge): Pass NULL to new
param of region_model::maybe_update_for_edge.
* region-model.cc (region_model::add_constraint): New overload
adding a rejected_constraint ** param.
(region_model::maybe_update_for_edge): Add rejected_constraint **
param and pass it to the various apply_constraints_for_ calls.
(region_model::apply_constraints_for_gcond): Add
rejected_constraint ** param and pass it to add_constraint calls.
(region_model::apply_constraints_for_gswitch): Likewise.
(region_model::apply_constraints_for_exception): Likewise.
(rejected_constraint::dump_to_pp): New.
* region-model.h (region_model::maybe_update_for_edge):
Add rejected_constraint ** param.
(region_model::add_constraint): New overload adding a
rejected_constraint ** param.
(region_model::apply_constraints_for_gcond): Add
rejected_constraint ** param.
(region_model::apply_constraints_for_gswitch): Likewise.
(region_model::apply_constraints_for_exception): Likewise.
(struct rejected_constraint): New.
gcc/ChangeLog:
* doc/analyzer.texi (Analyzer Paths): Add note about
-fno-analyzer-feasibility.
* doc/invoke.texi (Static Analyzer Options): Add
-fno-analyzer-feasibility.
gcc/testsuite/ChangeLog:
* gcc.dg/analyzer/feasibility-2.c: New test.
Diffstat (limited to 'gcc/doc/analyzer.texi')
-rw-r--r-- | gcc/doc/analyzer.texi | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/gcc/doc/analyzer.texi b/gcc/doc/analyzer.texi index 6b7d70c..96fe9bb 100644 --- a/gcc/doc/analyzer.texi +++ b/gcc/doc/analyzer.texi @@ -329,7 +329,8 @@ we only emit the simplest path (which could be intraprocedural, if it can be reproduced without a caller). We apply a check that each duplicate warning's shortest path is feasible, rejecting any warnings for which the shortest path is infeasible (which could lead to -false negatives). +false negatives). This check can be suppressed (for debugging purposes) +using @option{-fno-analyzer-feasibility}. We use the shortest feasible @code{exploded_path} through the @code{exploded_graph} (a list of @code{exploded_edge *}) to build a |