@@ -827,6 +827,8 @@ exploded_node::dump_dot (graphviz_out *gv, const dump_args_t &args) const
pp_write_text_to_stream (pp);
pp_printf (pp, "EN: %i", m_index);
+ if (m_status == STATUS_MERGER)
+ pp_string (pp, " (merger)");
pp_newline (pp);
format f (true);
@@ -1638,6 +1640,7 @@ worklist::peek_next ()
void
worklist::add_node (exploded_node *enode)
{
+ gcc_assert (enode->get_status () == exploded_node::STATUS_WORKLIST);
m_queue.insert (key_t (*this, enode), enode);
}
@@ -2124,6 +2127,7 @@ exploded_graph::process_worklist ()
while (m_worklist.length () > 0)
{
exploded_node *node = m_worklist.take_next ();
+ gcc_assert (node->get_status () == exploded_node::STATUS_WORKLIST);
gcc_assert (node->m_succs.length () == 0
|| node == m_origin);
@@ -2136,6 +2140,8 @@ exploded_graph::process_worklist ()
if (flag_analyzer_state_merge && node != m_origin)
if (exploded_node *node_2 = m_worklist.peek_next ())
{
+ gcc_assert (node_2->get_status ()
+ == exploded_node::STATUS_WORKLIST);
gcc_assert (node->m_succs.length () == 0);
gcc_assert (node_2->m_succs.length () == 0);
@@ -2181,6 +2187,7 @@ exploded_graph::process_worklist ()
/* Remove node_2 from the worklist. */
m_worklist.take_next ();
+ node_2->set_status (exploded_node::STATUS_MERGER);
/* Continue processing "node" below. */
}
@@ -2190,6 +2197,7 @@ exploded_graph::process_worklist ()
in the worklist, to be processed on the next
iteration. */
add_edge (node, node_2, NULL, change);
+ node->set_status (exploded_node::STATUS_MERGER);
continue;
}
else
@@ -2232,12 +2240,18 @@ exploded_graph::process_worklist ()
if (merged_enode == node)
m_worklist.add_node (merged_enode);
else
- add_edge (node, merged_enode, NULL, change);
+ {
+ add_edge (node, merged_enode, NULL, change);
+ node->set_status (exploded_node::STATUS_MERGER);
+ }
if (merged_enode == node_2)
m_worklist.add_node (merged_enode);
else
- add_edge (node_2, merged_enode, NULL, change);
+ {
+ add_edge (node_2, merged_enode, NULL, change);
+ node_2->set_status (exploded_node::STATUS_MERGER);
+ }
continue;
}
@@ -2320,6 +2334,8 @@ exploded_graph::process_node (exploded_node *node)
logger * const logger = get_logger ();
LOG_FUNC_1 (logger, "EN: %i", node->m_index);
+ node->set_status (exploded_node::STATUS_PROCESSED);
+
const program_point &point = node->get_point ();
/* Update cfun and input_location in case of an ICE: make it easier to
@@ -3180,8 +3196,16 @@ exploded_graph::dump_exploded_nodes () const
}
/* Emit a warning at any call to "__analyzer_dump_exploded_nodes",
- giving the number of exploded nodes for "before-stmt", and their
- IDs. */
+ giving the number of processed exploded nodes for "before-stmt",
+ and the IDs of processed and merger enodes.
+
+ We highlight the count of *processed* enodes since this is of most
+ interest in DejaGnu tests for ensuring that state merger has
+ happened.
+
+ We don't show the count of merger enodes, as this is more of an
+ implementation detail of the merging that we don't want to bake
+ into our expected DejaGnu messages. */
unsigned i;
exploded_node *enode;
@@ -3199,25 +3223,43 @@ exploded_graph::dump_exploded_nodes () const
if (seen.contains (stmt))
continue;
+ auto_vec<exploded_node *> processed_enodes;
+ auto_vec<exploded_node *> merger_enodes;
/* This is O(N^2). */
unsigned j;
- auto_vec<exploded_node *> enodes;
exploded_node *other_enode;
FOR_EACH_VEC_ELT (m_nodes, j, other_enode)
{
if (other_enode->get_point ().get_kind () != PK_BEFORE_STMT)
continue;
if (other_enode->get_stmt () == stmt)
- enodes.safe_push (other_enode);
+ switch (other_enode->get_status ())
+ {
+ default:
+ gcc_unreachable ();
+ case exploded_node::STATUS_PROCESSED:
+ processed_enodes.safe_push (other_enode);
+ break;
+ case exploded_node::STATUS_MERGER:
+ merger_enodes.safe_push (other_enode);
+ break;
+ }
}
pretty_printer pp;
- print_enode_indices (&pp, enodes);
+ pp_character (&pp, '[');
+ print_enode_indices (&pp, processed_enodes);
+ if (merger_enodes.length () > 0)
+ {
+ pp_string (&pp, "] merger(s): [");
+ print_enode_indices (&pp, merger_enodes);
+ }
+ pp_character (&pp, ']');
- warning_n (stmt->location, 0, enodes.length (),
- "%i exploded node: %s",
- "%i exploded nodes: %s",
- enodes.length (), pp_formatted_text (&pp));
+ warning_n (stmt->location, 0, processed_enodes.length (),
+ "%i processed enode: %s",
+ "%i processed enodes: %s",
+ processed_enodes.length (), pp_formatted_text (&pp));
seen.add (stmt);
/* If the argument is non-zero, then print all of the states
@@ -3233,10 +3275,11 @@ exploded_graph::dump_exploded_nodes () const
if (i_arg)
{
exploded_node *other_enode;
- FOR_EACH_VEC_ELT (enodes, j, other_enode)
+ FOR_EACH_VEC_ELT (processed_enodes, j, other_enode)
{
fprintf (stderr, "%i of %i: EN %i:\n",
- j + 1, enodes.length (), other_enode->m_index);
+ j + 1, processed_enodes.length (),
+ other_enode->m_index);
other_enode->dump_succs_and_preds (stderr);
/* Dump state. */
other_enode->get_state ().dump (m_ext_state, false);
@@ -151,9 +151,26 @@ struct eg_traits
class exploded_node : public dnode<eg_traits>
{
public:
+ /* Has this enode had exploded_graph::process_node called on it?
+ This allows us to distinguish enodes that were merged during
+ worklist-handling, and thus never had process_node called on them
+ (in favor of processing the merged node). */
+ enum status
+ {
+ /* Node is in the worklist. */
+ STATUS_WORKLIST,
+
+ /* Node has had exploded_graph::process_node called on it. */
+ STATUS_PROCESSED,
+
+ /* Node was left unprocessed due to merger; it won't have had
+ exploded_graph::process_node called on it. */
+ STATUS_MERGER
+ };
+
exploded_node (point_and_state ps,
int index)
- : m_ps (ps), m_index (index)
+ : m_ps (ps), m_status (STATUS_WORKLIST), m_index (index)
{
gcc_checking_assert (ps.get_state ().m_region_model->canonicalized_p ());
}
@@ -240,6 +257,13 @@ class exploded_node : public dnode<eg_traits>
void dump_succs_and_preds (FILE *outf) const;
+ enum status get_status () const { return m_status; }
+ void set_status (enum status status)
+ {
+ gcc_assert (m_status == STATUS_WORKLIST);
+ m_status = status;
+ }
+
private:
DISABLE_COPY_AND_ASSIGN (exploded_node);
@@ -249,6 +273,8 @@ private:
is immutable once the exploded_node has been created. */
const point_and_state m_ps;
+ enum status m_status;
+
public:
/* The index of this exploded_node. */
const int m_index;
@@ -469,20 +469,28 @@ __analyzer_dump_path ();
will emit a placeholder ``note'' diagnostic with a path to that call site,
if the analyzer finds a feasible path to it.
-The builtin @code{__analyzer_dump_exploded_nodes} will dump information
-after analysis on all of the exploded nodes at that program point:
+The builtin @code{__analyzer_dump_exploded_nodes} will emit a warning
+after analysis containing information on all of the exploded nodes at that
+program point:
@smallexample
__analyzer_dump_exploded_nodes (0);
@end smallexample
-will dump just the number of nodes, and their IDs.
+will output the number of ``processed'' nodes, and the IDs of
+both ``processed'' and ``merger'' nodes, such as:
+
+@smallexample
+warning: 2 processed enodes: [EN: 56, EN: 58] merger(s): [EN: 54-55, EN: 57, EN: 59]
+@end smallexample
+
+With a non-zero argument
@smallexample
__analyzer_dump_exploded_nodes (1);
@end smallexample
-will also dump all of the states within those nodes.
+it will also dump all of the states within the ``processed'' nodes.
@smallexample
__analyzer_dump_region_model ();
@@ -895,8 +895,7 @@ int test_40 (int flag)
i = 17;
/* With state-merging, we lose the relationship between 'flag' and 'i'. */
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 exploded nodes" } */
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 exploded node" } */
+ __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 processed enode" } */
if (flag)
__analyzer_eval (i == 43); /* { dg-warning "UNKNOWN" } */
@@ -10,8 +10,7 @@ int test_40 (int flag)
i = 17;
/* Without state-merging, we retain the relationship between 'flag' and 'i'. */
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 exploded nodes" } */
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 exploded nodes" } */
+ __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 processed enodes" } */
if (flag)
__analyzer_eval (i == 43); /* { dg-warning "TRUE" } */
@@ -10,14 +10,14 @@ void test(void)
{
struct s s;
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 exploded node" } */
+ __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 processed enode" } */
for (s.i=0; s.i<256; s.i++) {
__analyzer_eval (s.i < 256); /* { dg-warning "TRUE" } */
/* (should report TRUE twice). */
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 exploded nodes" } */
+ __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 processed enodes" } */
//__analyzer_eval (s.i == 0); /* { d-todo-g-warning "UNKNOWN" "" { xfail *-*-* } } */
/* { d-todo-g-warning "TRUE" "" { target *-*-* } .-1 } */
@@ -33,5 +33,5 @@ void test(void)
/* { dg-warning "UNKNOWN" "status quo" { target *-*-* } .-1 } */
/* TODO(xfail^^^): ideally it should figure out i == 256 at exit. */
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 exploded node" } */
+ __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 processed enode" } */
}
@@ -10,7 +10,7 @@ void test(void)
{
union u u;
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 exploded node" } */
+ __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 processed enode" } */
for (u.i=0; u.i<256; u.i++) {
@@ -19,7 +19,7 @@ void test(void)
/* { dg-bogus "UNKNOWN" "status quo" { xfail *-*-* } .-2 } */
/* (should report TRUE twice). */
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 exploded nodes" } */
+ __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 processed enodes" } */
//__analyzer_eval (u.i == 0); /* { d-todo-g-warning "UNKNOWN" "" { xfail *-*-* } } */
/* { d-todo-g-warning "TRUE" "" { target *-*-* } .-1 } */
@@ -36,5 +36,5 @@ void test(void)
/* { dg-warning "UNKNOWN" "status quo" { target *-*-* } .-1 } */
/* TODO(xfail^^^): ideally it should figure out i == 256 at exit. */
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 exploded node" } */
+ __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 processed enode" } */
}
@@ -9,7 +9,7 @@ void test(void)
{
int i, j, k;
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 exploded node" } */
+ __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 processed enode" } */
for (i=0; i<256; i++) {
@@ -25,7 +25,7 @@ void test(void)
__analyzer_eval (j < 256); /* { dg-warning "TRUE" } */
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "3 exploded nodes" } */
+ __analyzer_dump_exploded_nodes (0); /* { dg-warning "3 processed enodes" } */
for (k=0; k<256; k++) {
@@ -34,10 +34,10 @@ void test(void)
__analyzer_eval (k < 256); /* { dg-warning "TRUE" } */
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "4 exploded nodes" } */
+ __analyzer_dump_exploded_nodes (0); /* { dg-warning "4 processed enodes" } */
}
}
}
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 exploded node" } */
+ __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 processed enode" } */
}
@@ -6,7 +6,7 @@ void test(void)
{
int i;
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 exploded node" } */
+ __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 processed enode" } */
for (i=0; i<256; i++) {
__analyzer_eval (i < 256); /* { dg-warning "TRUE" } */
@@ -22,7 +22,7 @@ void test(void)
/* { dg-warning "UNKNOWN" "status quo" { target *-*-* } .-2 } */
/* TODO(xfail^^^): ideally we ought to figure out i >= 0 for all iterations. */
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 exploded nodes" } */
+ __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 processed enodes" } */
}
__analyzer_eval (i >= 256); /* { dg-warning "TRUE" } */
@@ -31,5 +31,5 @@ void test(void)
/* { dg-warning "UNKNOWN" "status quo" { target *-*-* } .-1 } */
/* TODO(xfail^^^): it only figures out i >= 256, rather than i == 256. */
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 exploded node" } */
+ __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 processed enode" } */
}
@@ -10,8 +10,7 @@ int test (int flag)
other_flag = 0;
/* With state-merging, we lose the relationship between 'flag' and 'other_flag'. */
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 exploded nodes" } */
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 exploded node" } */
+ __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 processed enode" } */
if (other_flag)
__analyzer_eval (flag); /* { dg-warning "UNKNOWN" } */
@@ -44,14 +44,13 @@ int test_repeated_predicate_1 (int n)
else
ptr = buf;
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 exploded nodes" } */
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 exploded nodes" } */
+ __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 processed enodes" } */
result = do_stuff (ptr, n);
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "3 exploded nodes" } */
+ __analyzer_dump_exploded_nodes (0); /* { dg-warning "3 processed enodes" } */
// FIXME: why 3 here?
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "3 exploded nodes" } */
+ __analyzer_dump_exploded_nodes (0); /* { dg-warning "3 processed enodes" } */
// FIXME: why 3 here?
if (n > 10)
@@ -73,11 +72,11 @@ int test_repeated_predicate_2 (int n)
else
ptr = buf;
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 exploded nodes" } */
+ __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 processed enodes" } */
result = do_stuff_2 (ptr, n);
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 exploded nodes" } */
+ __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 processed enodes" } */
if (n > 10)
free (ptr); /* { dg-bogus "not on the heap" } */
@@ -102,11 +101,11 @@ int test_explicit_flag (int n)
else
ptr = buf;
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 exploded nodes" } */
+ __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 processed enodes" } */
result = do_stuff (ptr, n);
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "3 exploded nodes" } */
+ __analyzer_dump_exploded_nodes (0); /* { dg-warning "3 processed enodes" } */
// FIXME: why 3 here?
if (need_to_free)
@@ -128,11 +127,11 @@ int test_pointer_comparison (int n)
else
ptr = buf;
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 exploded nodes" } */
+ __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 processed enodes" } */
result = do_stuff (ptr, n);
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "3 exploded nodes" } */
+ __analyzer_dump_exploded_nodes (0); /* { dg-warning "3 processed enodes" } */
// FIXME: why 3 here?
if (ptr != buf)
@@ -159,19 +158,18 @@ int test_initial_flag (int n)
/* Due to state-merging, we lose the relationship between 'n > 10'
and 'on_heap' here; we have to rely on feasibility-checking
in the diagnostic_manager to reject the false warnings. */
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 exploded nodes" } */
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 exploded node" } */
+ __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 processed enode" } */
if (on_heap)
ptr = (int *)malloc (sizeof (int) * n);
else
ptr = buf;
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 exploded nodes" } */
+ __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 processed enodes" } */
result = do_stuff (ptr, n);
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "5 exploded nodes" } */
+ __analyzer_dump_exploded_nodes (0); /* { dg-warning "5 processed enodes" } */
// FIXME: why 5 here?
if (n > 10)
@@ -44,13 +44,11 @@ int test_repeated_predicate_1 (int n)
else
ptr = buf;
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 exploded nodes" } */
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 exploded nodes" } */
+ __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 processed enodes" } */
result = do_stuff (ptr, n);
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 exploded nodes" } */
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 exploded nodes" } */
+ __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 processed enodes" } */
if (n > 10)
free (ptr); /* { dg-bogus "not on the heap" } */
@@ -71,11 +69,11 @@ int test_repeated_predicate_2 (int n)
else
ptr = buf;
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 exploded nodes" } */
+ __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 processed enodes" } */
result = do_stuff_2 (ptr, n);
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 exploded nodes" } */
+ __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 processed enodes" } */
if (n > 10)
free (ptr); /* { dg-bogus "not on the heap" } */
@@ -100,11 +98,11 @@ int test_explicit_flag (int n)
else
ptr = buf;
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 exploded nodes" } */
+ __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 processed enodes" } */
result = do_stuff (ptr, n);
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 exploded nodes" } */
+ __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 processed enodes" } */
if (need_to_free)
free (ptr); /* { dg-bogus "not on the heap" } */
@@ -125,11 +123,11 @@ int test_pointer_comparison (int n)
else
ptr = buf;
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 exploded nodes" } */
+ __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 processed enodes" } */
result = do_stuff (ptr, n);
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 exploded nodes" } */
+ __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 processed enodes" } */
if (ptr != buf)
free (ptr); /* { dg-bogus "not on the heap" } */
@@ -155,19 +153,18 @@ int test_initial_flag (int n)
/* Due to state-merging, we lose the relationship between 'n > 10'
and 'on_heap' here; we have to rely on feasibility-checking
in the diagnostic_manager to reject the false warnings. */
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 exploded nodes" } */
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 exploded node" } */
+ __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 processed enode" } */
if (on_heap)
ptr = (int *)malloc (sizeof (int) * n);
else
ptr = buf;
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 exploded nodes" } */
+ __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 processed enodes" } */
result = do_stuff (ptr, n);
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 exploded nodes" } */
+ __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 processed enodes" } */
if (n > 10)
free (ptr); /* { dg-bogus "not on the heap" } */
@@ -24,8 +24,7 @@ int test_repeated_predicate_1 (int n)
else
ptr = buf;
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 exploded nodes" } */
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 exploded nodes" } */
+ __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 processed enodes" } */
{
int *p = ptr;
@@ -38,8 +37,7 @@ int test_repeated_predicate_1 (int n)
result = sum;
}
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "3 exploded nodes" } */
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "3 exploded nodes" } */
+ __analyzer_dump_exploded_nodes (0); /* { dg-warning "3 processed enodes" } */
if (n > 10)
free (ptr); /* { dg-bogus "not on the heap" } */
@@ -60,8 +58,7 @@ int test_repeated_predicate_1a (int n)
else
ptr = buf;
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 exploded nodes" } */
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 exploded nodes" } */
+ __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 processed enodes" } */
{
int *p = ptr;
@@ -72,8 +69,7 @@ int test_repeated_predicate_1a (int n)
result = sum;
}
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "3 exploded nodes" } */
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "3 exploded nodes" } */
+ __analyzer_dump_exploded_nodes (0); /* { dg-warning "3 processed enodes" } */
if (n > 10)
free (ptr); /* { dg-bogus "not on the heap" } */
@@ -94,11 +90,11 @@ int test_repeated_predicate_2 (int n)
else
ptr = buf;
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 exploded nodes" } */
+ __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 processed enodes" } */
result = do_stuff_2 (ptr, n);
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 exploded nodes" } */
+ __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 processed enodes" } */
if (n > 10)
free (ptr); /* { dg-bogus "not on the heap" } */
@@ -123,7 +119,7 @@ int test_explicit_flag (int n)
else
ptr = buf;
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 exploded nodes" } */
+ __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 processed enodes" } */
{
int *p = ptr;
@@ -136,7 +132,7 @@ int test_explicit_flag (int n)
result = sum;
}
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "3 exploded nodes" } */
+ __analyzer_dump_exploded_nodes (0); /* { dg-warning "3 processed enodes" } */
if (need_to_free)
free (ptr); /* { dg-bogus "not on the heap" } */
@@ -157,7 +153,7 @@ int test_pointer_comparison (int n)
else
ptr = buf;
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 exploded nodes" } */
+ __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 processed enodes" } */
{
int *p = ptr;
@@ -170,7 +166,7 @@ int test_pointer_comparison (int n)
result = sum;
}
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "3 exploded nodes" } */
+ __analyzer_dump_exploded_nodes (0); /* { dg-warning "3 processed enodes" } */
if (ptr != buf)
free (ptr); /* { dg-bogus "not on the heap" } */
@@ -23,8 +23,7 @@ int test_1 (int n)
else
ptr = buf;
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 exploded nodes" } */
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 exploded nodes" } */
+ __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 processed enodes" } */
{
int *p = ptr;
@@ -37,7 +36,7 @@ int test_1 (int n)
result = sum;
}
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "3 exploded nodes" } */
+ __analyzer_dump_exploded_nodes (0); /* { dg-warning "3 processed enodes" } */
return result; /* { dg-message "leak of 'p'" } */
/* FIXME: should this be 'ptr'? */
@@ -56,11 +55,11 @@ int test_2 (int n)
else
ptr = buf;
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 exploded nodes" } */
+ __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 processed enodes" } */
result = do_stuff_2 (ptr, n);
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 exploded nodes" } */
+ __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 processed enodes" } */
return result; /* { dg-message "leak of 'ptr'" } */
}
@@ -13,6 +13,5 @@ void test (struct foo *pf)
bar (0);
else
bar (1);
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "3 exploded nodes" } */
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 exploded node" } */
+ __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 processed enode" } */
}
@@ -13,6 +13,5 @@ void test (union foo *pf)
bar (0);
else
bar (1);
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "3 exploded nodes" } */
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 exploded node" } */
+ __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 processed enode" } */
}
@@ -6,9 +6,7 @@ int test (int a)
return (-2);
}
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "3 exploded nodes" } */
-
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 exploded node" } */
+ __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 processed enode" } */
return 0;
}
@@ -19,9 +17,7 @@ int test_2 (int a)
return (-2);
}
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "4 exploded nodes" } */
-
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 exploded node" } */
+ __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 processed enode" } */
return 0;
}
@@ -13,13 +13,12 @@ int test_1 (int a, int b)
else
p = malloc (32);
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "4 exploded nodes" } */
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 exploded nodes" } */
+ __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 processed enodes" } */
if (a > 5)
{
free (p);
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 exploded node" } */
+ __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 processed enode" } */
}
return 0; /* { dg-bogus "leak" } */
@@ -35,13 +34,12 @@ int test_2 (int a, int b)
else
p = malloc (32);
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "4 exploded nodes" } */
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 exploded nodes" } */
+ __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 processed enodes" } */
if (a > 6) /* different condition */
{
free (p);
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 exploded node" } */
+ __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 processed enode" } */
}
return 0; /* { dg-warning "leak of 'p'" } */
@@ -10,41 +10,43 @@ extern void do_stuff (struct state *, int);
int test_1 (struct state *s)
{
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 exploded node" } */
+ __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 processed enode" } */
while (1)
{
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 exploded nodes" } */
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 exploded node" } */
+ __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 processed enodes" } */
+ __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 processed enode" } */
+ /* TODO: why does the above need an extra stmt to merge state? */
do_stuff (s, s->mode);
}
}
int test_2 (struct state *s)
{
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 exploded node" } */
+ __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 processed enode" } */
while (1)
{
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "3 exploded nodes" } */
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 exploded node" } */
+ __analyzer_dump_exploded_nodes (0); /* { dg-warning "3 processed enodes" } */
+ __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 processed enode" } */
+ /* TODO: why does the above need an extra stmt to merge state? */
switch (s->mode)
{
case 0:
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 exploded node" } */
+ __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 processed enode" } */
do_stuff (s, 0);
break;
case 1:
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 exploded node" } */
+ __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 processed enode" } */
do_stuff (s, 17);
break;
case 2:
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 exploded node" } */
+ __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 processed enode" } */
do_stuff (s, 5);
break;
case 3:
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 exploded node" } */
+ __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 processed enode" } */
return 42;
case 4:
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 exploded node" } */
+ __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 processed enode" } */
return -3;
}
}
@@ -3,10 +3,10 @@
void test (int *p, int n)
{
int i;
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 exploded node" } */
+ __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 processed enode" } */
for (i = 0; i < n; i++)
{
p[i] = i; /* { dg-bogus "uninitialized" } */
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 exploded nodes" } */
+ __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 processed enodes" } */
}
}
@@ -19,9 +19,7 @@ void test_1 (int flag)
a = 3;
}
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 exploded nodes" } */
- // FIXME: the above can vary between 2 and 3 exploded nodes
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 exploded node" } */
+ __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 processed enode" } */
__analyzer_eval (a == 3); /* { dg-warning "TRUE" } */
__analyzer_eval (b == 4); /* { dg-warning "TRUE" } */
}
@@ -42,8 +40,7 @@ void test_2 (int flag)
f = 3;
}
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 exploded nodes" } */
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 exploded node" } */
+ __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 processed enode" } */
__analyzer_eval (f == 3); /* { dg-warning "TRUE" } */
__analyzer_eval (g == 4); /* { dg-warning "TRUE" } */
}
@@ -92,8 +89,7 @@ void test_3 (int i)
break;
}
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "6 exploded nodes" } */
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 exploded node" } */
+ __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 processed enode" } */
__analyzer_eval (f == 3); /* { dg-warning "TRUE" } */
__analyzer_eval (g == 4); /* { dg-warning "TRUE" } */
__analyzer_eval (h == 5); /* { dg-warning "TRUE" } */
@@ -112,8 +108,7 @@ void test_4 (int flag)
q = malloc (256);
p = malloc (256);
}
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 exploded nodes" } */
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 exploded node" } */
+ __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 processed enode" } */
free (p);
free (q);
}
@@ -9,12 +9,12 @@ int test (int flag, void *ptr, int *p, int n)
int sum = 0;
int i;
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 exploded node" } */
+ __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 processed enode" } */
if (flag)
free (ptr);
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 exploded nodes" } */
+ __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 processed enodes" } */
for (i = 0; i < n; i++)
p[i] = i;
@@ -22,7 +22,7 @@ int test (int flag, void *ptr, int *p, int n)
sum += foo (p[i]); /* { dg-bogus "uninitialized" } */
result = sum;
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 exploded nodes" } */
+ __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 processed enodes" } */
if (flag)
free (ptr); /* { dg-warning "double-'free' of 'ptr'" } */
@@ -37,12 +37,12 @@ int test_2 (int flag, int *p, int n)
void *ptr = malloc (16);
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 exploded node" } */
+ __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 processed enode" } */
if (flag)
free (ptr);
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 exploded nodes" } */
+ __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 processed enodes" } */
for (i = 0; i < n; i++)
p[i] = i;
@@ -50,8 +50,7 @@ int test_2 (int flag, int *p, int n)
sum += foo (p[i]); /* { dg-bogus "uninitialized" } */
result = sum;
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "5 exploded nodes" } */
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "5 exploded nodes" } */
+ __analyzer_dump_exploded_nodes (0); /* { dg-warning "5 processed enodes" } */
// FIXME: why 5 here?
free (ptr); /* { dg-warning "double-'free' of 'ptr'" } */
@@ -7,7 +7,7 @@
static void __attribute__((noinline))
test_1_callee (void *p, void *q)
{
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 exploded node" } */
+ __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 processed enode" } */
__analyzer_eval (p == Z_NULL); /* { dg-warning "FALSE" } */
__analyzer_eval (p != Z_NULL); /* { dg-warning "TRUE" } */
@@ -27,7 +27,7 @@ void test_1 (void *p, void *q)
static void __attribute__((noinline))
test_2_callee (void *p, void *q)
{
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 exploded node" } */
+ __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 processed enode" } */
__analyzer_eval (p == Z_NULL); /* { dg-warning "FALSE" } */
__analyzer_eval (p != Z_NULL); /* { dg-warning "TRUE" } */
@@ -21,49 +21,44 @@ int deflateEnd(z_stream *strm)
{
int status;
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 exploded node" } */
+ __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 processed enode" } */
if (strm == 0 || strm->state == 0)
return (-2);
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 exploded node" } */
+ __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 processed enode" } */
status = strm->state->status;
if (status != 42 && status != 113 && status != 666) {
return (-2);
}
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "4 exploded nodes" } */
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 exploded node" } */
+ __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 processed enode" } */
if (strm->state->pending_buf)
(*(strm->zfree))(strm->opaque, (void *)(strm->state->pending_buf));
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 exploded nodes" } */
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 exploded node" } */
+ __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 processed enode" } */
if (strm->state->head)
(*(strm->zfree))(strm->opaque, (void *)(strm->state->head));
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 exploded nodes" } */
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 exploded node" } */
+ __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 processed enode" } */
if (strm->state->prev)
(*(strm->zfree))(strm->opaque, (void *)(strm->state->prev));
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 exploded nodes" } */
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 exploded node" } */
+ __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 processed enode" } */
if (strm->state->window)
(*(strm->zfree))(strm->opaque, (void *)(strm->state->window));
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 exploded nodes" } */
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 exploded node" } */
+ __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 processed enode" } */
(*(strm->zfree))(strm->opaque, (void *)(strm->state));
strm->state = 0;
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 exploded node" } */
+ __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 processed enode" } */
return status == 113 ? (-3) : 0;
}
@@ -42,7 +42,7 @@ int main(int argc, char *argv[]) {
if (compr == 0 || uncompr == 0)
exit(1);
- __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 exploded node" } */
+ __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 processed enode" } */
test_compress(compr, comprLen, uncompr, uncomprLen);