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