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

--- Comment #8 from GCC Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by Jakub Jelinek <ja...@gcc.gnu.org>:

https://gcc.gnu.org/g:206cb6c10589bef4afc90f4df993fc3bdb031e27

commit r15-7682-g206cb6c10589bef4afc90f4df993fc3bdb031e27
Author: Jakub Jelinek <ja...@redhat.com>
Date:   Mon Feb 24 09:18:27 2025 +0100

    analyzer: Handle nonnull_if_nonzero attribute [PR117023]

    On top of the
    https://gcc.gnu.org/pipermail/gcc-patches/2024-November/668554.html
    patch which introduces the nonnull_if_nonzero attribute (because
    C2Y is allowing NULL arguments on various calls like memcpy, memset,
    strncpy etc. as long as the count is 0) the following patch adds just
    limited handling of the attribute in the analyzer.

    For nonnull attribute(s) we have the get_nonnull_args helper which
    returns a bitmap, for nonnull_if_nonzero a function would need to
    return a hash_map or something similar, I think it is better to
    handle the attributes one by one.  This patch just handles the
    non-zero INTEGER_CST (integer_nonzerop) count arguments, in other places
    the above patch uses ranger to some extent, but I'm not familiar enough
    with the analyzer to know if one can use the ranger, or should somehow
    explain in data structures the conditional nature of the nonnull property,
    the argument is nonnull only if some other argument is nonzero.

    Also, analyzer uses get_nonnull_args in another spot when entering a frame,
    not sure if anything can be done there (note the conditional nonnull
    somehow, pass from callers if the argument is nonzero, ...).

    Note, the testsuite changes aren't strictly necessary with just
    the above and this patch, but will be with a patch I'm going to post
    soon.

    2025-02-24  Jakub Jelinek  <ja...@redhat.com>

            PR c/117023
    gcc/analyzer/
            * sm-malloc.cc (malloc_state_machine::handle_nonnull): New private
            method.
            (malloc_state_machine::on_stmt): Use it for nonnull attribute
arguments.
            Handle also nonnull_if_nonzero attributes.
    gcc/testsuite/
            * c-c++-common/analyzer/call-summaries-malloc.c
            (test_use_without_check): Pass 4 rather than sz to memset.
            * c-c++-common/analyzer/strncpy-1.c (test_null_dst,
            test_null_src): Pass 42 rather than count to strncpy.

Reply via email to