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