aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2015-01-21 15:15:27 -0500
committerJason Merrill <jason@gcc.gnu.org>2015-01-21 15:15:27 -0500
commit6875457f349eebb3d13d780e909b131bfff87e16 (patch)
tree334f6df3b4d1b74ca05e70878a04ce65b928fe88
parent4195393b3ce259c11e0fb7ea9985ca4357b37e1a (diff)
downloadgcc-6875457f349eebb3d13d780e909b131bfff87e16.zip
gcc-6875457f349eebb3d13d780e909b131bfff87e16.tar.gz
gcc-6875457f349eebb3d13d780e909b131bfff87e16.tar.bz2
re PR c++/64629 (-Wformat-security warns with const char *const vars)
PR c++/64629 * c-format.c (check_format_arg): Call decl_constant_value. From-SVN: r219964
-rw-r--r--gcc/c-family/ChangeLog5
-rw-r--r--gcc/c-family/c-format.c7
-rw-r--r--gcc/testsuite/g++.dg/warn/Wformat-1.C10
3 files changed, 22 insertions, 0 deletions
diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog
index df56b31..3b9a3d4 100644
--- a/gcc/c-family/ChangeLog
+++ b/gcc/c-family/ChangeLog
@@ -1,3 +1,8 @@
+2015-01-21 Jason Merrill <jason@redhat.com>
+
+ PR c++/64629
+ * c-format.c (check_format_arg): Call decl_constant_value.
+
2015-01-19 Martin Liska <mliska@suse.cz>
* c-common.c (handle_noicf_attribute): New function.
diff --git a/gcc/c-family/c-format.c b/gcc/c-family/c-format.c
index e47c190..faaca09 100644
--- a/gcc/c-family/c-format.c
+++ b/gcc/c-family/c-format.c
@@ -1443,6 +1443,13 @@ check_format_arg (void *ctx, tree format_tree,
tree array_init;
alloc_pool fwt_pool;
+ if (TREE_CODE (format_tree) == VAR_DECL)
+ {
+ /* Pull out a constant value if the front end didn't. */
+ format_tree = decl_constant_value (format_tree);
+ STRIP_NOPS (format_tree);
+ }
+
if (integer_zerop (format_tree))
{
/* Skip to first argument to check, so we can see if this format
diff --git a/gcc/testsuite/g++.dg/warn/Wformat-1.C b/gcc/testsuite/g++.dg/warn/Wformat-1.C
new file mode 100644
index 0000000..6094a9c
--- /dev/null
+++ b/gcc/testsuite/g++.dg/warn/Wformat-1.C
@@ -0,0 +1,10 @@
+// PR c++/64629
+// { dg-options "-Wformat -Wformat-security" }
+
+extern void bar (int, const char *, ...) __attribute__((format (printf, 2, 3)));
+void
+foo (void)
+{
+ const char *const msg = "abc";
+ bar (1, msg);
+}