gnu/gcc/7647c00b77ee1aefcd3dbd7aed9c1a7553d83f94
analyzer: rewrite of symbolic value handling
The "ana::store" implementation tracks the simulated state of memory in
the user's program by splitting it up into binding clusters, where pointer
arithmetic is well-defined within each cluster, but undefined between
them. For example, each local variable gets its own binding cluster.
In GCC 11 - 16, the store attempted to model the contents of each cluster
using class binding_map, which attempted to store a mapping from
"binding keys" to symbolic values. These binding keys could refer to
concrete ranges of bytes, or symbolic ranges. This worked for simple
examples, but while investigating improvements to C++ support in
-fanalyzer, I ran into many problems with:
- sloppy use of type nodes (optional types, mismatches, etc)
- sloppy use of numeric types
- mixing typed expressions with "values" of chunks of memory
- poor support of low-level memory manipulation
- unclear semantics for all of the above, making fixing bugs impossible
This patch reimplements the way -fanalyzer tracks simulated memory to
fix these issues.
The new implementation adds a new level to the analyzer which tracks the
contents of simulated memory on a per-bit basis. All reads and writes of
symbolic regions (e.g. accessing a field of a struct) are converted to
accesses of a symbolic::memory_range: a reference to a base region
(cluster), together with a symbolic bit start offset and a symbolic bit
size. Rather than storing svalues, we now store symbolic::bit_vectors
to those ranges. Any knowledge of types happens at a higher level.
The patch adds various new families of symbolic::node subclasses:
- a symbolic::scalar<T> hierarchy, allowing for unit-safe symbolic
scalars, such as "8 bits" or "(64 bytes) + (32 bytes * n)". This
is used to build these classes:
- symbolic::memory_offset: a reference to a specific bit within a
cluster
- symbolic::memory_pointer: a reference to a specific byte within a
cluster
- symbolic::memory_range: a reference to a range of bits within a
cluster
- a symbolic::bit_vector hierarchy for representing a vector of symbolic
bit values, such as:
- "the bit-level representation of (int)42 on the target”
- "1024 bytes of zeros"
- "bits [16...19) of the initial value of buf"
Instances of bit_vector can be symbolically sized e.g. "the first n
bytes of str plus m copies of '_' plus a zero byte concatenated on the
end".
- a symbolic::bit_contents hierarchy for representing the contents of
a cluster as a total function from bit offset to symbolic bit (including
negative offsets; bounds checking happens at a higher level) e.g.
"uninitialized everywhere apart from bytes [0, 4) which are zeroed".
All of these symbolic::node subclasses are immutable/pure-functional
and instances are consolidated by manager classes (similar to
hash-consing), and can be dumped to show their hierarchical makeup as
ASCII art. For example, after "i += 1", __analyzer_dump might show this:
program_state
╰─ Region Model
├─ Current Frame: frame: ‘test_increment_i’@1
╰─ Store
├─ m_called_unknown_fn: false
╰─ frame: ‘test_increment_i’@1
╰─ i_2:
╰─ (547): concrete bit overlay
├─ concrete ranges
│ ╰─ [bytes 0..4): (546): bit_vector_from_svalue[size: 4 bytes]
│ ╰─ m_sval: (545): ‘int’: binop_svalue(plus_expr: ‘+’)
│ ├─ value_range: {[irange] int [-2147483647, +INF]}
│ ├─ (540): ‘int’: initial_svalue
│ │ ├─ value_range: {[irange] int VARYING}
│ │ ╰─ m_reg: (536): ‘int’: decl_region(‘i_1(D)’)
│ │ ╰─ parent: (527): frame_region(‘test_increment_i’, index: 0, depth: 1)
│ │ ╰─ parent: (1): stack region
│ │ ╰─ parent: (0): root region
│ ╰─ (544): ‘int’: constant_svalue (‘1’)
╰─ baseline: (7): uninitialized contents
to show that the cluster for "i" is uninitialized everywhere apart from
at bytes [0..4), where it has the target's encoding of (i + 1).
In a terminal that supports it, color is used in the above to distinguish
between the various kinds of node (svalue, region, scalar, bit_vector,
bit_contents).
There is also now an __analyzer_hexdump function, though this mostly
exists to ensure that we have well-defined meanings for all of the various
classes, rather for use in analysis. For example:
../../src/hexdump.c: In function ‘test_bitwise_and’:
../../src/hexdump.c:38:27: warning: hexdump
38 | int j = i & 0xff00ff00; __analyzer_hexdump (&j, sizeof (int));
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+-----------------------------------+-----------+-----+
| Binary | Hex |ASCII|
+------------+-----------------------------------+-----------+-----+
|[bytes 0..4)|00000000 ???????? 00000000 ????????|00 ?? 00 ??|.?.? |
+------------+-----------------------------------+-----------+-----+
(685): bit_vector_from_svalue[size: 4 bytes]
╰─ m_sval: (684): ‘int’: binop_svalue(bit_and_expr: ‘&’)
├─ value_range: {[irange] int [-INF, -16711936][0, 0][256, 2130771712] MASK 0xff00ff00 VALUE 0x0}
├─ (680): ‘int’: initial_svalue
│ ├─ value_range: {[irange] int VARYING}
│ ╰─ m_reg: (679): ‘int’: decl_region(‘i_2(D)’)
│ ╰─ parent: (525): frame_region(‘test_bitwise_and’, index: 0, depth: 1)
│ ╰─ parent: (1): stack region
│ ╰─ parent: (0): root region
╰─ (683): ‘int’: constant_svalue (‘-16711936’)
As well as being queryable for what bit_vector is present at a particular
range of bits/bytes (possibly symbolic), these classes support a
string_scan operation: scanning for the first NUL/terminator byte, for
supporting analysis of C-style string handling (such as detecting
unterminated buffers).
The patch introduces these classes, deletes various existing classes
that had poorly-defined semantics (region_svalue, sub_svalue,
repeated_svalue, bits_within_svalue, compound_svalue, and
conjured_svalue) in favor of svalue_from_bit_vector, and using either
symbolic::bit_vector or symbolic::bit_contents as appropriate. It also
simplifies dumping within the analyzer, making more consistent use of
text_art::tree_widget throughout.
As well as putting the analyzer on a much firmer basis, the patch fixes
numerous cases that didn't work before, adds test coverage for these, and
it fixes various existing xfails in the test suite. However the
(re)implementation of call summaries is somewhat stubbed, so the patch
adds some xfails for these (call summaries are off by default, though, so
this shouldn't affect too many users).
I haven't done proper performance testing yet, but, encouragingly, the
wallclock time for analysis seen in the integration test suite sped up by
about 12% - but this was measuring debug vs debug builds, not release vs
release.
gcc/ChangeLog:
* Makefile.in (ANALYZER_OBJS): Add analyzer/initializers.o,
analyzer/string-scan.o, analyzer/symbolic-bit-contents.o,
analyzer/symbolic-bit-vectors.o,
analyzer/symbolic-memory-ranges.o, analyzer/symbolic-pointers.o,
analyzer/symbolic-ranges.o, and analyzer/symbolic-scalars.o.
Remove analyzer/ranges.o.
* custom-sarif-properties/state-graphs.cc (node::num_bits):
Convert from json::string_property to json::json_property.
* custom-sarif-properties/state-graphs.h (node::num_bits):
Likewise.
* diagnostics/color.cc (gcc_color_defaults): Add entries for
debugging the analyzer.
* doc/analyzer.texi: Update for new store implementation.
(__analyzer_hexdump): New.
* selftest-run-tests.cc: Add #define INCLUDE_VECTOR.
gcc/analyzer/ChangeLog:
* access-diagram.cc: Add include of "diagnostics/markup.h".
Delete access_range, porting throughout to symbolic_bit_range,
using folded_symbolic_bit_range to get back some of the old
folding behavior that the diagram code relied on. Port
region_offset to const symbolic_bit_offset &.
(pp_bit_size_t): Delete.
(get_access_size_str): Port to new types.
(bit_size_expr::maybe_get_formatted_str): Likewise.
(bit_size_expr::maybe_print_for_user): Delete.
(bit_size_expr::maybe_get_as_bytes): Delete.
(fold_svalue_for_access_diagram): New.
(case_fold_scalar_for_access_diagram): New.
(fold_scalar_for_access_diagram): New.
(fold_range_for_access_diagram): New.
(folded_symbolic_bit_range): New.
(access_range_contains_p): New.
(boundaries::comparator): New.
(boundaries::using offset_set): New using decl.
(boundaries::boundaries): Add node_mgr param.
(boundaries::add): Port to new types.
(boundaries::add_all_bytes_in_range): Likewise.
(boundaries::log): Likewise.
(boundaries::get_kind): Likewise.
(boundaries::begin): Likewise.
(boundaries::end): Likewise.
(boundaries::size): Likewise.
(boundaries::get_hard_boundaries_in_range): Likewise.
(boundaries::m_node_mgr): New field.
(boundaries::m_all_offsets): Convert from std::set<region_offset>
to offset_set.
(boundaries::m_hard_offsets): Likewise.
(bit_to_table_map::bit_to_table_map): Add node_mgr param and
initialize m_node_mgr.
(bit_to_table_map::populate): Drop "mgr" param. Convert from
region_offset to symbolic_bit_offset.
(bit_to_table_map::get_table_rect): Convert to new types.
(bit_to_table_map::maybe_get_access_range_for_table_x): Likewise,
renaming to...
(bit_to_table_map::maybe_get_symbolic_bit_range_for_table_x):
...this.
(bit_to_table_map::log): Convert to new types.
(bit_to_table_map::get_table_x_for_offset): Likewise.
(bit_to_table_map::get_table_x_for_prev_offset): Likewise.
(bit_to_table_map::m_node_mgr): New field.
(bit_to_table_map::m_table_x_for_offset): Convert key from
region_offset to const symbolic_bit_offset *.
(bit_to_table_map::m_range_for_table_x): Convert value from
access_range to symbolic_bit_range.
(bit_to_table_map::m_table_x_for_prev_offset): New field.
(class svalue_spatial_item): Convert from access_range to
symbolic_bit_range throughout.
(class valid_region_spatial_item): Port to new types.
(class string_literal_spatial_item): Likewise.
(make_written_svalue_spatial_item): Likewise.
(make_existing_svalue_spatial_item): Likewise.
(class access_diagram_impl): Pass around node_manager. Port to
new types.
(selftest::assert_eq_typeless_integer): Delete.
(ASSERT_EQ_TYPELESS_INTEGER): Delete.
(selftest::test_bit_size_expr_to_bytes): Delete.
(selftest::analyzer_access_diagram_cc_tests): Remove call to test.
* access-diagram.h (class bit_size_expr): Port from svalue to
symbolic_bit_size.
(struct access_operation): Port to new types.
* ana-state-to-diagnostic-state.cc: Port to new state
implementation.
* ana-state-to-diagnostic-state.h: Update from bit_range to
concrete_bit_range.
(analyzer_state_graph::m_node_mgr): New field.
* analyzer-logging.cc: Define INCLUDE_VECTOR. Add include of
"text-art/theme.h".
(logger::logger): Initializem_text_art_theme.
* analyzer-logging.h (logger::get_text_art_theme): New.
(logger::m_text_art_theme): New.
* analyzer-selftests.cc: Add include of "stor-layout.h".
(make_string_constant): New.
(make_test_compound_type): Move here from region-model.cc.
(coord_test::coord_test): Likewise.
(run_analyzer_selftests): Drop call to analyzer_ranges_cc_tests.
Add calls to analyzer_region_model_manager_cc_tests,
analyzer_string_scan_cc_tests,
analyzer_symbolic_bit_contents_cc_tests,
analyzer_symbolic_bit_vectors_cc_tests,
analyzer_symbolic_memory_ranges_cc_tests,
analyzer_symbolic_nodes_cc_tests,
analyzer_symbolic_pointers_cc_tests,
analyzer_symbolic_ranges_cc_tests, and
analyzer_symbolic_scalars_cc_tests.
* analyzer-selftests.h (make_string_constant): New decl.
(make_test_compound_type): New decl.
(struct coord_test): New decl, moved from region-model.cc.
(analyzer_ranges_cc_tests): Delete decl.
(analyzer_region_model_manager_cc_tests): New decl.
(analyzer_string_scan_cc_tests): New decl.
(analyzer_symbolic_bit_contents_cc_tests): New decl.
(analyzer_symbolic_bit_vectors_cc_tests): New decl.
(analyzer_symbolic_memory_ranges_cc_tests): New decl.
(analyzer_symbolic_nodes_cc_tests): New decl.
(analyzer_symbolic_pointers_cc_tests): New decl.
(analyzer_symbolic_ranges_cc_tests): New decl.
(analyzer_symbolic_scalars_cc_tests): New decl.
* bounds-checking.cc (class out_of_bounds): Port from region to
symbolic::memory_range throughout.
(class concrete_out_of_bounds): Likewise, porting to new types.
(class concrete_past_the_end): Likewise.
(class concrete_buffer_overflow): Likewise.
(class concrete_buffer_over_read): Likewise.
(class concrete_buffer_underwrite): Likewise.
(class concrete_buffer_under_read): Likewise.
(class symbolic_past_the_end): Likewise.
(class symbolic_buffer_over_read): Likewise.
(strip_types): Delete.
(region_model::check_symbolic_bounds): Port to new types.
(maybe_get_integer_cst_tree): Delete.
(region_model::check_memory_range_bounds): New, based on
region_model::check_region_bounds, porting to new types.
(region_model::check_region_bounds): Reimplement in terms of
check_memory_range_bounds.
* call-details.cc: Drop include of deleted "analyzer/ranges.h".
(call_details::get_arg_as_sym_ptr): New.
(call_details::get_arg_as_num_bytes): New.
(call_details::get_arg_string_literal): Port from region_svalue
to symbolic::pointer.
(call_details::dump_to_pp): Drop.
(call_details::dump): Reimplement in terms of dump widget.
(call_details::make_dump_widget): Update type of param from "dwi"
to "nds".
(call_details::check_for_null_terminated_string_arg): Port
from svalue to symbolic::bit_vector.
(call_details::complain_about_overlap): Port to new
symbolic_byte_range implementation.
* call-details.h: Include "symbolic-pointers.h".
(call_details::get_arg_as_sym_ptr): New decl.
(call_details::get_arg_as_num_bytes): New decl.
(call_details::dump_to_pp): Drop.
(call_details::make_dump_widget): Update type of param from "dwi"
to "nds".
(call_details::check_for_null_terminated_string_arg): Port
from svalue to symbolic::bit_vector.
* call-string.cc: Include "analyzer/symbolic-nodes.h".
(call_string::element_t::make_dump_widget): New.
* call-string.h: Include "text-art/widget.h" and
"text-art/tree-widget.h".
(call_string::element_t::make_dump_widget): New decl.
(call_string::make_dump_widget): New decl.
* call-summary.cc (call_summary::get_user_facing_desc): Replace
SK_REGION case with SK_POINTER.
(call_summary::dump_to_pp): Delete.
(call_summary::dump_to_logger): New.
(call_summary::make_dump_widget): New.
(call_summary::dump): Reimplement in terms of dump widget.
(call_summary_replay::convert_svalue_from_summary_1): Port to
new types.
(call_summary_replay::convert_bit_contents_from_summary): New.
(call_summary_replay::convert_key_from_summary): Delete.
(call_summary_replay::convert_bit_vector_from_summary): New.
(call_summary_replay::impl_bits_from_bytes): New.
(call_summary_replay::convert_scalar_from_summary): New.
(call_summary_replay::dump_to_pp): Delete.
(call_summary_replay::make_dump_widget): New.
(call_summary_replay::dump): Reimplement in terms of dump widget.
(call_summary_replay::dump_to_logger): New.
* call-summary.h (call_summary::dump_to_pp): Delete.
(call_summary::make_dump_widget): New.
(call_summary::dump): Reimplement in terms of dump widget.
(call_summary::dump_to_logger): New.
(call_summary::get_store_manager): Drop.
(call_summary_replay::get_ext_state): New accessor.
(call_summary_replay::convert_key_from_summary): Delete.
(call_summary_replay::convert_bit_contents_from_summary): New.
(call_summary_replay::convert_bit_vector_from_summary): New.
(call_summary_replay::convert_scalar_from_summary): New.
(call_summary_replay::dump_to_pp): Delete.
(call_summary_replay::make_dump_widget): New.
(call_summary_replay::dump): Reimplement in terms of dump widget.
(call_summary_replay::dump_to_logger): New.
(call_summary_replay::get_store_manager): Drop.
(call_summary_replay::impl_bits_from_bytes): New.
* checker-event.cc
(checker_event::maybe_make_diagnostic_state_graph): Update to
new way of dumping program_state instances.
* common.h (diagnostics::markup::node): New forward decl.
(diagnostics::markup::lowering_options): New forward decl.
(class integer_with_unit<U>): New forward decl.
(struct units::bit): New forward decl.
(struct units::byte): New forward decl.
(class symbolic::range<CVT>): New forward decl.
(class symbolic::node_dump_state): New forward decl.
(class symbolic::node_set<NC>): New forward decl.
(class symbolic::node_visitor): New forward decl.
(class symbolic::liveness_context): New forward decl.
(struct symbolic::markup_context): New forward decl.
(class symbolic::bit_contents): New forward decl.
(class symbolic::unfoldable_bit_contents): New forward decl.
(class symbolic::baseline_bit_contents): New forward decl.
(class symbolic::conjured_bit_contents): New forward decl.
(class symbolic::offset_bit_contents): New forward decl.
(class symbolic::uniform_bit_contents): New forward decl.
(class symbolic::bit_overlay): New forward decl.
(class symbolic::concrete_bit_overlay): New forward decl.
(class symbolic::symbolic_bit_overlay): New forward decl.
(class symbolic::scalar<CVT>): New forward decl.
(class symbolic::value_node): New forward decl.
(class symbolic::bit_vector): New forward decl.
(class symbolic::concat_bit_vector): New forward decl.
(class symbolic::conjured_bit_vector): New forward decl.
(class symbolic::constant_bit_vector): New forward decl.
(class symbolic::cropped_bit_vector): New forward decl.
(class symbolic::repeated_bit_vector): New forward decl.
(class symbolic::bit_vector_from_svalue): New forward decl.
(class symbolic::bit_vector_from_ubc): New forward decl.
(class symbolic::uniform_bit_vector): New forward decl.
(class symbolic::empty_bit_vector): New forward decl.
(class symbolic::poisoned_bit_vector): New forward decl.
(class symbolic::tristate_bit_vector): New forward decl.
(class symbolic::bit_contents_manager): New forward decl.
(class symbolic::bit_vector_manager): New forward decl.
(class symbolic::scalar_managers): New forward decl.
(class symbolic::scalar_manager<CVT>): New forward decl.
(symbolic_bit_range): New "using" decl.
(symbolic_byte_range): New "using" decl.
(class region_svalue): Replace forward decl with...
(class pointer_svalue): ...this.
(class sub_svalue): Drop forward decl of eliminated class.
(class repeated_svalue): Likewise.
(class bits_within_svalue): Likewise.
(class compound_svalue): Likewise.
(class conjured_svalue): Likewise.
(class svalue_from_bit_vector): New forward decl.
(svalue_set): Drop typedef.
(class store_manager): Drop forward decl of eliminated class.
(class setjmp_record): New forward decl.
(get_field_at_bit_offset): Drop decl.
(class region_offset): Delete.
(eval_region_offset_comparison): Drop decl.
(cmp_csts_and_types): New decl.
(strip_types): Delete decl of region_offset overload.
(enum class poison_kind): Move here from svalue.h. Add "other".
(poison_kind_to_str): Move here from svalue.h.
(enum class baseline_state): New.
(baseline_state_to_str): New decl.
(enum class iter_result): New.
(append_pathvar_with_type): New decl.
* constraint-manager.cc: Add include of
"analyzer/liveness-context.h".
(class sval_finder): Update for changes to svalue subclasses.
(class dead_svalue_purger): Update to use
symbolic::liveness_context.
(constraint_manager::on_liveness_change): Likewise.
(class svalue_purger): Rename to...
(class node_purger): ...this and generalize from svalue to
symbolic::node.
(constraint_manager::purge_state_involving): Generalize from
svalue to symbolic::node.
(selftest::test_purging): Update for
region_model::purge_state_involving taking a reference rather than
a pointer.
* constraint-manager.h (constraint_manager::on_liveness_change):
Update decl to use symbolic::liveness_context.
(constraint_manager::purge_state_involving): Generalize from
svalue to symbolic::node.
* diagnostic-manager.cc (saved_diagnostic::dump_as_dot_node):
Update for dump changes.
(dump_to_logger): Update for changes to make_dump_widget.
(make_raw_dst_region_model): Set cfun and input_location.
(diagnostic_manager::prune_for_sm_diagnostic): Canonicalize the
input svalue and update throughout to make it clear whether we're
dealing with uncanonicalized or canonicalized svalue.
* engine.cc (impl_region_model_context::on_svalue_leak):
Canonicalize sval.
(impl_region_model_context::on_liveness_change): Update for
signature change.
(impl_region_model_context::on_unknown_change): Likewise.
(impl_region_model_context::purge_state_involving): Likewise.
(impl_region_model_context::on_state_leak): Use value_set rather
than svalue_set.
(exploded_node::dump_dot): Use monospace font. Use
dump_node_tree_to_pp for dumping state.
(exploded_node::dump): Reimplement in terms of dump widget.
(exploded_node::dump_to_pp): Reimplement in terms of dump widget.
(exploded_node::dump_to_logger): New.
(exploded_node::make_dump_widget): New.
(exploded_graph::get_or_create_node): Use dump_to_logger.
(exploded_graph::process_node): Likewise.
(exploded_graph::process_node): Likewise.
(feasibility_problem::make_dump_widget): New.
(feasibility_problem::dump): New.
(feasibility_problem::dump_to_pp): Reimplement in terms of
dump widget.
(feasibility_problem::dump_to_logger): New.
(feasibility_state::maybe_update_for_edge): Use dump_to_logger.
(feasibility_state::make_dump_widget): New.
(feasibility_state::dump_to_pp): Reimplment in terms of dump
widget.
(enode_label::get_text): Drop state from label.
(exploded_graph::dump_exploded_nodes): Use
symbolic::dump_node_tree_to_file<program_state>. Update for
simplified signature of program_state::dump.
* exploded-graph.h (impl_region_model_context::on_liveness_change):
Update signature.
(impl_region_model_context::on_unknown_change): Likewise.
(impl_region_model_context::purge_state_involving): Likewise.
(exploded_node::make_dump_widget): New decl.
(exploded_node::dump): Drop ext_state param. Drop FILE *
overload.
(exploded_node::dump_to_pp): Drop ext_state param.
(exploded_node::dump_to_logger): New.
(feasibility_problem::make_dump_widget): New.
(feasibility_problem::dump): New.
(feasibility_problem::dump_to_logger): New.
(feasibility_state::dump_to_pp): Drop "simple" and "multiline"
params.
(feasibility_state::make_dump_widget): New.
* exploded-path.cc (exploded_path::feasible_p): Use
dump_to_logger.
(exploded_path::dump_to_pp): Update for change to
program_state::dump_to_pp.
* feasible-graph.cc (feasible_node::dump_dot): Update for change
to region_model::dump_to_pp.
(feasible_graph::dump_feasible_path): Likewise for change to
feasible_state::dump_to_pp.
* infinite-recursion.cc (class infinite_recursion_diagnostic):
Rename "uses_conjured_svalue_p" to "uses_conjured_value_p"
throughout. Reimplement to work on conjured bit_vectors.
(contains_unknown_p): Generalize from svalue to symbolic::node.
(sufficiently_different_region_binding_p): Port to new
implementation, working on bit_contents.
* initializers.cc: New file.
* kf-analyzer.cc: Drop param to region_model::dump.
(class kf_analyzer_hexdump): New.
(register_known_analyzer_functions): Register it as
"__analyzer_hexdump".
* kf-lang-cp.cc (kf_dynamic_cast::impl_call_post): Port to new
implementation.
(kf_operator_delete::impl_call_post): Likewise.
* kf.cc: (kf_atomic_exchange::impl_call_pre): Likewise.
(kf_atomic_load::impl_call_pre): Likewise.
(kf_atomic_store::impl_call_pre): Likewise.
(kf_free::impl_call_post): Likewise.
(kf_memcpy_memmove::impl_call_pre): Likewise.
(kf_memset::impl_call_pre): Likewise.
(kf_mktemp_family::check_placeholder): Likewise.
(kf_putenv::impl_call_pre): Likewise.
(kf_realloc::impl_call_post): Likewise.
(kf_strdup::impl_call_pre): Likewise.
(kf_strcpy::impl_call_pre): Likewise.
(kf_strcat::impl_call_pre): Likewise.
(kf_strncpy::impl_call_post): Likewise.
* liveness-context.h: New file.
* ops.cc (operation_context::dump): Update for dump changes.
(call_and_return_op::replay_call_summary): Likewise.
(dump_op::execute): Likewise.
(phis_for_edge_op::update_state): Update for change to
purge_state_involving signature.
* poisoned-value-diagnostic.cc (poison_finder::visit_svalue): New.
(poison_finder::visit_bit_vector): New.
(poisoned_value_diagnostic::check_valid_fpath_p): Use
poison_finder rather than dyn_cast_poisoned_svalue.
* program-point.cc (program_point::dump): Reimplement in terms
of...
(program_point::make_dump_widget): New.
* program-point.h (program_point::make_dump_widget): New decl.
* program-state.cc: Include "analyzer/liveness-context.h".
(extrinsic_state::make_dump_widget): New.
(extrinsic_state::dump_to_pp): Delete.
(extrinsic_state::dump_to_file): Delete.
(extrinsic_state::dump): Delete.
(sm_state_map::make_dump_widget): Update for signature change.
Rework how states are dumped. Add dumping of m_map_ubc_to_state.
(sm_state_map::is_empty_p): Add check on m_map_ubc_to_state.
(sm_state_map::operator==): Add comparison of m_map_ubc_to_state.
(sm_state_map::get_any_inherited_state_of_bit_vector): New.
(sm_state_map::get_state): Drop handling of sub_svalue.
Add handling of svalue_from_bit_vector.
(sm_state_map::impl_set_state): Reimplement handling of inherited
state in terms of m_map_ubc_to_state.
(sm_state_map::clear_all_per_svalue_state): Clear
m_map_ubc_to_state.
(sm_state_map::on_liveness_change): Port to
symbolic::liveness_context.
(sm_state_map::on_unknown_change): Generalize from svalue to
symbolic::value_node, adding support for bit_vector.
(sm_state_map::purge_state_involving): Likewise.
(sm_state_map::canonicalize_svalue): Handle nullptr. Strip types
from symbolic pointers and from svalue_from_bit_vector.
(sm_state_map::validate): New.
(sm_state_map::replay_call_summary): Canonicalize svalues.
(program_state::print): Delete.
(program_state::dump_to_pp): Delete.
(program_state::dump_to_file): Delete.
(program_state::dump): Reimplement in terms of dump widget.
(program_state::dump_to_logger): New.
(program_state::make_dump_widget): Update for signature change.
Support passing in a label.
(program_state::can_purge_base_region_p): Reimplement.
(program_state::validate): Validate the sm_state_maps in
m_checker_states.
(log_set_of_svalues): Port from svalue_set to value_set. Use
dump_to_logger.
(liveness_context::liveness_context): New.
(liveness_context::node_live_p): New.
(liveness_context::bits_live_p): New.
(liveness_context::known_live_ptr_to_base_region_p): New.
(liveness_context::set_known_liveness_for_node): New.
(liveness_context::dump_to_pp): New.
(liveness_context::make_dump_widget): New.
(program_state::detect_leaks): Reimplement, generalizing from
svalue to symbolic::value_node.
* program-state.h (extrinsic_state::dump_to_pp): Delete.
(extrinsic_state::dump_to_file): Delete.
(extrinsic_state::dump_to_logger): New.
(extrinsic_state::make_dump_widget): New.
(sm_state_map::make_dump_widget): Update signature.
(sm_state_map::dump): New.
(sm_state_map::on_liveness_change): Update signature.
(sm_state_map::on_unknown_change): Likewise.
(sm_state_map::purge_state_involving): Likewise.
(sm_state_map::validate): New.
(sm_state_map::get_any_inherited_state_of_bit_vector): New.
(sm_state_map::m_map_ubc_to_state): New field.
(program_state::dump_to_pp): Delete.
(program_state::dump_to_file): Delete.
(program_state::dump_to_logger): New.
(program_state::dump): Simplify signature.
(program_state::make_dump_widget): Update signature.
* ranges.cc: Deleted file; partially used when reimplementing
symbolic-ranges.cc.
* ranges.h: Deleted file; partially used when reimplementing
symbolic-ranges.h.
* record-layout.cc (record_layout::record_layout): Port from
bit_range to concrete_bit_range, and from bit_offset_t to
concrete_bit_offset.
(record_layout::get_item_at): Likewise.
(record_layout::maybe_pad_to): Likewise.
* record-layout.h (get_bit_position): New decl.
(get_field_at_bit_offset): New decl.
(class record_layout): Port from bit_range to concrete_bit_range,
and from bit_offset_t to concrete_bit_offset.
* region-model-asm.cc (region_model::on_asm_stmt): Update for
change to reachable_regs. Drop store manager. Pass baseline
state to get_or_create_cluster.
* region-model-manager.cc: Include "analyzer/symbolic-scalars.h",
"analyzer/record-layout.h", and "analyzer/analyzer-selftests.h".
(region_model_manager::region_model_manager): Drop m_store_mgr.
(region_model_manager::~region_model_manager): Drop cleanup of
dropped fields m_sub_values_map, m_repeated_values_map,
m_bits_within_values_map, m_compound_values_map, and
m_conjured_values_map. Add cleanup of m_bit_vector_to_svalue_map.
(region_model_manager::get_or_create_initial_value): Handle
subregions as a cropping of the baseline contents of the base
region.
(region_model_manager::get_ptr_svalue): Port from region_svalue to
pointer_svalue.
(region_model_manager::maybe_fold_unaryop): Avoid creating
symbolic regions for pointer casts by simplifying (T*)(®ION) to
((T*)®ION). Fold svalue_from_bit_vector.
(region_model_manager::maybe_undo_optimize_bit_field_compare):
Delete.
(region_model_manager::maybe_fold_binop): Handle
POINTER_PLUS_EXPR and LSHIFT_EXPR. Fold pointer arithmetic within
a base region. Drop handling of compound_svalue.
(region_model_manager::maybe_fold_sub_svalue): Delete.
(region_model_manager::get_or_create_sub_svalue): Delete.
(region_model_manager::maybe_fold_repeated_svalue): Delete.
(region_model_manager::get_or_create_repeated_svalue): Delete.
(region_model_manager::maybe_fold_svalue_from_bit_vector): New.
(canonicalize_ptr_type_for_bit_vector): New.
(get_bit_range_for_field): Delete.
(get_byte_range_for_field): Delete.
(get_field_at_byte_range): Delete.
(region_model_manager::maybe_fold_bits_within_svalue): Delete.
(region_model_manager::get_or_create_bits_within): Delete.
(region_model_manager::get_or_create_compound_svalue): Delete.
(region_model_manager::get_svalue_from_bit_vector): New.
(region_model_manager::get_svalue_from_scalar): New.
(conjured_purge::purge): Reimplement in symbolic-bit-vectors.cc.
(region_model_manager::get_or_create_conjured_svalue): Reimplement
in terms of svalue_from_bit_vector(conjured_bit_vector).
(region_model_manager::maybe_fold_sized_region_to_initial_field):
New.
(region_model_manager::get_sized_region): Call it.
(region_model_manager::get_cast_region): Fold casts of symbolic
regions.
(region_model_manager::maybe_fold_symbolic_region): New.
(region_model_manager::get_symbolic_region): Add call to
maybe_fold_symbolic_region.
(region_model_manager::get_bit_range): Use concrete_bit_range
rather than bit_range.
(region_model_manager::log_stats): Update logging of
m_pointer_values_map. Drop logging of deleted fields
m_sub_values_map, m_repeated_values_map, m_bits_within_values_map,
m_compound_values_map, m_conjured_values_map, and m_store_mgr. Add
logging of m_bit_vector_to_svalue_map.
(store_manager::log_stats): Delete.
(selftest::test_svalue_from_bit_vector): New.
(selftests::analyzer_region_model_manager_cc_tests): New.
* region-model-manager.h: Add includes of "svalue.h", "region.h",
and "known-function-manager.h".
(region_model_manager::get_ptr_svalue): Update param to
symbolic::pointer.
(region_model_manager::get_or_create_sub_svalue): Delete.
(region_model_manager::get_or_create_repeated_svalue): Delete.
(region_model_manager::get_or_create_bits_within): Delete.
(region_model_manager::get_or_create_compound_svalue): Delete.
(region_model_manager::get_svalue_from_bit_vector): New.
(region_model_manager::get_svalue_from_scalar): New.
(region_model_manager::get_bit_range): Convert from bit_range to
concrete_bit_range.
(region_model_manager::get_store_manager): Delete.
(region_model_manager::maybe_fold_sub_svalue): Delete.
(region_model_manager::maybe_fold_repeated_svalue): Delete.
(region_model_manager::maybe_fold_bits_within_svalue): Delete.
(region_model_manager::maybe_undo_optimize_bit_field_compare):
Delete.
(region_model_manager::maybe_fold_svalue_from_bit_vector): New.
(region_model_manager::maybe_fold_sized_region_to_initial_field):
New.
(region_model_manager::maybe_fold_symbolic_region): New.
(region_model_manager::pointer_values_map_t): Convert from
region_svalue to pointer_svalue.
(region_model_manager::bit_vector_to_svalue_map_t): New typedef.
(region_model_manager::m_bit_vector_to_svalue_map): New field.
(region_model_manager::sub_values_map_t): Drop.
(region_model_manager::m_sub_values_map): Drop.
(region_model_manager::repeated_values_map_t): Drop.
(region_model_manager::m_repeated_values_map): Drop.
(region_model_manager::bits_within_values_map_t): Drop.
(region_model_manager::m_bits_within_values_map): Drop.
(region_model_manager::compound_values_map_t): Drop.
(region_model_manager::m_compound_values_map): Drop.
(region_model_manager::conjured_values_map_t): Drop.
(region_model_manager::m_conjured_values_map): Drop.
(region_model_manager::m_store_mgr): Drop.
* region-model-reachability.cc: Add include of
"analyzer/liveness-context.h".
(recurse_into_children_p): New.
(reachable_regions::init_cluster): Port to
symbolic::liveness_context.
(reachable_regions::add): Port to new implementation of
binding_cluster contents.
(reachable_regions::handle_sval_cb): Update for generalization
to symbolic::value_node.
(reachable_regions::handle_sval): Rename to...
(reachable_regions::handle_value): ...this, generalizing from
svalue to symbolic::value_node.
(reachable_regions::handle_parm): Port to new implementation.
(reachable_regions::mark_escaped_clusters): Likewise.
(reachable_regions::dump_to_pp): Likewise.
* region-model-reachability.h (class reachable_regions): Use
value_set rather than svalue_set throughout.
(reachable_regions::handle_sval): Rename to...
(reachable_regions::handle_value): ...this, generalizing from
svalue to symbolic::value_node.
* region-model.cc: Drop include of "stor-layout.h". Include
"diagnostics/markup.h".
(region_to_value_map::dump_to_pp): Drop.
(region_to_value_map::dump): Drop.
(region_to_value_map::make_dump_widget): Update for new signature.
(region_to_value_map::purge_state_involving): Generalize from
svalue to symbolic::node.
(exception_node::dump_to_pp): Drop.
(exception_node::dump): Drop overload and reimplement in terms
of dump widget.
(exception_node::dump_to_logger): New.
(exception_node::make_dump_widget): Update for signature change.
(exception_node::add_to_reachable_regions): Update for change
to reachable_regions.
(region_model::region_model): Pass node_mgr to store ctor.
(region_model::dump_to_pp): Reimplement in terms of dump_widget.
(region_model::dump): Likewise, simplifying.
(region_model::debug): Drop.
(region_model::dump_to_logger): New.
(region_model::make_dump_widget): Update for signature change.
(region_model::canonicalize): Drop store manager.
(region_model::loop_replay_fixup): Pass baseline state to store.
(region_model::get_gassign_result): Update infinite loop detection
before eval_condition does any folding.
(region_model::complain_about_poison): New.
(region_model::check_bytes_for_poison): New.
(region_model::on_assignment): Call region_model::set_value rather
than going to store for STRING_CST.
(exception_thrown_from_unrecognized_call::update_model): Port
to bit_contents.
(region_model::purge_state_involving): Pass a symbolic::node
rather than an svalue, dropping rejection of
can_have_associated_state_p.
(check_one_function_attr_null_terminated_string_arg): Port to new
types.
(region_model::handle_unrecognized_call): Likewise.
(region_model::get_reachable_svalues): Likewise.
(region_model::get_lvalue_1): Likewise.
(region_model::get_baseline_state): New.
(region_model::get_store_value): Move poison-checking.
Reimplement in terms of get_store_bits and
get_svalue_from_bit_vector.
(region_model::get_store_bits): New.
(region_model::get_bit_contents): New.
(region_model::set_bit_contents_raw): New.
(region_model::deref_rvalue): Assert that type is non-null.
Drop case for SK_REGION.
(region_model::get_rvalue_for_bits): Reimplement in terms of
get_store_bits, get_cropped_bits, and get_svalue_from_bit_vector.
(region_model::check_for_writable_region): Rename "dest_reg" to
"base_reg" and assume it is a base region.
(region_model::get_capacity_as_scalar): New.
(region_model::check_region_access): Reimplement as...
(region_model::check_memory_range_access): ...this.
(region_model::check_region_for_read): Delete.
(size_visitor::visit_conjured_svalue): Replace with...
(size_visitor::visit_svalue_from_bit_vector): ...this.
(region_model::write_to_memory_offset): New.
(region_model::set_value): Port to new types, reimplementing
in terms of write_to_memory_offset.
(struct fragment): Delete.
(string_cst_has_null_terminator): Delete.
(svalue_byte_range_has_null_terminator): Delete.
(svalue_byte_range_has_null_terminator_1): Delete.
(get_tree_for_byte_offset): Convert from byte_offset_t to
concrete_byte_offset.
(class iterable_cluster): Delete.
(region_model::get_store_bytes): Delete.
(region_model::scan_for_null_terminator_1): Reimplement in terms
of string_scan.
(region_model::scan_for_null_terminator): Use symbolic::bit_vector
for output of scanned bytes, rather than svalue.
(region_model::check_for_null_terminated_string_arg): Likewise.
(region_model::clobber_region): Drop store manager. Pass baseline
state.
(region_model::purge_region): Reimplement.
(region_model::fill_region): Delete.
(region_model::zero_fill_region): Reimplement in terms of
write_to_memory_offset.
(region_model::write_bytes): Reimplement in terms of
symbolic::pointer, symbolic::bit_vector, and
write_to_memory_offset.
(region_model::read_bytes): Reimplement in terms of
symbolic::pointer, symbolic_byte_size, and symbolic::bit_vector.
(region_model::copy_bytes): Reimplement in terms of
symbolic::pointers and symbolic_byte_size.
(region_model::mark_region_as_unknown): Reimplement.
(region_model::mark_region_as_conjured): New.
(equal_bit_vectors_p): New.
(region_model::canonicalize_svalue_for_constraint): New.
(region_model::can_recurse_eval_condition_p): New.
(region_model::eval_condition): Canonicalize lhs and rhs. Treat
equal bit vectors as equal (after float rejection for NaN). Port
from region_svalue to symbolic::pointer. Reject recursion purely
due to canonicalization, to avoid infinite recursion.
(region_model::compare_initial_and_pointer): Port from
region_svalue to symbolic::pointer.
(is_positive_svalue): Add positive * positive handler.
(region_model::add_constraint): Canonicalize lhs and rhs. Port
from region_svalue to symbolic::pointer.
(convert_to_type): New.
(region_model::get_representative_path_var_1): Update from
svalue_set to value_set. Convert various early returns into
appends to "pvs", so that we consider other canidates by
readability. Port from region_svalue to symbolic::pointer and
handle other new types.
(region_model::get_representative_path_var): Use value_set rather
than svalue_set. Only require types_compatible_p, rather than
exact type matches.
(region_model::get_representative_tree): Use value_set rather
than svalue_set. Strip top-level casts repeatedly, rather than
just one.
(region_model::get_representative_tree): Update from svalue_set to
value_set.
(region_model::maybe_get_region_for_mem_range): New.
(region_model::maybe_get_subregion_for_symbolic_bit_range): New.
(region_model::maybe_get_subregion_for_concrete_bit_range): New.
(get_underlying_index_type): New.
(struct quotient_and_residual): New.
(try_split_exact_multiple): New.
(quotient_and_residual::handle_bits_from_bytes): New.
(region_model::maybe_get_subregion_for_symbolic_bit_range_in_array):
New.
(region_model::maybe_get_subregion_for_symbolic_bit_range_in_record):
New.
(region_model::get_representative_path_var_1): Update from
svalue_set to value_set.
(region_model::get_representative_path_var): Likewise.
(region_model::replay_call_summary): Support failure from
store::replay_call_summary.
(region_model::on_top_level_param): Drop store manager; pass
baseline state.
(region_model::push_frame): Try to preserve the type of arg_sval
in the store, by wrapping it in an "unmergeable" decorator.
(region_model::poison_any_pointers_to_descendents): Delegate to
the cluster.
(region_model::can_merge_with_p): Drop store manager and update
for change to purge_state_involving.
(region_model::get_vtable_from_obj): Port to symbolic::pointer.
(region_model::get_fndecl_for_call): Port from region_svalue to
symbolic::pointer.
(contains_floating_point_visitor::visit_conjured_svalue): Delete.
(struct uninit_bit_counter): New.
(class exposure_through_uninit_copy): Reimplement using
uninit_bit_counter and new symbolic represenation.
(contains_uninit_p): Reimplement using poison_finder.
(region_model::maybe_complain_about_infoleak): Pass node_mgr to
exposure_through_uninit_copy ctor.
(model_merger::dump_to_pp): Drop.
(model_merger::dump): Drop.
(model_merger::dump): Drop.
(model_merger::mergeable_bit_vector_p): New.
(debug): Drop.
(selftest::assert_dump_eq): Drop.
(ASSERT_DUMP_EQ): Drop.
(selftesttest_dump): Reimplement using
symbolic::dump_node_tree_to_pp.
(selftest::make_test_compound_type): Move to analyzer-selftest.cc.
(struct selftest::coord_test): Likewise.
(selftest::test_struct): Add ASSERT_SYMBOLIC_NODE_MARKUP_TEXT_EQ
in various places. Use ASSERT_SAME_SYMBOLIC_NODE rather than
ASSERT_EQ to get better error messages. Verify memory ranges.
Port from region_offset to symbolic::memory_offset. Drop
binding_cluster code.
(selftest::test_array_1): Verify markup output.
(selftest::test_get_representative_tree): Likewise. Add test
of a single field within a struct.
(selftest::test_unique_constants): Verify markup output.
(selftest::test_unique_unknowns): Likewise.
(selftest::test_initial_svalue_folding): Replace ASSERT_EQ
with ASSERT_SAME_SYMBOLIC_NODE and verify markup output.
(selftest::test_unaryop_svalue_folding): Likewise.
(selftest::test_binop_svalue_folding): Likewise.
(selftest::test_sub_svalue_folding): Drop.
(selftest::get_bit): Drop.
(selftest::test_bits_within_svalue_folding): Drop.
(selftest::test_bit_range_regions): Port from bit_range
to concrete_bit_range. Verify markup.
(selftest::test_stack_frames): Update "popped_stack" poison test.
Use ASSERT_SAME_SYMBOLIC_NODE.
(selftest::test_get_representative_path_var): Port from svalue_set
to value_set.
(selftest::assert_region_models_merge): Fix indentation.
(selftest::test_state_merging): Port from region_svalue to
pointer_svalue. Use ASSERT_SAME_SYMBOLIC_NODE rather than
ASSERT_EQ. Update test to use "p" rather than "x", since p is a
pointer.
(selftest::test_var): Update from region_offset to
symbolic::memory_range. Use ASSERT_SAME_SYMBOLIC_NODE rather than
ASSERT_EQ
(selftest::test_array_2): Likewise.
(selftest::test_alloca): Update "popped_stack" poison test.
(selftest::test_involves_p): Update for change in signature of
involves_p.
(selftest::test_array_in_struct): New test.
(selftest::test_maybe_get_region_for_mem_range): New test.
(selftest::analyzer_region_model_cc_tests): Drop calls to
test_sub_svalue_folding and test_bits_within_svalue_folding.
Add calls to test_array_in_struct and
test_maybe_get_region_for_mem_range.
* region-model.h (region_to_value_map::dump_to_pp): Drop.
(region_to_value_map::dump): Drop.
(region_to_value_map::dump_to_logger): New.
(region_to_value_map::make_dump_widget): Update signature.
(region_to_value_map::void purge_state_involving): Use
symbolic::node rather than svalue.
(visitor::visit_region_svalue): Replace with...
(visitor::visit_pointer_svalue): ...this.
(visitor::visit_sub_svalue): Delete.
(visitor::visit_repeated_svalue): Delete.
(visitor::visit_bits_within_svalue): Delete.
(visitor::visit_compound_svalue): Delete.
(visitor::visit_conjured_svalue): Delete.
(visitor::visit_svalue_from_bit_vector): New.
(exception_node::dump_to_pp): Drop.
(exception_node::dump): Drop overloads.
(exception_node::dump_to_logger): New.
(exception_node::make_dump_widget): Update signature.
(region_model::dump_to_pp): Simplify signature.
(region_model::dump): Drop overloads.
(region_model::dump_to_logger): New.
(region_model::debug): Drop.
(region_model::make_dump_widget): Update signature.
(region_model::purge_state_involving): Pass a symbolic::node
rather than an svalue.
(region_model::purge_state_involving): Use a value_set rather
than an svalue_set.
(region_model::fill_region): Drop.
(region_model::write_bytes): Port from svalue to symbolic::pointer
and symbolic::bit_vector.
(region_model::read_bytes): Likewise.
(region_model::copy_bytes): Port from region and svalue to
symbolic::pointer and symbolic_byte_size.
(region_model::mark_region_as_conjured): New.
(region_model::compare_initial_and_pointer): Port from
region_svalue to symbolic::pointer.
(region_model::get_representative_path_var): Use a value_set
rather than an svalue_set.
(region_model::maybe_get_region_for_mem_range): New.
(region_model::get_store_bytes): Replace with...
(region_model::get_store_bit): ...this.
(region_model::get_bit_contents): New.
(region_model::set_bit_contents_raw): New.
(region_model::scan_for_null_terminator): Use symbolic::bit_vector
rather than svalue.
(region_model::scan_for_null_terminator_1): Likewise.
(region_model::check_for_null_terminated_string_arg): Likewise.
(region_model::write_to_memory_offset): New.
(region_model::get_capacity_as_scalar): New.
(region_model::check_bytes_for_poison): New.
(region_model::get_baseline_state): New.
(region_model::bits_live_p): New.
(region_model::get_representative_path_var_1): Use a value_set
rather than an svalue_set.
(region_model::maybe_get_subregion_for_symbolic_bit_range): New.
(region_model::maybe_get_subregion_for_concrete_bit_range): New.
(region_model::maybe_get_subregion_for_symbolic_bit_range_in_array):
New.
(region_model::maybe_get_subregion_for_symbolic_bit_range_in_record):
New.
(region_model::complain_about_poison): New.
(region_model::check_memory_range_for_taint): New.
(region_model::check_memory_range_access): New.
(region_model::check_region_for_read): Drop.
(region_model::check_symbolic_bounds): Update from region
to symbolic::memory_range.
(region_model::check_memory_range_bounds): New.
(region_model::canonicalize_svalue_for_constraint): New.
(region_model::can_recurse_eval_condition_p): New.
(region_model_context::on_liveness_change): Update signature.
(region_model_context::on_unknown_change): Likewise.
(region_model_context::purge_state_involving): Likewise.
(class noop_region_model_context): Update for above changes.
(class region_model_context_decorator): Likewise.
(model_merger::dump_to_pp): Drop.
(model_merger::dump_to_logger): New.
(model_merger::dump): Simplify, dropping overloads.
(model_merger::mergeable_bit_vector_p): New.
(struct poison_finder): New.
* region.cc: Include "diagnostics/markup.h" and
"analyzer/symbolic-pointers.h".
(compare_bit_offsets_p): Delete.
(region_offset::make_byte_offset): Delete.
(region_offset::calc_symbolic_bit_offset): Delete.
(region_offset::calc_symbolic_byte_offset): Delete.
(region_offset::dump_to_pp): Delete.
(region_offset::dump): Delete.
(struct linear_op): Delete.
(strip_types): Delete.
(eval_byte_offset_comparison): Delete.
(eval_region_offset_comparison): Delete.
(region::print_dump_widget_label): New.
(region::~region): Drop manual deletion of m_cached_offset.
(region::add_dump_widget_children): New.
(region::get_memory_space): Handle RK_SYMBOLIC.
(region::calc_initial_value_at_main): Port to new implementation.
(region::get_offset): Replace with...
(region::get_memory_offset): ...this.
(region::get_next_offset): Delete.
(region::get_memory_range): New.
(region::get_pointer): New.
(region::get_byte_size): Replace with...
(region::maybe_get_byte_size): ...this.
(region::get_byte_size_sval): Reimplement.
(region::get_bit_size_sval): New.
(get_type_size): New.
(get_bit_position): New.
(region::get_bit_size): Replace with...
(region::maybe_get_bit_size): ...this.
(get_field_at_bit_offset): Port to new types.
(region::get_subregions_for_binding): Convert to...
(region::get_subregions_for_bit_range): ...this.
(region::calc_offset): Replace with...
(region::calc_memory_offset): ...this.
(region::get_relative_concrete_offset): Delete.
(region::get_relative_symbolic_offset): Delete.
(region::get_relative_concrete_byte_range): Delete.
(region::calc_memory_range): New.
(region::calc_pointer): New.
(region::dump): Delete.
(region::maybe_get_bit_offset_relative_to_parent): New.
(region::maybe_get_byte_offset_relative_to_parent): New.
(region::to_json): Delete in favor of node::to_json.
(region::dump): Reimplement using dump widget.
(region::make_dump_widget): Delete in favor of
node::make_dump_widget.
(region::add_dump_widget_children): Update signature.
(region::make_json_obj): New.
(region::empty_p): Add "rmm" param and port to new implementation.
(region::region): Update for replacement of m_cached_offset with
m_cached_memory_range.
(region::involves_p): Delete in favor of node::involves_p.
(frame_region::print_dump_widget_label): Rename to...
(frame_region::print_region_for_dump_widget_label): ...this.
(frame_region::accept_node_visitor): New.
(frame_region::to_json): New.
(frame_region::make_markup_node): New.
(globals_region::print_dump_widget_label): Rename to...
(globals_region::print_region_for_dump_widget_label): ...this.
(globals_region::accept_node_visitor) New.
(globals_region::to_json): New.
(globals_region::make_markup_node): New.
(code_region::print_dump_widget_label): Rename to...
(code_region::print_region_for_dump_widget_label): ...this.
(code_region::accept_node_visitor) New.
(code_region::to_json): New.
(code_region::make_markup_node): New.
(function_region::print_dump_widget_label): Rename to...
(function_region::print_region_for_dump_widget_label): ...this.
(function_region::accept_node_visitor) New.
(function_region::to_json): New.
(function_region::make_markup_node): New.
(label_region::print_dump_widget_label): Rename to...
(label_region::print_region_for_dump_widget_label): ...this.
(label_region::accept_node_visitor) New.
(label_region::to_json): New.
(label_region::make_markup_node): New.
(stack_region::print_dump_widget_label): Rename to...
(stack_region::print_region_for_dump_widget_label): ...this.
(stack_region::accept_node_visitor) New.
(stack_region::to_json): New.
(stack_region::make_markup_node): New.
(heap_region::print_dump_widget_label): Rename to...
(heap_region::print_region_for_dump_widget_label): ...this.
(heap_region::accept_node_visitor) New.
(heap_region::to_json): New.
(heap_region::make_markup_node): New.
(root_region::print_dump_widget_label): Rename to...
(root_region::print_region_for_dump_widget_label): ...this.
(root_region::accept_node_visitor) New.
(root_region::to_json): New.
(root_region::make_markup_node): New.
(thread_local_region::print_dump_widget_label): Rename to...
(thread_local_region::print_region_for_dump_widget_label):
...this.
(thread_local_region::accept_node_visitor) New.
(thread_local_region::to_json): New.
(thread_local_region::make_markup_node): New.
(symbolic_region::print_dump_widget_label): Rename to...
(symbolic_region::print_region_for_dump_widget_label): ...this.
(symbolic_region::add_dump_widget_children): Update signature.
Dump m_sval_ptr.
(symbolic_region::accept_node_visitor) New.
(symbolic_region::to_json): New.
(symbolic_region::make_markup_node): New.
(decl_region::print_dump_widget_label): Rename to...
(decl_region::print_region_for_dump_widget_label): ...this.
(decl_region::accept_node_visitor) New.
(decl_region::to_json): New.
(decl_region::make_markup_node): New.
(decl_region::calc_svalue_for_constructor): Delete.
(decl_region::get_svalue_for_constructor): Reimplement.
(decl_region::get_bit_contents_for_constructor): New.
(decl_region::get_svalue_for_initializer): Reimplement.
(decl_region::maybe_get_bit_contents_for_initializer): New.
(field_region::print_dump_widget_label): Rename to...
(field_region::print_region_for_dump_widget_label): ...this.
(field_region::accept_node_visitor) New.
(field_region::to_json): New.
(field_region::make_markup_node): New.
(field_region::get_relative_concrete_offset): Drop.
(field_region::maybe_get_bit_offset_relative_to_parent): New.
(field_region::maybe_get_byte_offset_relative_to_parent): New.
(field_region::get_relative_symbolic_offset): Drop.
(element_region::print_dump_widget_label): Rename to...
(element_region::print_region_for_dump_widget_label): ...this.
(element_region::add_dump_widget_children): Update signature.
Dump m_index.
(element_region::accept_node_visitor) New.
(element_region::to_json): New.
(element_region::make_markup_node): New.
(element_region::maybe_get_bit_offset_relative_to_parent): New.
(element_region::maybe_get_byte_offset_relative_to_parent): New.
(element_region::get_relative_concrete_offset): Delete.
(element_region::get_relative_symbolic_offset): Delete.
(offset_region::print_dump_widget_label): Rename to...
(offset_region::print_region_for_dump_widget_label): ...this.
(offset_region::add_dump_widget_children): Update signature.
Dump m_byte_offset.
(offset_region::accept_node_visitor) New.
(offset_region::to_json): New.
(offset_region::make_markup_node): New.
(offset_region::get_relative_concrete_offset): Delete.
(offset_region::maybe_get_bit_offset_relative_to_parent): New.
(offset_region::get_relative_symbolic_offset): Delete.
(offset_region::maybe_get_byte_offset_relative_to_parent): New.
(sized_region::print_dump_widget_label): Rename to...
(sized_region::print_region_for_dump_widget_label): ...this.
(sized_region::add_dump_widget_children): Update signature.
(sized_region::accept_node_visitor) New.
(sized_region::to_json): New.
(sized_region::make_markup_node): New.
(sized_region::get_byte_size): Replace with...
(sized_region::maybe_get_byte_size): ...this.
(sized_region::get_bit_size): Replace with...
(sized_region::maybe_get_bit_size): ...this.
(sized_region::get_bit_size_sval): Drop.
(cast_region::print_dump_widget_label): Rename to...
(cast_region::print_region_for_dump_widget_label): ...this.
(cast_region::accept_node_visitor) New.
(cast_region::to_json): New.
(cast_region::make_markup_node): New.
(cast_region::get_relative_concrete_offset): Drop.
(cast_region::maybe_get_bit_offset_relative_to_parent): New.
(cast_region::maybe_get_byte_offset_relative_to_parent): New.
(heap_allocated_region::print_dump_widget_label): Rename to...
(heap_allocated_region::print_region_for_dump_widget_label): ...this.
(heap_allocated_region::accept_node_visitor) New.
(heap_allocated_region::to_json): New.
(heap_allocated_region::make_markup_node): New.
(alloca_region::print_dump_widget_label): Rename to...
(alloca_region::print_region_for_dump_widget_label): ...this.
(alloca_region::accept_node_visitor) New.
(alloca_region::to_json): New.
(alloca_region::make_markup_node): New.
(string_region::print_dump_widget_label): Rename to...
(string_region::print_region_for_dump_widget_label): ...this.
(string_region::accept_node_visitor) New.
(string_region::to_json): New.
(string_region::make_markup_node): New.
(bit_range_region::print_dump_widget_label): Rename to...
(bit_range_region::print_region_for_dump_widget_label): ..this.
(bit_range_region::accept_node_visitor): New.
(bit_range_region::to_json): New.
(bit_range_region::make_markup_node): New.
(bit_range_region::get_byte_size): Delete.
(bit_range_region::maybe_get_byte_size): New.
(bit_range_region::get_bit_size): Delete.
(bit_range_region::get_byte_size_sval): Delete.
(bit_range_region::get_bit_size_sval): Delete.
(bit_range_region::maybe_get_bit_size): New.
(bit_range_region::get_relative_concrete_offset): Delete.
(bit_range_region::maybe_get_bit_offset_relative_to_parent): New.
(bit_range_region::get_relative_symbolic_offset): Delete.
(bit_range_region::maybe_get_byte_offset_relative_to_parent): New.
(var_arg_region::print_dump_widget_label): Rename to...
(var_arg_region::print_region_for_dump_widget_label): ...this.
(var_arg_region::accept_node_visitor): New.
(var_arg_region::to_json): New.
(var_arg_region::make_markup_node): New.
(errno_region::print_dump_widget_label): Rename to...
(errno_region::print_region_for_dump_widget_label): ...this.
(errno_region::accept_node_visitor): New.
(errno_region::to_json): New.
(errno_region::make_markup_node): New.
(private_region::print_dump_widget_label): Rename to...
(private_region::print_region_for_dump_widget_label): ...this.
(private_region::accept_node_visitor): New.
(private_region::to_json): New.
(private_region::make_markup_node): New.
(unknown_region::print_dump_widget_label): Rename to...
(unknown_region::print_region_for_dump_widget_label): ...this.
(unknown_region::accept_node_visitor): New.
(unknown_region::to_json): New.
(unknown_region::make_markup_node): New.
* region.h: Drop include of "text-art/tree-widget.h". Add
includes of "analyzer/concrete-ranges.h",
"analyzer/symbolic-memory-offsets.h",
"analyzer/symbolic-memory-ranges.h", and
"analyzer/symbolic-pointers.h".
(region::symbolic_bit_count): New using decl.
(region::symbolic_byte_count): New using decl.
(region::print_dump_widget_label): New.
(region::print_region_for_dump_widget_label): New.
(region::add_dump_widget_children): New.
(region::get_any_dump_color): New.
(region::to_json): Delete in favor of node::to_json.
(region::make_dump_widget): Delete in favor of
node::make_dump_widget.
(region::involves_p): Delete in favor of node::involves_p.
(region::get_memory_offset): New.
(region::get_memory_range): New.
(region::get_offset): Delete.
(region::get_next_offset): Delete.
(region::get_byte_size): Delete.
(region::get_pointer): New.
(region::get_bit_size): Replace with...
(region::maybe_get_bit_size): ...this.
(region::maybe_get_byte_size): New.
(region::get_bit_size_sval): Delete.
(region::get_byte_size_sval): New.
(region::get_relative_concrete_offset): Replace with...
(region::maybe_get_bit_offset_relative_to_parent): ...this.
(region::get_relative_symbolic_offset): Delete.
(region::get_relative_concrete_byte_range): Delete.
(region::maybe_get_byte_offset_relative_to_parent): New.
(region::get_subregions_for_binding): Replace with...
(region::get_subregions_for_bit_range): ...this.
(region::empty_p): Add region_model_manager param.
(region::make_json_obj): New.
(region::calc_offset): Drop.
(region::calc_memory_offset): New.
(region::calc_memory_range): New.
(region::calc_pointer): New.
(region::print_dump_widget_label): Drop.
(region::add_dump_widget_children): Drop.
(region::add_dump_widget_children_for_region): Drop.
(region::m_cached_offset): Replace with...
(region::m_cached_memory_offset): ...this,
(region::m_cached_memory_range): ...this,
(region::m_cached_pointer): ...and this.
(frame_region::print_dump_widget_label): Rename to...
(frame_region::print_region_for_dump_widget_label): ...this.
(frame_region::accept_node_visitor): New.
(frame_region::to_json): New.
(frame_region::make_markup_node): New.
(globals_region::print_dump_widget_label): Rename to...
(globals_region::print_region_for_dump_widget_label): ...this.
(globals_region::accept_node_visitor): New.
(globals_region::to_json): New.
(globals_region::make_markup_node): New.
(code_region::print_dump_widget_label): Rename to...
(code_region::print_region_for_dump_widget_label): ...this.
(code_region::accept_node_visitor): New.
(code_region::to_json): New.
(code_region::make_markup_node): New.
(function_region::print_dump_widget_label): Rename to...
(function_region::print_region_for_dump_widget_label): ...this.
(function_region::accept_node_visitor): New.
(function_region::to_json): New.
(function_region::make_markup_node): New.
(label_region::print_dump_widget_label): Rename to...
(label_region::print_region_for_dump_widget_label): ...this.
(label_region::accept_node_visitor): New.
(label_region::to_json): New.
(label_region::make_markup_node): New.
(stack_region::print_dump_widget_label): Rename to...
(stack_region::print_region_for_dump_widget_label): ...this.
(stack_region::accept_node_visitor): New.
(stack_region::to_json): New.
(stack_region::make_markup_node): New.
(heap_region::print_dump_widget_label): Rename to...
(heap_region::print_region_for_dump_widget_label): ...this.
(heap_region::accept_node_visitor): New.
(heap_region::to_json): New.
(heap_region::make_markup_node): New.
(thread_local_region::print_dump_widget_label): Rename to...
(thread_local_region::print_region_for_dump_widget_label): ...this.
(thread_local_region::accept_node_visitor): New.
(thread_local_region::to_json): New.
(thread_local_region::make_markup_node): New.
(root_region::print_dump_widget_label): Rename to...
(root_region::print_region_for_dump_widget_label): ...this.
(root_region::accept_node_visitor): New.
(root_region::to_json): New.
(root_region::make_markup_node): New.
(symbolic_region::print_dump_widget_label): Rename to...
(symbolic_region::print_region_for_dump_widget_label): ...this.
(symbolic_region::accept_node_visitor): New.
(symbolic_region::to_json): New.
(symbolic_region::make_markup_node): New.
(symbolic_region::add_dump_widget_children): Update signature.
(decl_region::decl_region): Replace m_ctor with
m_ctor_bit_contents.
(decl_region::print_dump_widget_label): Rename to...
(decl_region::print_region_for_dump_widget_label): ...this.
(decl_region::accept_node_visitor): New.
(decl_region::to_json): New.
(decl_region::make_markup_node): New.
(decl_region::maybe_get_bit_contents_for_initializer): New.
(decl_region::get_bit_contents_for_constructor): New.
(decl_region::maybe_get_bit_vector_for_initializer): New.
(decl_region::calc_svalue_for_constructor): Drop.
(decl_region::m_ctor_svalue): Replace with...
(decl_region::m_ctor_bit_contents): ...this.
(field_region::print_dump_widget_label): Rename to...
(field_region::print_region_for_dump_widget_label): ...this.
(field_region::accept_node_visitor): New.
(field_region::to_json): New.
(field_region::make_markup_node): New.
(field_region::get_relative_concrete_offset): Drop.
(field_region::get_relative_symbolic_offset): Drop.
(field_region::maybe_get_bit_offset_relative_to_parent): New.
(field_region::maybe_get_byte_offset_relative_to_parent): New.
(element_region::print_dump_widget_label): Rename to...
(element_region::print_region_for_dump_widget_label): ...this.
(element_region::accept_node_visitor): New.
(element_region::to_json): New.
(element_region::make_markup_node): New.
(element_region::get_relative_concrete_offset): Drop.
(element_region::get_relative_symbolic_offset): Drop.
(element_region::maybe_get_bit_offset_relative_to_parent): New.
(element_region::maybe_get_byte_offset_relative_to_parent): New.
(offset_region::print_dump_widget_label): Rename to...
(offset_region::print_region_for_dump_widget_label): ...this.
(offset_region::add_dump_widget_children): Update signature.
(offset_region::accept_node_visitor): New.
(offset_region::to_json): New.
(offset_region::make_markup_node): New.
(offset_region::get_relative_concrete_offset): Drop.
(offset_region::get_relative_symbolic_offset): Drop.
(offset_region::maybe_get_bit_offset_relative_to_parent): New.
(offset_region::maybe_get_byte_offset_relative_to_parent): New.
(sized_region::print_dump_widget_label): Rename to...
(sized_region::print_region_for_dump_widget_label): ...this.
(sized_region::add_dump_widget_children): Update signature.
(sized_region::accept_node_visitor): New.
(sized_region::to_json): New.
(sized_region::make_markup_node): New.
(sized_region::get_byte_size): Drop.
(sized_region::get_bit_size): Drop.
(sized_region::get_byte_size_sval): Drop.
(sized_region::get_bit_size_sval): Drop.
(sized_region::maybe_get_byte_size): New.
(sized_region::maybe_get_bit_size): New.
(cast_region::print_dump_widget_label): Rename to...
(cast_region::print_region_for_dump_widget_label): ...this.
(cast_region::accept_node_visitor): New.
(cast_region::to_json): New.
(cast_region::make_markup_node): New.
(cast_region::maybe_get_bit_offset_relative_to_parent): New.
(cast_region::get_relative_concrete_offset): Drop.
(cast_region::maybe_get_byte_offset_relative_to_parent): New.
(heap_allocated_region::print_dump_widget_label): Rename to...
(heap_allocated_region::print_region_for_dump_widget_label):
...this.
(heap_allocated_region::accept_node_visitor): New.
(heap_allocated_region::to_json): New.
(heap_allocated_region::make_markup_node): New.
(alloca_region::print_dump_widget_label): Rename to...
(alloca_region::print_region_for_dump_widget_label): ...this.
(alloca_region::accept_node_visitor): New.
(alloca_region::to_json): New.
(alloca_region::make_markup_node): New.
(string_region::print_dump_widget_label): Rename to...
(string_region::print_region_for_dump_widget_label): ...this.
(string_region::accept_node_visitor): New.
(string_region::to_json): New.
(string_region::make_markup_node): New.
(bit_range_region::key_t::key_t): Convert from bit_range to
concrete_bit_range.
(bit_range_region::key_t::hash): Likewise.
(bit_range_region::key_t::m_bits): Convert from bit_range to
concrete_bit_range.
(bit_range_region::bit_range_region): Likewise.
(bit_range_region::print_dump_widget_label): Rename to...
(bit_range_region::print_region_for_dump_widget_label): ...this.
(bit_range_region::accept_node_visitor): New.
(bit_range_region::to_json): New.
(bit_range_region::make_markup_node): New.
(bit_range_region::get_bits): New.
(bit_range_region::maybe_get_byte_size): New.
(bit_range_region::maybe_get_bit_size): New.
(bit_range_region::maybe_get_bit_offset_relative_to_parent): New.
(bit_range_region::maybe_get_byte_offset_relative_to_parent): New.
(bit_range_region::get_byte_size): Delete.
(bit_range_region::get_bit_size): Delete.
(bit_range_region::get_byte_size_sval): Delete.
(bit_range_region::get_bit_size_sval): Delete.
(bit_range_region::get_relative_concrete_offset): Delete.
(bit_range_region::get_relative_symbolic_offset): Delete.
(bit_range_region::m_bits): Convert from bit_range to
concrete_bit_range.
(var_arg_region::print_dump_widget_label): Rename to...
(var_arg_region::print_region_for_dump_widget_label): ...this.
(var_arg_region::accept_node_visitor): New.
(var_arg_region::to_json): New.
(var_arg_region::make_markup_node): New.
(errno_region::print_dump_widget_label): Rename to...
(errno_region::print_region_for_dump_widget_label): ...this.
(errno_region::accept_node_visitor): New.
(errno_region::to_json): New.
(errno_region::make_markup_node): New.
(private_region::print_dump_widget_label): Rename to...
(private_region::print_region_for_dump_widget_label): ...this.
(private_region::accept_node_visitor): New.
(private_region::to_json): New.
(private_region::make_markup_node): New.
(unknown_region::print_dump_widget_label): Rename to...
(unknown_region::print_region_for_dump_widget_label): ...this.
(unknown_region::accept_node_visitor): New.
(unknown_region::to_json): New.
(unknown_region::make_markup_node): New.
* setjmp-longjmp.cc: Include "diagnostics/markup.h".
(setjmp_svalue::print_dump_widget_label): Rename to...
(setjmp_svalue::print_svalue_for_dump_widget_label): ...this.
(setjmp_svalue::add_dump_widget_children): Update for param
change.
(setjmp_svalue::accept_node_visitor): New.
(setjmp_svalue::to_json): New.
(setjmp_svalue::make_markup_node): New.
* sm-fd.cc: Port from region_svalue to symbolic::pointer. Use
mark_region_as_unknown rather than trying to create a conjured
value.
* sm-file.cc: Port from region_svalue to symbolic::pointer. Use
mark_region_as_conjured rather than trying to create a conjured
value.
* sm-malloc.cc (malloc_state_machine::get_default_state): Handle
all zeros. Port from region_svalue to symbolic::pointer.
(add_state_to_state_graph): Port from region_svalue to
symbolic::pointer.
* sm-taint.cc (taint_diagnostic::describe_state_change):
Bulletproof against null change.m_expr.
(region_model::check_memory_range_for_taint): New.
(region_model::check_region_for_taint): Drop casts in RK_OFFSET
case.
* state-purge.cc (same_binding_p): Replace store_manager param
with region_model_manager. Reimplement from binding_key to
symbolic::memory_range.
(fully_overwrites_p): Update for above change.
* store.cc (dump_svalue_set): Delete.
(uncertainty_t::on_maybe_bound_value): New.
(uncertainty_t::dump_to_pp): Delete.
(uncertainty_t::on_mutable_value_at_unknown_call): New.
(uncertainty_t::unknown_sm_state_p): New.
(uncertainty_t::add_bit_contents): New.
(uncertainty_t::dump): Reimplement using dump widget.
(uncertainty_t::dump_to_logger): New.
(binding_key::make): Delete.
(binding_key::dump): Delete.
(binding_key::get_desc): Delete.
(binding_key::cmp_ptrs): Delete.
(binding_key::cmp): Delete.
(bit_range::from_mask): Delete.
(concrete_binding::dump_to_pp): Delete.
(concrete_binding::overlaps_p): Delete.
(concrete_binding::get_byte_range): Delete.
(concrete_binding::cmp_ptr_ptr): Delete.
(symbolic_binding::dump_to_pp): Delete.
(symbolic_binding::cmp_ptr_ptr): Delete.
(concrete_binding_map::dump_to_pp): Delete.
(concrete_binding_map::dump): Delete.
(concrete_binding_map::add_to_tree_widget): Delete.
(concrete_binding_map::validate): Delete.
(concrete_binding_map::cmp): Delete.
(concrete_binding_map::get_any_exact_binding): Delete.
(concrete_binding_map::calc_complexity): Delete.
(concrete_binding_map::remove_overlapping_binding): Delete.
(concrete_binding_map::remove_overlapping_bindings): Delete.
(concrete_binding_map::get_overlapping_bindings): Delete.
(binding_map::const_iterator::operator==): Delete.
(binding_map::const_iterator::operator++): Delete.
(binding_map::const_iterator::operator*): Delete.
(binding_map::const_iterator::get_svalue): Delete.
(binding_map::iterator::operator==): Delete.
(binding_map::iterator::operator++): Delete.
(binding_map::iterator::operator*): Delete.
(binding_map::binding_map): Delete.
(binding_map::binding_map): Delete.
(binding_map::operator=): Delete.
(binding_map::operator==): Delete.
(binding_map::hash): Delete.
(binding_map::get): Delete.
(binding_map::put): Delete.
(binding_map::overwrite): Delete.
(binding_map::remove): Delete.
(binding_map::begin): Delete.
(binding_map::end): Delete.
(binding_map::begin): Delete.
(binding_map::end): Delete.
(binding_map::elements): Delete.
(binding_map::dump_to_pp): Delete.
(binding_map::dump): Delete.
(binding_map::validate): Delete.
(binding_map::to_json): Delete.
(add_binding_to_tree_widget): Delete.
(binding_map::add_to_tree_widget): Delete.
(get_subregion_within_ctor): Move to initializers.cc.
(get_subregion_within_ctor_for_ctor_pair): Likewise.
(get_svalue_for_ctor_val): Delete, reusing in implementation of
initializers.cc.
(concrete_binding_map::apply_ctor_to_region): Likewise.
(concrete_binding_map::apply_ctor_val_to_range): Likewise.
(concrete_binding_map::apply_ctor_pair_to_child_region): Likewise.
(binding_map::get_overlapping_bindings): Delete.
(binding_map::remove_overlapping_bindings): Delete.
(binding_cluster::binding_cluster): Reimplement, adding
assertions.
(binding_cluster::to_json): New.
(binding_cluster::make_dump_widget): New.
(binding_cluster::get_bits): New.
(binding_cluster::set_bits): New.
(binding_cluster::mark_as_untracked): New.
(binding_cluster::operator=): Reimplement.
(binding_cluster::operator==): Reimplement.
(binding_cluster::hash): Reimplement.
(binding_cluster::dump_to_pp): Delete.
(binding_cluster::dump): Reimplement.
(binding_cluster::validate): Convert to nop-op
(binding_cluster::bind): Delete.
(binding_cluster::bind_key): Delete.
(binding_cluster::bind_compound_sval): Delete.
(binding_cluster::clobber_region): Delete.
(binding_cluster::purge_region): Delete.
(binding_cluster::fill_region): Delete.
(binding_cluster::zero_fill_region): Delete.
(binding_cluster::mark_region_as_unknown): Delete.
(binding_cluster::purge_state_involving): Delete.
(binding_cluster::get_binding): Delete.
(binding_cluster::get_binding_recursive): Delete.
(binding_cluster::get_any_binding): Delete.
(binding_cluster::maybe_get_compound_binding): Delete.
(binding_cluster::mark_as_untracked): New.
(binding_cluster::remove_overlapping_bindings): Delete.
(binding_cluster::purge_state_involving): New.
(binding_cluster::can_merge_p): Reimplement.
(class possibly_overwritten_values_visitor): New.
(binding_cluster::make_unknown_relative_to): Reimplement.
(binding_cluster::for_each_value): New.
(binding_cluster::on_unknown_fncall): Drop store_manager.
Delegate to...
(binding_cluster::mark_region_as_conjured): ...this new function.
(binding_cluster::on_unknown_fncall): Likewise.
(binding_cluster::on_asm): Reimplement.
(binding_cluster::escaped_p): Treat symbolic regions arising from
dereferencing a conjured pointer as having escaped.
(binding_cluster::redundant_p): Add store and baseline_state
params, and use them to compare against the implicit contents.
(append_pathvar_with_type): Make non-static. Handle type being
null.
(binding_cluster::get_representative_path_vars): Reimplement,
delegating to m_contents.
(binding_cluster::get_any_value): Delete.
(binding_cluster::maybe_get_simple_value): Delete.
(binding_cluster::poison_any_pointers_to_descendents): New.
(binding_cluster::bits_live_p): New.
(store_manager::get_logger): Delete.
(store_manager::get_concrete_binding): Delete.
(store_manager::get_symbolic_binding): Delete.
(store::store): Initialize m_node_mgr.
(store::dump_to_pp): Delete.
(store::dump): Reimplement using dump widget.
(get_string_for_baseline_state): New.
(store::make_dump_widget): Update for new signature.
(store::get_bits): New.
(store::get_any_binding): Delete.
(store::get_bit_contents): New.
(store::set_bits): New.
(store::set_value): Delete.
(store::set_bit_contents_raw): New.
(store::eval_alias_1): Use derived_from_initial_value_p rather
than comparing against SK_INITIAL.
(store::get_baseline_contents): New.
(store::get_implicit_contents): New.
(store::on_maybe_live_values): Drop store_manager. Add
baseline_state.
(store::bits_live_p): New.
(store::fill_region): Delete.
(store::zero_fill_region): Delete.
(store::clobber_region): Reimplement.
(store::purge_region): Reimplement.
(store::mark_region_as_unknown): Reimplement.
(store::purge_state_involving): Generalize from svalue
to symbolic::node.
(store::get_or_create_cluster): Drop store_manager param.
Add baseline_state param and use it to get the implicit contents
of the cluster and pass it to the binding_cluster ctor.
(store::can_merge_p): Drop store_manager param. Update for
changes to get_or_create_cluster and binding_cluster::can_merge_p.
(store::mark_as_escaped): Drop store_manager param. Add
baseline_state param and pass it to get_or_create_cluster.
(store::on_unknown_fncall): Drop store_manager param.
(store::mark_region_as_conjured): New.
(store::get_representative_path_vars): Use value_set rather
than svalue_set.
(store::remove_overlapping_bindings): Delete.
(struct region_finder): Delete.
(store::canonicalize): Convert to no-op.
(needs_loop_replay_fixup_p): Generalize from svalue to
symbolic::node.
(store::loop_replay_fixup): Add baseline_state. Port to new
implementation.
(store::replay_call_summary): Drop store_manager. Convert return
type to bool and support failure.
(store::replay_call_summary_cluster): Likewise. Port to new
implementation.
(store::replay_call_summary_bit_contents): New.
(selftest::assert_bit_range_from_mask_eq): Delete.
(ASSERT_BIT_RANGE_FROM_MASK_EQ): Delete.
(selftest::assert_no_bit_range_from_mask_eq): Delete.
(ASSERT_NO_BIT_RANGE_FROM_MASK): Delete.
(selftest::test_bit_range_from_mask): Delete.
(selftest::assert_overlap): Delete.
(selftest::assert_disjoint): Delete.
(ASSERT_OVERLAP): Delete.
(ASSERT_DISJOINT): Delete.
(selftest::test_binding_key_overlap): Delete.
(selftest::test_binding_map_ops): Delete.
(selftest::analyzer_store_cc_tests): Drop calls to deleted tests.
* store.h: Add includes of "analyzer/concrete-ranges.h",
"analyzer/symbolic-ranges.h", "analyzer/symbolic-bit-contents.h",
and "analyzer/symbolic-memory-ranges.h". Rewrite the introductory
comment.
(class uncertainty_t): Convert from svalue to symbolic::value_node
throughout.
(class binding_key): Delete.
(bit_range::from_mask): Delete.
(convert_from_bit_range): New.
(convert_to_bit_range): New.
(class concrete_binding): Delete.
(is_a_helper <const ana::concrete_binding *>::test): Delete.
(struct default_hash_traits<ana::concrete_binding>): Delete.
(class symbolic_binding): Delete.
(struct default_hash_traits<ana::symbolic_binding>): Delete.
(class concrete_binding_map): Delete.
(class binding_map): Delete.
(class binding_cluster): Flesh out leading comment.
(binding_cluster::const_iterator_t): Delete.
(binding_cluster::iterator_t): Delete.
(binding_cluster::binding_cluster): Drop store_manager, add
node_manager and bit_contents.
(binding_cluster::dump_to_pp): Delete.
(binding_cluster::dump): Drop param.
(binding_cluster::make_dump_widget): Update signature.
(binding_cluster::bind): Delete.
(binding_cluster::clobber_region): Delete.
(binding_cluster::purge_region): Delete.
(binding_cluster::fill_region): Delete.
(binding_cluster::zero_fill_region): Delete.
(binding_cluster::mark_region_as_unknown): Delete.
(binding_cluster::purge_state_involving): Update signature.
(binding_cluster::get_binding): Delete.
(binding_cluster::get_binding_recursive): Delete.
(binding_cluster::get_any_binding): Delete.
(binding_cluster::maybe_get_compound_binding): Delete.
(binding_cluster::remove_overlapping_bindings): Delete.
(binding_cluster::for_each_value): Update signature.
(binding_cluster::get_bits): New.
(binding_cluster::set_bits): New.
(binding_cluster::get_bit_contents): New.
(binding_cluster::set_bit_contents): New.
(binding_cluster::mark_as_untracked): New.
(binding_cluster::can_merge_p): Drop store_manager.
(binding_cluster::make_unknown_relative_to): Likewise. Add
baseline_state.
(binding_cluster::on_unknown_fncall): Drop store_manager.
(binding_cluster::mark_region_as_conjured): New.
(binding_cluster::on_asm): Drop store_manager.
(binding_cluster::redundant_p): Add store and baseline_state
params.
(binding_cluster::empty_p): Delete.
(binding_cluster::get_representative_path_vars): Update from
svalue_set to value_set.
(binding_cluster::maybe_get_simple_value): Delete.
(binding_cluster::begin): Delete.
(binding_cluster::end): Delete.
(binding_cluster::poison_any_pointers_to_descendents): New.
(binding_cluster::get_map): Delete.
(binding_cluster::bits_live_p): New.
(binding_cluster::get_any_value): Delete.
(binding_cluster::bind_compound_sval): Delete.
(binding_cluster::bind_key): Delete.
(binding_cluster::m_node_mgr): New field.
(binding_cluster::m_map): Replace with..
(binding_cluster::m_contents): ...this.
(store::store): Add node_mgr param.
(store::dump_to_pp): Delete.
(store::dump): Drop param.
(store::make_dump_widget): Update signature.
(store::get_any_binding): Delete.
(store::get_bits): New.
(store::get_bit_contents): New.
(store::set_value): Delete.
(store::clobber_region): Drop store_manager. Add baseline_state
and region_model_manager.
(store::purge_region): Drop store_manager.
(store::fill_region): Drop.
(store::zero_fill_region): Drop.
(store::void mark_region_as_unknown): Drop store_manager. Add
baseline_state. Drop maybe_live_values.
(store::set_bits): New.
(store::set_bit_contents_raw): New.
(store::purge_state_involving): Generalize to symbolic::node.
(store::get_or_create_cluster): Drop store manager. Add
baseline_state.
(store::can_merge_p): Drop store_manager.
(store::mark_as_escaped): Drop store_manager. Add baseline_state.
(store::on_unknown_fncall): Drop store_manager.
(store::mark_region_as_conjured): New.
(store::get_representative_path_vars): Use value_set.
(store::canonicalize): Drop store_manager.
(store::loop_replay_fixup): Add baseline_state.
(store::on_maybe_live_values): Drop store_manager. Add
baseline_state.
(store::replay_call_summary): Convert return type to bool.
(store::replay_call_summary_cluster): Likewise.
(store::replay_call_summary_bit_contents): New.
(store::bits_live_p): New.
(store::remove_overlapping_bindings): Delete.
(store::get_implicit_contents): New.
(store::get_baseline_contents): New.
(store::m_node_mgr): New field.
(store::m_called_unknown_fn): Update comment.
(class store_manager): Delete.
* string-scan.cc: New file.
* string-scan.h: New file.
* svalue.cc: Add includes of "diagnostics/markup.h" and
"analyzer/liveness-context.h".
(svalue::print_dump_widget_label): New.
(svalue::add_dump_widget_children): New.
(svalue::dump): Reimplement.
(svalue::to_json): Delete.
(svalue::make_json_obj): New.
(svalue::maybe_print_for_user): Handle SK_BIT_VECTOR.
(svalue::make_dump_widget): Delete in favor of
node::make_dump_widget.
(svalue::for_each_svalue): New.
(svalue::has_concrete_size_p): New.
(svalue::maybe_get_region): Replace with...
(svalue::maybe_get_symbolic_pointer): ...this.
(svalue::can_merge_p): Add early accept for equal svalues.
Port from region_svalue to symbolic::pointer.
(svalue::live_p): Drop.
(svalue::implicitly_live_p): Drop.
(cmp_csts_and_types): Make non-static.
(svalue::cmp_ptr): Reimplement in terms of ID comparison.
(class involvement_visitor): Reimplement in symbolic-nodes.cc.
(svalue::involves_p): Delete in favor of node::involves_p.
(svalue::extract_bit_range): Delete.
(svalue::maybe_fold_bits_within): Delete.
(svalue::maybe_get_deref_base_region): Port SK_REGION case
to SK_POINTER.
(svalue::maybe_get_type_from_typeinfo): Port to symbolic::pointer.
(svalue::conjured_p): New.
(svalue::derived_from_initial_value_p): New.
(region_svalue::key_t::operator<): Replace with...
(pointer_svalue::key_t::operator<): ...this.
(pointer_svalue::key_t::get_complexity): New.
(region_svalue::dump_to_pp): Replace with...
(pointer_svalue::dump_to_pp): ...this.
(region_svalue::print_dump_widget_label): Replace with...
(pointer_svalue::print_svalue_for_dump_widget_label): ...this.
(region_svalue::add_dump_widget_children): Replace with...
(pointer_svalue::add_dump_widget_children): ...this.
(region_svalue::accept): Replace with...
(pointer_svalue::accept): ...this.
(pointer_svalue::accept_node_visitor): New.
(pointer_svalue::to_json): New.
(region_svalue::implicitly_live_p): Replace with...
(pointer_svalue::implicitly_live_p): ...this.
(pointer_svalue::make_markup_node): New.
(region_svalue::eval_condition): Delete in favor of
symbolic::pointer::eval_condition.
(constant_svalue::print_dump_widget_label): Rename to...
(constant_svalue::print_svalue_for_dump_widget_label): ...this.
(constant_svalue::add_dump_widget_children): Delete.
(constant_svalue::accept_node_visitor): New.
(constant_svalue::to_json): New.
(constant_svalue::make_markup_node): New.
(constant_svalue::implicitly_live_p): Update signature.
(constant_svalue::maybe_fold_bits_within): Delete.
(unknown_svalue::print_dump_widget_label): Convert to...
(unknown_svalue::print_svalue_for_dump_widget_label): ...this.
(unknown_svalue::add_dump_widget_children): Delete.
(unknown_svalue::accept_node_visitor): New.
(unknown_svalue::make_markup_node): New.
(unknown_svalue::maybe_fold_bits_within): Delete.
(poisoned_svalue::print_dump_widget_label): Rename to...
(poisoned_svalue::print_svalue_for_dump_widget_label): ...this.
(poisoned_svalue::add_dump_widget_children): Update signature.
(poisoned_svalue::accept_node_visitor): New.
(poisoned_svalue::to_json): New.
(poisoned_svalue::make_markup_node): New.
(poisoned_svalue::maybe_fold_bits_within): Delete.
(initial_svalue::initial_svalue): Move here from svalue.h.
Add assertions that m_reg is non-null and a base region.
(initial_svalue::print_dump_widget_label): Convert to...
(initial_svalue::print_svalue_for_dump_widget_label): ...this.
(initial_svalue::add_dump_widget_children): Update signature.
Chain up to base class.
(initial_svalue::accept_node_visitor): New.
(initial_svalue::to_json): New.
(initial_svalue::implicitly_live_p): Update for signature change.
(unaryop_svalue::print_dump_widget_label): Convert to...
(unaryop_svalue::print_svalue_for_dump_widget_label): ...this.
(unaryop_svalue::add_dump_widget_children): Update signature.
Chain up to base class.
(unaryop_svalue::accept_node_visitor): New.
(unaryop_svalue::to_json): New.
(unaryop_svalue::make_markup_node): New.
(unaryop_svalue::implicitly_live_p): Update for signature change.
(unaryop_svalue::maybe_fold_bits_within): Delete.
(binop_svalue::print_dump_widget_label): Convert to...
(binop_svalue::print_svalue_for_dump_widget_label): ...this.
(binop_svalue::add_dump_widget_children): Update signature.
Chain up to base class.
(binop_svalue::accept_node_visitor): New.
(binop_svalue::to_json): New.
(binop_svalue::make_markup_node): New.
(binop_svalue::implicitly_live_p): Update for signature change.
(sub_svalue::key_t::operator<): Delete.
(sub_svalue::sub_svalue): Delete.
(sub_svalue::dump_to_pp): Delete.
(sub_svalue::print_dump_widget_label): Delete.
(sub_svalue::add_dump_widget_children): Delete.
(sub_svalue::accept): Delete.
(sub_svalue::implicitly_live_p): Delete.
(repeated_svalue::key_t::operator<): Delete.
(repeated_svalue::repeated_svalue): Delete.
(repeated_svalue::dump_to_pp): Delete.
(repeated_svalue::print_dump_widget_label): Delete.
(repeated_svalue::add_dump_widget_children): Delete.
(repeated_svalue::accept): Delete.
(repeated_svalue::all_zeroes_p): Delete.
(repeated_svalue::maybe_fold_bits_within): Delete.
(bits_within_svalue::key_t::operator<): Delete.
(bits_within_svalue::bits_within_svalue): Delete.
(bits_within_svalue::dump_to_pp): Delete.
(bits_within_svalue::print_dump_widget_label): Delete.
(bits_within_svalue::add_dump_widget_children): Delete.
(bits_within_svalue::maybe_fold_bits_within): Delete.
(bits_within_svalue::accept): Delete.
(bits_within_svalue::implicitly_live_p): Delete.
(svalue_from_bit_vector::key_t::operator<): New.
(svalue_from_bit_vector::svalue_from_bit_vector): New.
(svalue_from_bit_vector::dump_to_pp): New.
(svalue_from_bit_vector::print_svalue_for_dump_widget_label): New.
(svalue_from_bit_vector::add_dump_widget_children): New.
(svalue_from_bit_vector::accept_node_visitor): New.
(svalue_from_bit_vector::to_json): New.
(svalue_from_bit_vector::make_markup_node): New.
(svalue_from_bit_vector::accept): New.
(svalue_from_bit_vector::implicitly_live_p): New.
(svalue_from_bit_vector::all_zeroes_p): New.
(svalue_from_bit_vector::maybe_get_value_range_1): New.
(svalue_from_bit_vector::conjured_p): New.
(widening_svalue::print_dump_widget_label): Rename to...
(widening_svalue::print_svalue_for_dump_widget_label): ...this.
(widening_svalue::add_dump_widget_children): Update for signature
change. Chain up to svalue implementation.
(widening_svalue::accept_node_visitor): New.
(widening_svalue::to_json): New.
(widening_svalue::make_markup_node): New.
(placeholder_svalue::print_dump_widget_label): Rename to...
(placeholder_svalue::print_svalue_for_dump_widget_label): ...this.
(placeholder_svalue::add_dump_widget_children): Delete.
(placeholder_svalue::accept_node_visitor): New.
(placeholder_svalue::to_json): New.
(placeholder_svalue::make_markup_node): New.
(unmergeable_svalue::print_dump_widget_label): Rename to...
(unmergeable_svalue::print_svalue_for_dump_widget_label): ...this.
(unmergeable_svalue::add_dump_widget_children): Update for
signature change Chain up to svalue implementation.
(unmergeable_svalue::implicitly_live_p): Update for signature
change.
(unmergeable_svalue::accept_node_visitor): New.
(unmergeable_svalue::to_json): New.
(unmergeable_svalue::make_markup_node): New.
(compound_svalue::key_t::operator<): Delete.
(compound_svalue::compound_svalue): Delete.
(compound_svalue::dump_to_pp): Delete.
(compound_svalue::print_dump_widget_label): Delete.
(compound_svalue::add_dump_widget_children): Delete.
(compound_svalue::accept): Delete.
(compound_svalue::maybe_fold_bits_within): Delete.
(conjured_svalue::key_t::operator<): Delete.
(conjured_svalue::dump_to_pp): Delete.
(conjured_svalue::print_dump_widget_label): Delete.
(conjured_svalue::add_dump_widget_children): Delete.
(conjured_svalue::accept): Delete.
(conjured_svalue::lhs_value_p): Delete.
(asm_output_svalue::print_dump_widget_label): Rename to...
(asm_output_svalue::print_svalue_for_dump_widget_label): ...this.
(asm_output_svalue::add_dump_widget_children): Update for
signature change. Chain up to svalue implementation.
(asm_output_svalue::accept_node_visitor): New.
(asm_output_svalue::to_json): New.
(make_markup_node): New.
(const_fn_result_svalue::dump_to_pp): Likewise.
(const_fn_result_svalue::print_dump_widget_label): Rename to...
(const_fn_result_svalue::print_svalue_for_dump_widget_label):
...this.
(const_fn_result_svalue::add_dump_widget_children): Update for
signature change. Chain up to svalue implementation.
(const_fn_result_svalue::accept_node_visitor): New.
(const_fn_result_svalue::to_json): New.
(const_fn_result_svalue::make_markup_node): New.
* svalue.h: Drop include of "text-art/widget.h". Add include of
"analyzer/symbolic-pointers.h. Drop
"using text_art::dump_widget_info;"
(enum svalue_kind): Replace SK_REGION with SK_POINTER.
Drop SK_SUB, SK_REPEATED, SK_BITS_WITHIN, SK_COMPOUND, and
SK_CONJURED. Add SK_BIT_VECTOR.
(class svalue): Update leading comment to show changes to subclass
hierarchy. Inherit from symbolic::value_node rather than directly
from symbolic::node.
(svalue::dyn_cast_svalue): New.
(svalue::to_json): Delete in favor of node::to_json.
(svalue::make_dump_widget): Delete in favor of
node::make_dump_widget.
(svalue::print_dump_widget_label): New.
(svalue::print_svalue_for_dump_widget_label): New.
(svalue::add_dump_widget_children): New.
(svalue::get_any_dump_color): New vfunc implementation.
(svalue::dyn_cast_region_svalue): Delete in favor of...
(svalue::dyn_cast_pointer_svalue): ...this.
(svalue::dyn_cast_sub_svalue): Delete vfunc.
(svalue::dyn_cast_repeated_svalue): Delete vfunc.
(svalue::dyn_cast_bits_within_svalue): Delete vfunc.
(svalue::dyn_cast_compound_svalue): Delete vfunc.
(svalue::dyn_cast_conjured_svalue): Delete vfunc.
(svalue::dyn_cast_svalue_from_bit_vector): New vfunc.
(svalue::for_each_svalue): New decl.
(svalue::has_concrete_size_p): New decl.
(svalue::maybe_get_region): Replace with...
(svalue::maybe_get_symbolic_pointer): ...this.
(svalue::live_p): Drop.
(svalue::implicitly_live_p): New.
(svalue::involves_p): Drop in favor of node::involves_p.
(svalue::extract_bit_range): Drop.
(svalue::maybe_fold_bits_within): Drop.
(svalue::conjured_p): New vfunc decl.
(svalue::derived_from_initial_value_p): New decl.
(svalue::svalue): Update for inheriting from value_node.
(svalue::make_json_obj): New decl.
(svalue::print_dump_widget_label): Drop in favor of
node::print_dump_widget_label.
(svalue::add_dump_widget_children): Drop in favor of
node::add_dump_widget_children.
(class region_svalue): Replace with...
(class pointer_svalue): ...this.
(is_a_helper <const region_svalue *>::test): Replace with...
(is_a_helper <const pointer_svalue *>::test): ...this.
(constant_svalue::key_t): Fix copy&paste error in leading comment.
(constant_svalue::print_dump_widget_label): Rename to...
(constant_svalue::print_svalue_for_dump_widget_label): ...this.
(constant_svalue::add_dump_widget_children): Update signature.
(constant_svalue::accept_node_visitor): New decl.
(constant_svalue::to_json): New decl.
(constant_svalue::make_markup_node): New decl.
(constant_svalue::implicitly_live_p): Update signature.
(constant_svalue::maybe_fold_bits_within): Delete.
(unknown_svalue::print_dump_widget_label): Rename to...
(unknown_svalue::print_svalue_for_dump_widget_label): ...this.
(unknown_svalue::add_dump_widget_children): Update signature.
(unknown_svalue::accept_node_visitor): New decl.
(unknown_svalue::to_json): New decl.
(unknown_svalue::make_markup_node): New decl.
(unknown_svalue::maybe_fold_bits_within): Delete.
(enum class poison_kind): Move to common.h.
(poison_kind_to_str): Likewise.
(poisoned_svalue::print_dump_widget_label): Rename to...
(poisoned_svalue::print_svalue_for_dump_widget_label): ...this.
(poisoned_svalue::add_dump_widget_children): Update signature.
(poisoned_svalue::accept_node_visitor): New decl.
(poisoned_svalue::to_json): New decl.
(poisoned_svalue::make_markup_node): New decl.
(poisoned_svalue::maybe_fold_bits_within): Delete.
(setjmp_svalue::print_dump_widget_label): Rename to...
(setjmp_svalue::print_svalue_for_dump_widget_label): ...this.
(setjmp_svalue::add_dump_widget_children): Update signature.
(setjmp_svalue::accept_node_visitor): New decl.
(setjmp_svalue::to_json): New decl.
(setjmp_svalue::make_markup_node): New decl.
(class initial_svalue): Flesh out leading comment.
(initial_svalue::initial_svalue): Move ctor implementation to
svalue.cc.
(initial_svalue::print_dump_widget_label): Rename to...
(initial_svalue::print_svalue_for_dump_widget_label): ...this.
(initial_svalue::add_dump_widget_children): Update signature.
(initial_svalue::accept_node_visitor): New decl.
(initial_svalue::to_json): New decl.
(initial_svalue::make_markup_node): New decl.
(initial_svalue::implicitly_live_p): Update signature.
(class unaryop_svalue): Flesh out leading comment.
(unaryop_svalue::print_dump_widget_label): Rename to...
(unaryop_svalue::print_svalue_for_dump_widget_label): ...this.
(unaryop_svalue::add_dump_widget_children): Update signature.
(unaryop_svalue::accept_node_visitor): New decl.
(unaryop_svalue::to_json): New decl.
(unaryop_svalue::make_markup_node): New decl.
(unaryop_svalue::implicitly_live_p): Update signature.
(unaryop_svalue::maybe_fold_bits_within): Delete.
(class binop_svalue): Flesh out leading comment.
(binop_svalue::print_dump_widget_label): Rename to...
(binop_svalue::print_svalue_for_dump_widget_label): ...this.
(binop_svalue::add_dump_widget_children): Update signature.
(binop_svalue::accept_node_visitor): New decl.
(binop_svalue::to_json): New decl.
(binop_svalue::make_markup_node): New decl.
(binop_svalue::implicitly_live_p): Update signature.
(class sub_svalue): Delete.
(is_a_helper <const sub_svalue *>::test): Delete.
(class repeated_svalue): Delete.
(is_a_helper <const repeated_svalue *>::test): Delete.
(class bits_within_svalue): Delete.
(is_a_helper <const bits_within_svalue *>::test): Delete.
(class svalue_from_bit_vector): New.
(is_a_helper <const svalue_from_bit_vector *>::test): New.
(class unmergeable_svalue): Flesh out leading comment.
(unmergeable_svalue::print_dump_widget_label): Rename to...
(unmergeable_svalue::print_svalue_for_dump_widget_label): ...this.
(unmergeable_svalue::add_dump_widget_children): Update signature.
(unmergeable_svalue::accept_node_visitor): New decl.
(unmergeable_svalue::to_json): New decl.
(unmergeable_svalue::make_markup_node): New decl.
(unmergeable_svalue::implicitly_live_p): Update signature.
(placeholder_svalue::print_dump_widget_label): Rename to...
(placeholder_svalue::print_svalue_for_dump_widget_label): ...this.
(placeholder_svalue::add_dump_widget_children): Update signature.
(placeholder_svalue::accept_node_visitor): New decl.
(placeholder_svalue::to_json): New decl.
(placeholder_svalue::make_markup_node): New decl.
(class widening_svalue): Flesh out leading comment.
(widening_svalue::print_dump_widget_label): Rename to...
(widening_svalue::print_svalue_for_dump_widget_label): ...this.
(widening_svalue::add_dump_widget_children): Update signature.
(widening_svalue::accept_node_visitor): New decl.
(widening_svalue::to_json): New decl.
(widening_svalue::make_markup_node): New decl.
(class compound_svalue): Delete.
(is_a_helper <const compound_svalue *>::test): Delete.
(class conjured_purge): Move to symbolic-nodes.h.
(class conjured_svalue): Delete.
(is_a_helper <const conjured_svalue *>::test): Delete.
(class asm_output_svalue): Flesh out leading comment.
(asm_output_svalue::print_dump_widget_label): Rename to...
(asm_output_svalue::print_svalue_for_dump_widget_label): ...this.
(asm_output_svalue::add_dump_widget_children): Update signature.
(asm_output_svalue::accept_node_visitor): New decl.
(asm_output_svalue::to_json): New decl.
(asm_output_svalue::make_markup_node): New decl.
(const_fn_result_svalue::print_dump_widget_label): Rename to...
(const_fn_result_svalue::print_svalue_for_dump_widget_label): ...this.
(const_fn_result_svalue::add_dump_widget_children): Update signature.
(const_fn_result_svalue::accept_node_visitor): New decl.
(const_fn_result_svalue::to_json): New decl.
(const_fn_result_svalue::make_markup_node): New decl.
* symbolic-bit-contents.cc: New file.
* symbolic-bit-contents.h: New file.
* symbolic-bit-vectors.cc: New file.
* symbolic-bit-vectors.h: New file.
* symbolic-memory-offsets.h: New file.
* symbolic-memory-ranges.cc: New file.
* symbolic-memory-ranges.h: New file.
* symbolic-nodes.cc: Include "selftest.h", "diagnostics/markup.h",
"analyzer/symbolic-scalars.h", "analyzer/symbolic-bit-vectors.h",
and "analyzer/analyzer-selftests.h".
(symbolic::node::cmp_ids): Cast to int rarther than long.
(symbolic::node::cmp_ptr_ptr): New.
(symbolic::node::dump_to_pp): New.
(symbolic::node::dump): New.
(symbolic::node::dump_to_logger): New.
(symbolic::node::make_dump_widget): New.
(symbolic::node::make_json_obj): New.
(symbolic::node::start_any_dump_color): New.
(symbolic::node::end_any_dump_color): New.
(symbolic::node::get_text_art_tree_style): New.
(symbolic::node::involves_p): New.
(symbolic::value_node::implicitly_live_p): New.
(symbolic::pp_element_for_node::add_to_phase_2): New.
(symbolic::node_set<NodeClass>::contains): New.
(symbolic::node_set<NodeClass>::make_dump_widget): New.
(symbolic::node_set<NodeClass>::dump_to_pp): New.
(symbolic::node_set<NodeClass>::dump): New.
(symbolic::node_manager::node_manager): Create m_scalar_managers,
m_bit_contents_manager, and m_bit_vector_manager.
(symbolic::node_manager::log_stats): Add comment.
(symbolic::node_visitor::visit_bit_contents): New.
(symbolic::node_visitor::visit_bit_vector): New.
(symbolic::node_visitor::visit_region): New.
(symbolic::node_visitor::visit_scalar_unitless): New.
(symbolic::node_visitor::visit_scalar_bit): New.
(symbolic::node_visitor::visit_scalar_byte): New.
(symbolic::node_visitor::visit_svalue): New.
(symbolic::value_node_visitor::visit_bit_vector): New.
(symbolic::value_node_visitor::visit_svalue): New.
(selftest::assert_symbolic_node_dump_eq): New.
(selftest::assert_same_symbolic_node): New.
(selftest::assert_different_symbolic_node): New.
(selftest::assert_symbolic_node_markup_text_eq): New.
(selftest::test_node_visitor): New.
(selftest::analyzer_symbolic_nodes_cc_tests): New.
* symbolic-nodes.h: Include "pretty-print-markup.h",
"analyzer/analyzer-logging.h", "analyzer/units.h",
"analyzer/integer-with-unit.h", "text-art/tree-widget.h", and
"text-art/dump.h".
(node_manager::get_bit_contents_manager): New accessor.
(node_manager::get_bit_vector_manager): New accessor.
(node_manager::get_scalars): New accessor.
(node_manager::m_scalar_managers): New field.
(node_manager::m_bit_contents_manager): New field.
(node_manager::m_bit_vector_manager): New field.
(struct markup_context): New.
(class node): Expand leading comment. Delete copy/move
constructors/assignment operators.
(node::cmp): New.
(node::cmp_ptr_ptr): New decl.
(node::dump_to_pp): New decl.
(node::dump_to_logger): New decl.
(node::dump): New decl.
(node::make_dump_widget): New decl.
(node::get_any_dump_color): New vfunc decl.
(node::accept_node_visitor): New vfunc decl.
(node::to_json): New vfunc decl.
(node::make_markup_node): New vfunc decl.
(node::involves_p): New decl.
(node::start_any_dump_color): New decl.
(node::end_any_dump_color): New decl.
(node::get_text_art_tree_style): New decl.
(node::make_json_obj): New decl.
(node::print_dump_widget_label): New decl.
(node::add_dump_widget_children): New decl.
(struct CompareNodeIds): New.
(class pp_element_for_node): New.
(class node_set): New.
(node_set<NodeClass>::union_): New.
(node_set<NodeClass>::operator<): New.
(struct node_dump_state): New.
(dump_node_tree_to_pp): New.
(dump_node_tree_to_file): New.
(dump_node_tree_to_stderr): New.
(dump_node_tree_to_logger): New.
(value_set): New.
(class value_node): New.
(class node_visitor): New.
(class value_node_visitor): New.
(struct baseline_key): New.
(class conjured_purge): New.
(selftest::assert_symbolic_node_dump_eq): New decl.
(ASSERT_SYMBOLIC_NODE_DUMP_EQ): New.
(selftest::assert_same_symbolic_node): New.
(ASSERT_SAME_SYMBOLIC_NODE): New.
(ASSERT_SAME_SYMBOLIC_NODE_AT): New.
(selftest::assert_different_symbolic_node): New.
(ASSERT_DIFFERENT_SYMBOLIC_NODE): New.
(selftest::assert_symbolic_node_markup_text_eq): New.
(ASSERT_SYMBOLIC_NODE_MARKUP_TEXT_EQ): New.
* symbolic-pointers.cc: New file.
* symbolic-pointers.h: New file.
* symbolic-ranges.cc: New file, partly adapted from ranges.cc.
* symbolic-ranges.h: New file.
* symbolic-scalars.cc: New file.
* symbolic-scalars.h: New file.
* type.h: New file.
* varargs.cc: (get_va_copy_arg): Update leading comment to reflect
that this is just a pointer extracted from va_list, not the
va_list itself. Port to new implementation. Drop get_store_value
call in favor of get_rvalue. Unify some logic between the two
branches.
(get_stateful_arg): Add cast to ptr_type_node.
(kf_va_start::impl_call_pre): Use ptr_type_node. Port to new
implementation when marking region as unknown.
(kf_va_copy::impl_call_pre): Use ptr_type_node. Rename
"in_va_list" to "in_impl_ptr" as it's not necessarily a va_list.
Port from maybe_get_region to deref_rvalue.
(maybe_get_var_arg_region): Port from maybe_get_region to
deref_rvalue.
(maybe_get_var_arg_svalue): New.
(kf_va_arg::impl_call_pre): Port from maybe_get_region to
deref_rvalue, and use maybe_get_var_arg_svalue.
* write-to-const-diagnostics.cc: Rename "reg" to base_reg" throughout.
gcc/testsuite/ChangeLog:
* c-c++-common/analyzer/aliasing-6.c: New test.
* c-c++-common/analyzer/attr-const-3.c: Tweak depth param.
* c-c++-common/analyzer/call-summaries-malloc.c: Add xfails.
* c-c++-common/analyzer/call-summaries-pr107158-2.c: Drop xfails.
* c-c++-common/analyzer/call-summaries-pr107158.c: Likewise.
* c-c++-common/analyzer/capacity-1.c (test_4): Update expected
capacity message.
* c-c++-common/analyzer/compound-assignment-5.c: Drop comment.
* c-c++-common/analyzer/deref-before-check-3.c: New test.
* c-c++-common/analyzer/double-free-2.c: New test.
* c-c++-common/analyzer/flex-with-call-summaries.c: Drop xfail.
* c-c++-common/analyzer/flex-without-call-summaries.c: Update
expected results.
* c-c++-common/analyzer/infinite-loop-doom-d_main-IdentifyVersion.c:
Add dg-bogus for leak false positive seen whilst developing patch.
* c-c++-common/analyzer/large-constants.c: New test.
* c-c++-common/analyzer/leak-multiple-returns.c: New test.
* c-c++-common/analyzer/leak-pr108045-with-call-summaries.c: Drop
xfails.
* c-c++-common/analyzer/leak-pr126831.c: New test.
* c-c++-common/analyzer/leak-pr126832.c: New test.
* c-c++-common/analyzer/loop-0-up-to-n-by-1-with-iter-obj.c: Add
expected "UNKNOWN" in 2nd iteration.
* c-c++-common/analyzer/loop-2.c: Likewise. Update expected
constraint after loop.
* c-c++-common/analyzer/loop-2a.c: Likewise.
* c-c++-common/analyzer/maybe-live-1.c: New test.
* c-c++-common/analyzer/maybe-live-2.c: New test.
* c-c++-common/analyzer/null-compare.c: New test.
* c-c++-common/analyzer/null-terminated-strings-2.c: Drop xfails.
* c-c++-common/analyzer/out-of-bounds-bits.c: New test.
* c-c++-common/analyzer/out-of-bounds-diagram-11.c: Update
expected diagram to show simplication of
'(size * 16) - (size * 4)' to 'size * 12'.
(test_99): Add expected output now that new implementation is able
to create a diagram for this case.
* c-c++-common/analyzer/out-of-bounds-diagram-3.c: Update expected
diagram.
* c-c++-common/analyzer/out-of-bounds-diagram-pr110928.c: Update
comment and expected output. Fix missing "return".
* c-c++-common/analyzer/out-of-bounds-pr114472.c: Add expected
warnings from analyzer.
* c-c++-common/analyzer/paths-5.c: Tweak number of expected
exploded nodes.
* c-c++-common/analyzer/pointer-comparison-pr125304-eq.c
(test_pointer_eq): Drop xfails.
(test_string_literals): Likewise.
* c-c++-common/analyzer/pointer-comparison-pr125304-ge.c
(test_pointer_ge): Likewise.
* c-c++-common/analyzer/pointer-comparison-pr125304-gt.c
(test_pointer_gt): Likewise.
* c-c++-common/analyzer/pointer-comparison-pr125304-le.c
(test_pointer_le): Likewise.
* c-c++-common/analyzer/pointer-comparison-pr125304-lt.c
(test_pointer_lt): Likewise.
* c-c++-common/analyzer/strlen-pr113999.c: Include
"analyzer-decls.h" and use it to tighten up the expected results.
* c-c++-common/analyzer/strncpy-1.c (test_zero_fill): Remove
xfails.
* c-c++-common/analyzer/symbolic-1.c: Update comment referring to
store.h.
* c-c++-common/analyzer/symbolic-4.c: Update expected result.
* c-c++-common/analyzer/taint-inheritance.c: New test.
* c-c++-common/analyzer/uintptr-cast-double-free.c: New test.
* c-c++-common/analyzer/use-after-free-4.c: New test.
* c-c++-common/analyzer/use-after-free-5.c: New test.
* g++.dg/analyzer/fanalyzer-show-events-in-system-headers-default.C:
Update expected message.
* g++.dg/analyzer/fanalyzer-show-events-in-system-headers-no.C:
Likewise.
* g++.dg/analyzer/initializers-with-RANGE_EXPR.C: New test.
* g++.dg/analyzer/out-of-bounds-placement-new.C: Add expected
warning about allocation size.
* g++.dg/analyzer/pr100244.C: Add -fno-sized-deallocation.
* g++.dg/analyzer/std-unique_ptr-3.C: New test.
* g++.dg/analyzer/torture/std-string-ctor-large-literal.C
(test_ctor_large): Remove xfail.
* g++.dg/analyzer/torture/std-string-ctor-small-literal.C
(test_ctor_small): Likewise.
* gcc.dg/analyzer/analyzer-decls.h (__analyzer_hexdump): New decl.
* gcc.dg/analyzer/boxed-malloc-1.c: Tweak expected messages.
* gcc.dg/analyzer/call-summaries-2.c: Update expected messages to
reflect improved precision of analysis; remove and add xfails.
* gcc.dg/analyzer/data-model-1.c: Include <stdint.h>.
(union u): Convert "i" from "int" to "intptr_t".
* gcc.dg/analyzer/doom-d_main-IdentifyVersion.c: Add dg-bogus for
leak false positive seen whilst developing patch. Drop xfails.
* gcc.dg/analyzer/ice-pr113496.c: Add warning about uninitialized
return value.
* gcc.dg/analyzer/leak-expressions-1.c: New test.
* gcc.dg/analyzer/leak-pr126832-macro.c: New test.
* gcc.dg/analyzer/mkdtemp-1.c (test_errno): Split into...
(test_errno_possibly_aliased): ...this and...
(test_errno_not_aliased): ...this.
* gcc.dg/analyzer/null-deref-pr102671-1.c: Add
-Wno-analyzer-too-complex.
* gcc.dg/analyzer/null-terminated-strings-1.c: Update expected
results. Rewrite tests to avoid use of __analyzer_describe.
* gcc.dg/analyzer/out-of-bounds-diagram-1-debug.c: Update expected
diagram for changes in how byte ranges are displayed.
* gcc.dg/analyzer/out-of-bounds-diagram-16.c: Update expected
diagram to show where write is from.
* gcc.dg/analyzer/out-of-bounds-diagram-2.c: Update expected
diagram for changes to size allocation.
* gcc.dg/analyzer/out-of-bounds-diagram-9.c: Update expected
diagram.
* gcc.dg/analyzer/pattern-test-2.c: Update expected messages.
* gcc.dg/analyzer/pipe-1.c: Drop tests of __analyzer_describe.
* gcc.dg/analyzer/pipe2-1.c: Likewise.
* gcc.dg/analyzer/pr104417.c (warn_realloc_extern_ptrarr_offset):
Add expected -Wanalyzer-free-of-non-heap warning.
* gcc.dg/analyzer/pr104434-nonconst.c (exit_level_0:): Drop
xfails.
* gcc.dg/analyzer/pr93355-localealias.c (read_alias_file): Drop
xfail.
* gcc.dg/analyzer/pr93382.c: Drop xfail.
* gcc.dg/analyzer/single-field.c: Update expected result of
__analyzer_describe.
* gcc.dg/analyzer/state-diagram-2.c (test_pointer_to_global): Add
xfail.
* gcc.dg/analyzer/state-diagram-5-sarif.py: Update for changes in
JSON output.
* gcc.dg/analyzer/stdarg-1-ms_abi.c: Tweak expected messages.
* gcc.dg/analyzer/stdarg-1.c: Tweak expected messages for
target-specific differences in whether the message reports what
leaked.
* gcc.dg/analyzer/stdarg-2.c: Likewise.
* gcc.dg/analyzer/strcpy-3.c: Drop test of __analyzer_describe.
* gcc.dg/analyzer/strlen-1.c (call_strlen_6a): New.
(test_memcpy_without_termination): New.
(call_strlen_6b): New.
(test_memcpy_with_manual_termination): New.
* gcc.dg/analyzer/taint-read-offset-1.c: Update expected messages.
Add xfail about false positive.
* gcc.dg/analyzer/torture/loop-inc-ptr-2.c: Tweak expected number
of exploded nodes.
* gcc.dg/analyzer/torture/pr59037.c: Add comment and
-Wno-analyzer-use-of-uninitialized-value.
* gcc.dg/analyzer/unknown-fns-5.c: New test.
* gcc.dg/analyzer/unknown-fns-6.c: New test.
* gcc.dg/analyzer/vla-1.c (test_1): Mark test as xfailing.
(test_vla_ptr): New test.
* gcc.dg/plugin/infoleak-CVE-2011-1078-1.c: Add
-Wno-analyzer-use-of-uninitialized-value.
* gcc.dg/plugin/infoleak-uninit-size-1.c (test_uninit_size): Add
expected warning.
* gcc.dg/plugin/infoleak-vfio_iommu_type1.c: Remove xfail.
* gcc.dg/plugin/taint-pr112850-too-complex.c: Tweak depth param.
Signed-off-by: David Malcolm <dmalcolm@redhat.com>
176 files changed