On 08/13/2018 03:28 PM, Martin Sebor wrote:
> The attached changes implement the detection of past-the-end reads
> by the sprintf family of functions due to unterminated arguments to
> %s directives.
> 
> gcc-86552-4.diff
> 
> 
> PR tree-optimization/86552 - missing warning for reading past the end of 
> non-string arrays
> 
> gcc/ChangeLog:
> 
>       * gimple-ssa-sprintf.c (struct fmtresult): Add new member and
>       initialize it.
>       (get_string_length): Detect unterminated arrays.
>       (format_string): Same.
>       (format_directive): Warn about unterminated arrays.
> 
> gcc/testsuite/ChangeLog:
> 
>       * gcc.dg/warn-sprintf-no-nul.c: New test.
Largely the same state as #2 and #3.

I am getting a failure from the test though.  It looks like the sprintf
code is turning an offending sprintf call into a strcpy call and we end
up getting a warning from both.

> @@ -2988,6 +3002,18 @@ format_directive (const sprintf_dom_walker::call_info 
> &info,
>                         fmtres.range.min, fmtres.range.max);
>      }
>  
> +  if (!warned && fmtres.nonstr)
> +    {
> +      warned = fmtwarn (dirloc, argloc, NULL, info.warnopt (),
> +                     "%<%.*s%> directive argument is not a nul-terminated "
> +                     "string",
> +                     dirlen,
> +                     target_to_host (hostdir, sizeof hostdir, dir.beg));
> +      if (warned && DECL_P (fmtres.nonstr))
> +     inform (DECL_SOURCE_LOCATION (fmtres.nonstr),
> +             "referenced argument declared here");
> +    }
> +
ISTM that returning false from this point should address the issue.
Essentially preventing the sprintf->strcpy transformation if the
directive argument is not NUL terminated.


I'll own this just like #2 and #3.

jeff

Reply via email to