From 030a8e58de381a6f64d10848050e4106b51ea305 Mon Sep 17 00:00:00 2001 From: David Malcolm Date: Fri, 5 Jun 2020 16:35:59 -0400 Subject: [PATCH 211/315] FIXME: folding of ops on 'unknown' --- gcc/analyzer/region-model2.cc | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/gcc/analyzer/region-model2.cc b/gcc/analyzer/region-model2.cc index a281d26c514..c394756c27c 100644 --- a/gcc/analyzer/region-model2.cc +++ b/gcc/analyzer/region-model2.cc @@ -2975,6 +2975,10 @@ const svalue2 * region_model2_manager::maybe_fold_unaryop (tree type, enum tree_code op, const svalue2 *arg) { + /* Ops on "unknown" are also unknown. */ + if (arg->get_kind () == svalue2::SK_UNKNOWN) + return get_or_create_unknown_svalue2 (type); + switch (op) { default: break; @@ -3131,6 +3135,15 @@ region_model2_manager::maybe_fold_binop (tree type, enum tree_code op, binop->get_arg1 (), arg1)); } + // TODO: +#if 0 + /* Ops on "unknown" are also unknown (unless we can use one of the + identities above). */ + if (arg0->get_kind () == svalue2::SK_UNKNOWN + || arg1->get_kind () == svalue2::SK_UNKNOWN) + return get_or_create_unknown_svalue2 (type); +#endif + // TODO return NULL; @@ -9437,16 +9450,15 @@ test_state_merging () /* Pointers: non-NULL ptrs to different globals: should be unknown. */ { region_model2 merged (&mgr); - /* x == &y vs x == &z in the input models. */ + /* x == &y vs x == &z in the input models; these are actually casts + of the ptrs to "int". */ const svalue2 *merged_x_sval; // TODO: -#if 0 assert_region_model2s_merge (x, addr_of_y, addr_of_z, &merged, &merged_x_sval); /* We should get x == unknown in the merged model. */ ASSERT_EQ (merged_x_sval->get_kind (), svalue2::SK_UNKNOWN); -#endif } /* Pointers: non-NULL and non-NULL: ptr to a heap region2. */ -- 2.26.2