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
This commit is contained in:
parent
014e7f1d30
commit
1c248308f4
4 changed files with 51 additions and 2 deletions
|
@ -1,3 +1,11 @@
|
|||
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.
|
||||
|
|
|
@ -2345,8 +2345,29 @@ check_format_info (status, info, params)
|
|||
/* Functions taking a va_list normally pass a non-literal format
|
||||
string. These functions typically are declared with
|
||||
first_arg_num == 0, so avoid warning in those cases. */
|
||||
if (info->first_arg_num != 0 && warn_format_nonliteral)
|
||||
status_warning (status, "format not a string literal, argument types not checked");
|
||||
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");
|
||||
}
|
||||
}
|
||||
|
||||
/* If there were extra arguments to the format, normally warn. However,
|
||||
|
|
|
@ -1,3 +1,7 @@
|
|||
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
|
||||
|
|
16
gcc/testsuite/gcc.dg/format-nonlit-3.c
Normal file
16
gcc/testsuite/gcc.dg/format-nonlit-3.c
Normal file
|
@ -0,0 +1,16 @@
|
|||
/* 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" } */
|
||||
}
|
Loading…
Add table
Reference in a new issue