diff options
author | David Malcolm <dmalcolm@redhat.com> | 2023-11-18 20:35:59 -0500 |
---|---|---|
committer | David Malcolm <dmalcolm@redhat.com> | 2023-11-18 20:35:59 -0500 |
commit | f65f63c4d86a48be042a3ad242fffe5fe8347ff0 (patch) | |
tree | 0d4b48f61374b8870c09518526be8e85c477e73a /gcc/analyzer/region-model-manager.h | |
parent | 9d58d2d8ba290d2d72ef9700c6f3b37ce99c93c3 (diff) | |
download | gcc-f65f63c4d86a48be042a3ad242fffe5fe8347ff0.zip gcc-f65f63c4d86a48be042a3ad242fffe5fe8347ff0.tar.gz gcc-f65f63c4d86a48be042a3ad242fffe5fe8347ff0.tar.bz2 |
analyzer: new warning: -Wanalyzer-undefined-behavior-strtok [PR107573]
This patch:
- adds support to the analyzer for tracking API-private state
or which we don't have a decl (such as strtok's internal state),
- uses it to implement a new -Wanalyzer-undefined-behavior-strtok which
warns when strtok (NULL, delim) is called as the first call to
strtok after main.
gcc/analyzer/ChangeLog:
PR analyzer/107573
* analyzer.h (register_known_functions): Add region_model_manager
param.
* analyzer.opt (Wanalyzer-undefined-behavior-strtok): New.
* call-summary.cc
(call_summary_replay::convert_region_from_summary_1): Handle
RK_PRIVATE.
* engine.cc (impl_run_checkers): Pass model manager to
register_known_functions.
* kf.cc (class undefined_function_behavior): New.
(class kf_strtok): New.
(register_known_functions): Add region_model_manager param.
Use it to register "strtok".
* region-model-manager.cc
(region_model_manager::get_or_create_conjured_svalue): Add "idx"
param.
* region-model-manager.h
(region_model_manager::get_or_create_conjured_svalue): Add "idx"
param.
(region_model_manager::get_root_region): New accessor.
* region-model.cc (region_model::scan_for_null_terminator): Handle
"expr" being null.
(region_model::get_representative_path_var_1): Handle RK_PRIVATE.
* region-model.h (region_model::called_from_main_p): Make public.
* region.cc (region::get_memory_space): Handle RK_PRIVATE.
(region::can_have_initial_svalue_p): Handle MEMSPACE_PRIVATE.
(private_region::dump_to_pp): New.
* region.h (MEMSPACE_PRIVATE): New.
(RK_PRIVATE): New.
(class private_region): New.
(is_a_helper <const private_region *>::test): New.
* store.cc (store::replay_call_summary_cluster): Handle
RK_PRIVATE.
* svalue.h (struct conjured_svalue::key_t): Add "idx" param to
ctor and "m_idx" field.
(class conjured_svalue::conjured_svalue): Likewise.
gcc/ChangeLog:
PR analyzer/107573
* doc/invoke.texi: Add -Wanalyzer-undefined-behavior-strtok.
gcc/testsuite/ChangeLog:
PR analyzer/107573
* c-c++-common/analyzer/strtok-1.c: New test.
* c-c++-common/analyzer/strtok-2.c: New test.
* c-c++-common/analyzer/strtok-3.c: New test.
* c-c++-common/analyzer/strtok-4.c: New test.
* c-c++-common/analyzer/strtok-cppreference.c: New test.
Signed-off-by: David Malcolm <dmalcolm@redhat.com>
Diffstat (limited to 'gcc/analyzer/region-model-manager.h')
-rw-r--r-- | gcc/analyzer/region-model-manager.h | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/gcc/analyzer/region-model-manager.h b/gcc/analyzer/region-model-manager.h index a528181..2ddd7de 100644 --- a/gcc/analyzer/region-model-manager.h +++ b/gcc/analyzer/region-model-manager.h @@ -79,7 +79,8 @@ public: const binding_map &map); const svalue *get_or_create_conjured_svalue (tree type, const gimple *stmt, const region *id_reg, - const conjured_purge &p); + const conjured_purge &p, + unsigned idx = 0); const svalue * get_or_create_asm_output_svalue (tree type, const gasm *asm_stmt, @@ -105,6 +106,7 @@ public: const svalue *create_unique_svalue (tree type); /* region consolidation. */ + const root_region *get_root_region () const { return &m_root_region; } const stack_region * get_stack_region () const { return &m_stack_region; } const heap_region *get_heap_region () const { return &m_heap_region; } const code_region *get_code_region () const { return &m_code_region; } |