aboutsummaryrefslogtreecommitdiff
path: root/gcc/analyzer/engine.cc
diff options
context:
space:
mode:
authorDavid Malcolm <dmalcolm@redhat.com>2022-10-24 16:38:22 -0400
committerDavid Malcolm <dmalcolm@redhat.com>2022-10-24 16:38:22 -0400
commit792f039fc37faa3446725a643c8018f084e8ccab (patch)
treed6f5bfae9af0528c090314d46b2c14859640d221 /gcc/analyzer/engine.cc
parent244021b6c1a7bdeb777874ddc2ebcecb95610ef1 (diff)
downloadgcc-792f039fc37faa3446725a643c8018f084e8ccab.zip
gcc-792f039fc37faa3446725a643c8018f084e8ccab.tar.gz
gcc-792f039fc37faa3446725a643c8018f084e8ccab.tar.bz2
analyzer: handle "pipe" and "pipe2" [PR106300]
gcc/analyzer/ChangeLog: PR analyzer/106300 * engine.cc (impl_region_model_context::get_fd_map): New. * exploded-graph.h (impl_region_model_context::get_fd_map): New decl. * region-model-impl-calls.cc (region_model::impl_call_pipe): New. * region-model.cc (region_model::update_for_int_cst_return): New, based on... (region_model::update_for_zero_return): ...this. Reimplement in terms of the former. (region_model::on_call_pre): Handle "pipe" and "pipe2". (region_model::on_call_post): Likewise. * region-model.h (region_model::impl_call_pipe): New decl. (region_model::update_for_int_cst_return): New decl. (region_model::mark_as_valid_fd): New decl. (region_model_context::get_fd_map): New pure virtual fn. (noop_region_model_context::get_fd_map): New. (region_model_context_decorator::get_fd_map): New. * sm-fd.cc: Include "analyzer/program-state.h". (fd_state_machine::describe_state_change): Handle transitions from start state to valid states. (fd_state_machine::mark_as_valid_fd): New. (fd_state_machine::on_stmt): Add missing return for "creat". (region_model::mark_as_valid_fd): New. gcc/ChangeLog: PR analyzer/106300 * doc/invoke.texi (Static Analyzer Options): Add "pipe" and "pipe2" to the list of functions the analyzer has hardcoded knowledge of. gcc/testsuite/ChangeLog: PR analyzer/106300 * gcc.dg/analyzer/pipe-1.c: New test. * gcc.dg/analyzer/pipe-glibc.c: New test. * gcc.dg/analyzer/pipe-manpages.c: New test. * gcc.dg/analyzer/pipe2-1.c: New test. Signed-off-by: David Malcolm <dmalcolm@redhat.com>
Diffstat (limited to 'gcc/analyzer/engine.cc')
-rw-r--r--gcc/analyzer/engine.cc15
1 files changed, 15 insertions, 0 deletions
diff --git a/gcc/analyzer/engine.cc b/gcc/analyzer/engine.cc
index 46bcaed..a664a99 100644
--- a/gcc/analyzer/engine.cc
+++ b/gcc/analyzer/engine.cc
@@ -229,6 +229,21 @@ impl_region_model_context::get_malloc_map (sm_state_map **out_smap,
}
bool
+impl_region_model_context::get_fd_map (sm_state_map **out_smap,
+ const state_machine **out_sm,
+ unsigned *out_sm_idx)
+{
+ unsigned fd_sm_idx;
+ if (!m_ext_state.get_sm_idx_by_name ("file-descriptor", &fd_sm_idx))
+ return false;
+
+ *out_smap = m_new_state->m_checker_states[fd_sm_idx];
+ *out_sm = &m_ext_state.get_sm (fd_sm_idx);
+ *out_sm_idx = fd_sm_idx;
+ return true;
+}
+
+bool
impl_region_model_context::get_taint_map (sm_state_map **out_smap,
const state_machine **out_sm,
unsigned *out_sm_idx)