https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105087

--- Comment #5 from CVS Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by David Malcolm <dmalc...@gcc.gnu.org>:

https://gcc.gnu.org/g:3734527dfa0d10a50aee2f088d37320000fd65bf

commit r12-7869-g3734527dfa0d10a50aee2f088d37320000fd65bf
Author: David Malcolm <dmalc...@redhat.com>
Date:   Mon Mar 28 20:41:23 2022 -0400

    analyzer: ensure that we purge state when reusing a conjured_svalue
[PR105087]

    PR analyzer/105087 describes a false positive from
    -Wanalyzer-double-free in which the analyzer erroneously considers two
    successive inlined vasprintf calls to have allocated the same pointer.

    The root cause is that the result written back from vasprintf is a
    conjured_svalue, and that we normally purge state when reusing a
    conjured_svalue, but various places in the code were calling
    region_model_manager::get_or_create_conjured_svalue but failing to
    then call region_model::purge_state_involving on the result.

    This patch fixes things by moving responsibility for calling
    region_model::purge_state_involving into
    region_model_manager::get_or_create_conjured_svalue, so that it is
    always called when reusing a conjured_svalue, fixing the false positive.

    gcc/analyzer/ChangeLog:
            PR analyzer/105087
            * analyzer.h (class conjured_purge): New forward decl.
            * region-model-asm.cc (region_model::on_asm_stmt): Add
            conjured_purge param to calls binding_cluster::on_asm and
            region_model_manager::get_or_create_conjured_svalue.
            * region-model-impl-calls.cc
            (call_details::get_or_create_conjured_svalue): Likewise for call
            to region_model_manager::get_or_create_conjured_svalue.
            (region_model::impl_call_fgets): Remove call to
            region_model::purge_state_involving, as this is now done
            implicitly by call_details::get_or_create_conjured_svalue.
            (region_model::impl_call_fread): Likewise.
            (region_model::impl_call_strchr): Pass conjured_purge param to
            call to region_model_manager::get_or_create_conjured_svalue.
            * region-model-manager.cc (conjured_purge::purge): New.
            (region_model_manager::get_or_create_conjured_svalue): Add
            param "p".  Use it to purge state when reusing an existing
            conjured_svalue.
            * region-model.cc (region_model::on_call_pre): Replace call to
            region_model::purge_state_involving with passing conjured_purge
            to region_model_manager::get_or_create_conjured_svalue.
            (region_model::handle_unrecognized_call): Pass conjured_purge to
            store::on_unknown_fncall.
            * region-model.h
            (region_model_manager::get_or_create_conjured_svalue): Add param
            "p".
            * store.cc (binding_cluster::on_unknown_fncall): Likewise.  Pass
            it on to region_model_manager::get_or_create_conjured_svalue.
            (binding_cluster::on_asm): Likewise.
            (store::on_unknown_fncall): Add param "p" and pass it on to
            binding_cluster::on_unknown_fncall.
            * store.h (binding_cluster::on_unknown_fncall): Add param p.
            (binding_cluster::on_asm): Likewise.
            (store::on_unknown_fncall): Likewise.
            * svalue.h (class conjured_purge): New.

    gcc/testsuite/ChangeLog:
            * gcc.dg/analyzer/pr105087-1.c: New test.
            * gcc.dg/analyzer/pr105087-2.c: New test.
            * gcc.dg/analyzer/vasprintf-1.c: New test.

    Signed-off-by: David Malcolm <dmalc...@redhat.com>

Reply via email to