Commit b5cd6849 by Jakub Jelinek Committed by Jakub Jelinek

c-format.c (check_format_info_recurse): Handle PLUS_EXPR for format string.

	* c-format.c (check_format_info_recurse): Handle
	PLUS_EXPR for format string.

	* gcc.dg/format/plus-1.c: New test.

From-SVN: r41550
parent ad5042df
2001-04-25 Jakub Jelinek <jakub@redhat.com> 2001-04-25 Jakub Jelinek <jakub@redhat.com>
* c-format.c (check_format_info_recurse): Handle
PLUS_EXPR for format string.
2001-04-25 Jakub Jelinek <jakub@redhat.com>
* config/ia64/ia64.h (CC1_SPEC): Define. * config/ia64/ia64.h (CC1_SPEC): Define.
* config/ia64/linux.h (CC1_SPEC): Define. * config/ia64/linux.h (CC1_SPEC): Define.
......
...@@ -1500,6 +1500,7 @@ check_format_info_recurse (status, res, info, format_tree, params, arg_num) ...@@ -1500,6 +1500,7 @@ check_format_info_recurse (status, res, info, format_tree, params, arg_num)
int arg_num; int arg_num;
{ {
int format_length; int format_length;
HOST_WIDE_INT offset;
const char *format_chars; const char *format_chars;
tree array_size = 0; tree array_size = 0;
tree array_init; tree array_init;
...@@ -1589,6 +1590,35 @@ check_format_info_recurse (status, res, info, format_tree, params, arg_num) ...@@ -1589,6 +1590,35 @@ check_format_info_recurse (status, res, info, format_tree, params, arg_num)
return; return;
} }
offset = 0;
if (TREE_CODE (format_tree) == PLUS_EXPR)
{
tree arg0, arg1;
arg0 = TREE_OPERAND (format_tree, 0);
arg1 = TREE_OPERAND (format_tree, 1);
STRIP_NOPS (arg0);
STRIP_NOPS (arg1);
if (TREE_CODE (arg1) == INTEGER_CST)
format_tree = arg0;
else if (TREE_CODE (arg0) == INTEGER_CST)
{
format_tree = arg1;
arg1 = arg0;
}
else
{
res->number_non_literal++;
return;
}
if (!host_integerp (arg1, 1))
{
res->number_non_literal++;
return;
}
offset = TREE_INT_CST_LOW (arg1);
}
if (TREE_CODE (format_tree) != ADDR_EXPR) if (TREE_CODE (format_tree) != ADDR_EXPR)
{ {
res->number_non_literal++; res->number_non_literal++;
...@@ -1632,6 +1662,16 @@ check_format_info_recurse (status, res, info, format_tree, params, arg_num) ...@@ -1632,6 +1662,16 @@ check_format_info_recurse (status, res, info, format_tree, params, arg_num)
format_length = array_size_value; format_length = array_size_value;
} }
} }
if (offset)
{
if (offset >= format_length)
{
res->number_non_literal++;
return;
}
format_chars += offset;
format_length -= offset;
}
if (format_length < 1) if (format_length < 1)
{ {
res->number_unterminated++; res->number_unterminated++;
......
2001-04-25 Jakub Jelinek <jakub@redhat.com> 2001-04-25 Jakub Jelinek <jakub@redhat.com>
* c-format.c (check_format_info_recurse): Handle
PLUS_EXPR for format string.
2001-04-25 Jakub Jelinek <jakub@redhat.com>
* gcc.dg/20010423-1.c: New test. * gcc.dg/20010423-1.c: New test.
2001-04-25 Jakub Jelinek <jakub@redhat.com> 2001-04-25 Jakub Jelinek <jakub@redhat.com>
......
/* Test for printf formats using string literal plus constant.
*/
/* Origin: Jakub Jelinek <jakub@redhat.com> */
/* { dg-do compile } */
/* { dg-options "-std=iso9899:1990 -pedantic -Wformat=2" } */
#include "format.h"
void
foo (int i)
{
printf ("%%d\n" + 1, i);
printf (5 + "%.-*d%3d\n", i);
printf ("%d%d" + 2, i, i); /* { dg-warning "arguments" "wrong number of args" } */
printf (3 + "%d\n"); /* { dg-warning "zero-length" "zero-length string" } */
printf ("%d\n" + i, i); /* { dg-warning "not a string" "non-constant addend" } */
printf ("%d\n" + 10); /* { dg-warning "not a string" "too large addend" } */
printf ("%d\n" - 1, i); /* { dg-warning "not a string" "minus constant" } */
printf ("%d\n" + -1, i); /* { dg-warning "not a string" "negative addend" } */
}
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