On 10/24/2021 5:43 PM, Martin Sebor via Gcc-patches wrote:
The detection of overlapping sprintf calls has a limitation
that leads to both false positives (PR 102919) and negatives
(PR 102238) in corner cases involving members of aggregates.
The false positives result from the overlap logic not using
the size of the member used as an argument to %s to constrain
the length of the directive output.  The false negatives are
due to the logic failing to determine the identity of a member
from the address or reference to the enclosing object and
an offset.

The attached patch improves the detection logic to handle both
sets of cases.  In addition, it moves the utility functions used
to implement the logic from the sprintf pass into pointer-query
where they can be used for other purposes in the future (my
work in progress).

Tested on x86_64-linux and by building Glibc and verifying
it doesn't cause any new warnings,

Martin

gcc-102238.diff

PR tree-optimization/102238 - alias_offset in gimple-ssa-sprintf.c is broken
PR tree-optimization/102919 - spurious -Wrestrict warning for sprintf into the 
same member array as argument plus offset

gcc/ChangeLog:

        PR tree-optimization/102238
        PR tree-optimization/102919
        * gimple-ssa-sprintf.c (get_string_length): Ad an argument.
        (array_elt_at_offset): Move to pointer-query.
        (set_aggregate_size_and_offset): New function.
        (field_at_offset):  Move to pointer-query.
        (get_origin_and_offset): Rename...
        (get_origin_and_offset_r): this.  Add an argument.  Make aggregate
        handling more robust.
        (get_origin_and_offset): New.
        (alias_offset): Add an argument.
        (format_string): Use subobject size determined by get_origin_and_offset.
        * pointer-query.cc (field_at_offset): Move from gimple-ssa-sprintf.c.
        Improve/correct handling of aggregates.
        (array_elt_at_offset): Same.
        * pointer-query.h (field_at_offset): Declare.
        (array_elt_at_offset): Declare.

gcc/testsuite/ChangeLog:

        PR tree-optimization/102238
        PR tree-optimization/102919
        * gcc.dg/tree-ssa/builtin-sprintf-warn-23.c: Remove warnings.
        * gcc.dg/Wrestrict-23.c: New test.
Given you know this code better than anyone.  OK.
jeff

Reply via email to