On Wed, Apr 11, 2018 at 09:48:05AM +0200, Andreas Krebbel wrote:
> c-c++-common/attr-nonstring-3.c fails on IBM Z. The reason appears to be
> that we provide builtin implementations for strcpy and stpcpy. The
> warnings currently will only be emitted when expanding these as normal
> calls.
>
> Bootstrapped and regression tested on x86_64 and s390x.
>
> Ok?
>
> gcc/ChangeLog:
>
> 2018-04-11 Andreas Krebbel <[email protected]>
>
> * builtins.c (expand_builtin_strcpy): Invoke
> maybe_warn_nonstring_arg.
> (expand_builtin_stpcpy): Likewise.
Don't you then warn twice if builtin implementations for strcpy and stpcpy
aren't available or can't be used, once here and once in calls.c?
> --- a/gcc/builtins.c
> +++ b/gcc/builtins.c
> @@ -3770,6 +3770,12 @@ expand_builtin_strcpy (tree exp, rtx target)
> tree dest = CALL_EXPR_ARG (exp, 0);
> tree src = CALL_EXPR_ARG (exp, 1);
>
> + /* Check to see if the argument was declared attribute nonstring
> + and if so, issue a warning since at this point it's not known
> + to be nul-terminated. */
> + tree fndecl = get_callee_fndecl (exp);
> + maybe_warn_nonstring_arg (fndecl, exp);
> +
> if (warn_stringop_overflow)
> {
> tree destsize = compute_objsize (dest, warn_stringop_overflow - 1);
> @@ -3828,6 +3834,12 @@ expand_builtin_stpcpy (tree exp, rtx target,
> machine_mode mode)
> tree len, lenp1;
> rtx ret;
>
> + /* Check to see if the argument was declared attribute nonstring
> + and if so, issue a warning since at this point it's not known
> + to be nul-terminated. */
> + tree fndecl = get_callee_fndecl (exp);
> + maybe_warn_nonstring_arg (fndecl, exp);
> +
> /* Ensure we get an actual string whose length can be evaluated at
> compile-time, not an expression containing a string. This is
> because the latter will potentially produce pessimized code
> --
> 2.9.1
Jakub