On 4/4/19 3:42 PM, Martin Sebor wrote:
> Attached is yet another patch to avoid ICE due to middle-end
> assumptions about the sanity of calls to built-ins, this time
> for strnlen.  It fixes two unsafe assumptions:
> 
> 1) The -Wstringop-overflow checker for unterminated constant char
>    arrays assumes that strnlen is called with exactly two arguments.
>    When the function is declared without a prototype and called with
>    no arguments the code aborts.  This is PR 89911 (P1).
> 
> 2) The wide_int min/max values of get_range_info() called on
>    the strnlen bound have the same precision as PTRDIFF_MAX.
>    That's not so when strnlen is declared without a prototype
>    and called with an int128_t argument in some range.  Rather
>    than handling this case, wi::ltu_p() helpfully aborts instead.
>    This is PR 89957 that I exposed while testing the fix above.
> 
> The trivial patch avoids both of these assumptions.  It's been
> tested on x86_64-linux.  Similar to the patch for PR 89934, I
> will commit it later this week unless there are objections.
> 
> Martin
> 
> Patch for PR 89934 for reference:
>   https://gcc.gnu.org/ml/gcc-patches/2019-04/msg00149.html
> 
> gcc-89911.diff
> 
> PR middle-end/89957 - ICE calling strnlen with an int128_t bound in a known 
> range
> PR middle-end/89911 - [9 Regression] ICE in get_attr_nonstring_decl
> 
> gcc/ChangeLog:
> 
>       PR middle-end/89957
>       PR middle-end/89911
>       * builtins.c (expand_builtin_strnlen): Make sure wi::ltu_p operands
>       have the same precision since the function crashes otherwise.
>       * calls.c (maybe_warn_nonstring_arg): Avoid assuming strnlen() call
>       has non-zero arguments.
> 
> gcc/testsuite/ChangeLog:
> 
>       PR middle-end/89957
>       PR middle-end/89911
>       * gcc.dg/Wstringop-overflow-13.c: New test.
OK
jeff

Reply via email to