On Tue, Jun 18, 2019 at 12:27:31PM +0200, Martin Liška wrote:
> > Oops.  The problematic case is then if the STRING_CST c_getstr finds
> > is not NUL terminated (dunno if we ever construct that) or if
> > string_size is smaller than string_length and there are no NULs in that
> > size.
> 
> The function always returns a null-terminated string:
> 
>  14587  /* Return a pointer P to a NUL-terminated string representing the 
> sequence
>  14588     of constant characters referred to by SRC (or a subsequence of such
>  14589     characters within it if SRC is a reference to a string plus some
>  14590     constant offset).  If STRLEN is non-null, store the number of bytes
>  14591     in the string constant including the terminating NUL char.  
> *STRLEN is
>  14592     typically strlen(P) + 1 in the absence of embedded NUL characters. 
>  */
>  14593  
>  14594  const char *
>  14595  c_getstr (tree src, unsigned HOST_WIDE_INT *strlen /* = NULL */)
>  14596  {
>  14597    tree offset_node;
>  14598    tree mem_size;
> 
> That said, the unconditional strnlen should be fine.

But *strlen it sets might be smaller.

I'd try say const char foo[5] = "foobar";
or similar, or say stick gcc_assert in c_getstr where it is setting
*strlen and gcc_assert (strnlen (to be returned value, *strlen) < *strlen);
do a bootstrap/regtest with that and see if it ever triggers (or instead
of assert failure log into a log file with "a" mode).

If not, there is no point to pass non-NULL second argument to c_getstr,
you'd always just use strlen on the returned string.

        Jakub

Reply via email to