Commit 1c248308 by Joseph Myers Committed by Joseph Myers

c-common.c (check_format_info): Warn for non-constant format strings with…

c-common.c (check_format_info): Warn for non-constant format strings with strftime formats if -Wformat-nonliteral.

	* c-common.c (check_format_info): Warn for non-constant format
	strings with strftime formats if -Wformat-nonliteral.  Where the
	format can convert arguments, if the format is not a string
	literal and there are no arguments to the format, give a different
	warning message from the general non-string-literal case.

testsuite:
	* gcc.dg/format-nonlit-3.c: New test.

From-SVN: r38105
parent 014e7f1d
2000-12-07 Joseph S. Myers <jsm28@cam.ac.uk> 2000-12-07 Joseph S. Myers <jsm28@cam.ac.uk>
* c-common.c (check_format_info): Warn for non-constant format
strings with strftime formats if -Wformat-nonliteral. Where the
format can convert arguments, if the format is not a string
literal and there are no arguments to the format, give a different
warning message from the general non-string-literal case.
2000-12-07 Joseph S. Myers <jsm28@cam.ac.uk>
* c-common.c (format_wanted_type): Add reading_from_flag. * c-common.c (format_wanted_type): Add reading_from_flag.
(print_char_table): Mark %s and %S formats with flag "R". (print_char_table): Mark %s and %S formats with flag "R".
(check_format_info_main): Set up reading_from_flag appropriately. (check_format_info_main): Set up reading_from_flag appropriately.
......
...@@ -2345,9 +2345,30 @@ check_format_info (status, info, params) ...@@ -2345,9 +2345,30 @@ check_format_info (status, info, params)
/* Functions taking a va_list normally pass a non-literal format /* Functions taking a va_list normally pass a non-literal format
string. These functions typically are declared with string. These functions typically are declared with
first_arg_num == 0, so avoid warning in those cases. */ first_arg_num == 0, so avoid warning in those cases. */
if (info->first_arg_num != 0 && warn_format_nonliteral) if (!(format_types[info->format_type].flags & FMT_FLAG_ARG_CONVERT))
{
/* For strftime-like formats, warn for not checking the format
string; but there are no arguments to check. */
if (warn_format_nonliteral)
status_warning (status, "format not a string literal, format string not checked");
}
else if (info->first_arg_num != 0)
{
/* If there are no arguments for the format at all, we may have
printf (foo) which is likely to be a security hole. */
while (arg_num + 1 < info->first_arg_num)
{
if (params == 0)
break;
params = TREE_CHAIN (params);
++arg_num;
}
if (params == 0 && warn_format_nonliteral)
status_warning (status, "format not a string literal and no format arguments");
else if (warn_format_nonliteral)
status_warning (status, "format not a string literal, argument types not checked"); status_warning (status, "format not a string literal, argument types not checked");
} }
}
/* If there were extra arguments to the format, normally warn. However, /* If there were extra arguments to the format, normally warn. However,
the standard does say extra arguments are ignored, so in the specific the standard does say extra arguments are ignored, so in the specific
......
2000-12-07 Joseph S. Myers <jsm28@cam.ac.uk> 2000-12-07 Joseph S. Myers <jsm28@cam.ac.uk>
* gcc.dg/format-nonlit-3.c: New test.
2000-12-07 Joseph S. Myers <jsm28@cam.ac.uk>
* gcc.dg/c90-printf-1.c: Add test for printf formats reading * gcc.dg/c90-printf-1.c: Add test for printf formats reading
through a null pointer. through a null pointer.
......
/* Test for warnings for non-string-literal formats. Test for strftime formats. */
/* Origin: Joseph Myers <jsm28@cam.ac.uk> */
/* { dg-do compile } */
/* { dg-options "-std=gnu99 -Wformat -Wformat-nonliteral" } */
typedef __SIZE_TYPE__ size_t;
struct tm;
extern size_t strftime (char *, size_t, const char *, const struct tm *);
void
foo (char *s, size_t m, const struct tm *tp, char *fmt)
{
strftime (s, m, fmt, tp); /* { dg-warning "format string" "non-literal" } */
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment