From b269cc578dc7d39a679fabcdfb199f07c936b7d2 Mon Sep 17 00:00:00 2001 From: David Malcolm Date: Wed, 24 Jun 2020 15:35:41 -0400 Subject: [PATCH 248/315] FIXME: fix leak detection for longjmp --- gcc/analyzer/engine.cc | 4 ++++ gcc/analyzer/region-model2.cc | 13 +++---------- 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/gcc/analyzer/engine.cc b/gcc/analyzer/engine.cc index 8259c9f022c..8c7983006a2 100644 --- a/gcc/analyzer/engine.cc +++ b/gcc/analyzer/engine.cc @@ -2064,6 +2064,10 @@ exploded_node::on_longjmp2 (exploded_graph &eg, new_region_model->on_longjmp (longjmp_call, setjmp_call, setjmp_point.get_stack_depth (), ctxt); + /* Detect leaks in the new state relative to the old state. */ + program_state::detect_leaks2 (get_state (), *new_state, NULL, + eg.get_ext_state (), ctxt); + program_point next_point = program_point::after_supernode (setjmp_point.get_supernode (), setjmp_point.get_call_string ()); diff --git a/gcc/analyzer/region-model2.cc b/gcc/analyzer/region-model2.cc index a24780feca2..5edf1c1556f 100644 --- a/gcc/analyzer/region-model2.cc +++ b/gcc/analyzer/region-model2.cc @@ -5587,13 +5587,12 @@ region_model2::on_setjmp (const gcall *call, const exploded_node *enode, /* Update this region_model2 for rewinding from a "longjmp" at LONGJMP_CALL to a "setjmp" at SETJMP_CALL where the final stack depth should be - SETJMP_STACK_DEPTH. Purge any stack frames, potentially reporting on - leaks to CTXT. */ + SETJMP_STACK_DEPTH. Pop any stack frames. Leak detection is *not* + done, and should be done by the caller. */ void region_model2::on_longjmp (const gcall *longjmp_call, const gcall *setjmp_call, - int setjmp_stack_depth, - region_model2_context *ctxt) + int setjmp_stack_depth, region_model2_context *ctxt) { /* Evaluate the val, using the frame of the "longjmp". */ tree fake_retval = gimple_call_arg (longjmp_call, 1); @@ -5641,12 +5640,6 @@ region_model2::on_longjmp (const gcall *longjmp_call, const gcall *setjmp_call, const region2 *lhs_reg = get_lvalue (lhs, ctxt); set_value (lhs_reg, fake_retval_sval, ctxt); } -#if 0 - /* Now that we've assigned the fake_retval, we can purge the unused - svalue2s, which could detect leaks. */ - purge_unused_svalue2s (NULL, ctxt, NULL); - validate (); -#endif } /* Update this region_model2 for a phi stmt of the form -- 2.26.2