From eda0cd9827081b8c628a2a162321342ebc76eba9 Mon Sep 17 00:00:00 2001 From: Roger Sayle Date: Tue, 6 Dec 2005 14:05:58 +0000 Subject: [PATCH] typeck.c (build_binary_op): Issue warning if either operand of a comparison operator is a string literal... * typeck.c (build_binary_op): Issue warning if either operand of a comparison operator is a string literal, except for testing equality or inequality against NULL. * g++.dg/warn/Wstring-literal-comparison-1.C: New test case. * g++.dg/warn/Wstring-literal-comparison-2.C: Likewise. * g++.dg/warn/Wstring-literal-comparison-3.C: Likewise. * g++.dg/warn/Wstring-literal-comparison-4.C: Likewise. From-SVN: r108120 --- gcc/cp/ChangeLog | 6 ++++ gcc/cp/typeck.c | 9 ++++++ gcc/testsuite/ChangeLog | 7 +++++ .../warn/Wstring-literal-comparison-1.C | 29 +++++++++++++++++++ .../warn/Wstring-literal-comparison-2.C | 29 +++++++++++++++++++ .../warn/Wstring-literal-comparison-3.C | 29 +++++++++++++++++++ .../warn/Wstring-literal-comparison-4.C | 29 +++++++++++++++++++ 7 files changed, 138 insertions(+) create mode 100644 gcc/testsuite/g++.dg/warn/Wstring-literal-comparison-1.C create mode 100644 gcc/testsuite/g++.dg/warn/Wstring-literal-comparison-2.C create mode 100644 gcc/testsuite/g++.dg/warn/Wstring-literal-comparison-3.C create mode 100644 gcc/testsuite/g++.dg/warn/Wstring-literal-comparison-4.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 82b99cb3b50..d133d8b144a 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2005-12-06 Roger Sayle + + * typeck.c (build_binary_op): Issue warning if either operand of a + comparison operator is a string literal, except for testing equality + or inequality against NULL. + 2005-12-06 Roger Sayle PR c++/25263 diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c index 0ee630ab0d6..0cae9380710 100644 --- a/gcc/cp/typeck.c +++ b/gcc/cp/typeck.c @@ -3089,6 +3089,10 @@ build_binary_op (enum tree_code code, tree orig_op0, tree orig_op1, case NE_EXPR: if (warn_float_equal && (code0 == REAL_TYPE || code1 == REAL_TYPE)) warning (0, "comparing floating point with == or != is unsafe"); + if ((TREE_CODE (orig_op0) == STRING_CST && !integer_zerop (op1)) + || (TREE_CODE (orig_op1) == STRING_CST && !integer_zerop (op0))) + warning (OPT_Wstring_literal_comparison, + "comparison with string literal"); build_type = boolean_type_node; if ((code0 == INTEGER_TYPE || code0 == REAL_TYPE @@ -3194,6 +3198,11 @@ build_binary_op (enum tree_code code, tree orig_op0, tree orig_op1, case GE_EXPR: case LT_EXPR: case GT_EXPR: + if (TREE_CODE (orig_op0) == STRING_CST + || TREE_CODE (orig_op1) == STRING_CST) + warning (OPT_Wstring_literal_comparison, + "comparison with string literal"); + build_type = boolean_type_node; if ((code0 == INTEGER_TYPE || code0 == REAL_TYPE) && (code1 == INTEGER_TYPE || code1 == REAL_TYPE)) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 6c16c7d430b..35f45eacce1 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2005-12-06 Roger Sayle + + * g++.dg/warn/Wstring-literal-comparison-1.C: New test case. + * g++.dg/warn/Wstring-literal-comparison-2.C: Likewise. + * g++.dg/warn/Wstring-literal-comparison-3.C: Likewise. + * g++.dg/warn/Wstring-literal-comparison-4.C: Likewise. + 2005-12-06 Roger Sayle PR c++/25263 diff --git a/gcc/testsuite/g++.dg/warn/Wstring-literal-comparison-1.C b/gcc/testsuite/g++.dg/warn/Wstring-literal-comparison-1.C new file mode 100644 index 00000000000..c5dea463b51 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wstring-literal-comparison-1.C @@ -0,0 +1,29 @@ +/* PR c/7776 */ +/* { dg-do compile } */ +/* { dg-options "-Wstring-literal-comparison" } */ + +int test1(char *ptr) +{ + return ptr == "foo"; /* { dg-warning "comparison with string" } */ +} + +int test2() +{ + return "foo" != (const char*)0; +} + +int test3() +{ + return "foo" == (const char*)0; +} + +int test4() +{ + return (const char*)0 != "foo"; +} + +int test5() +{ + return (const char*)0 == "foo"; +} + diff --git a/gcc/testsuite/g++.dg/warn/Wstring-literal-comparison-2.C b/gcc/testsuite/g++.dg/warn/Wstring-literal-comparison-2.C new file mode 100644 index 00000000000..3eb91eeca49 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wstring-literal-comparison-2.C @@ -0,0 +1,29 @@ +/* PR c/7776 */ +/* { dg-do compile } */ +/* { dg-options "-Wall" } */ + +int test1(char *ptr) +{ + return ptr == "foo"; /* { dg-warning "comparison with string" } */ +} + +int test2() +{ + return "foo" != (const char*)0; +} + +int test3() +{ + return "foo" == (const char*)0; +} + +int test4() +{ + return (const char*)0 != "foo"; +} + +int test5() +{ + return (const char*)0 == "foo"; +} + diff --git a/gcc/testsuite/g++.dg/warn/Wstring-literal-comparison-3.C b/gcc/testsuite/g++.dg/warn/Wstring-literal-comparison-3.C new file mode 100644 index 00000000000..f700a51a87b --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wstring-literal-comparison-3.C @@ -0,0 +1,29 @@ +/* PR c/7776 */ +/* { dg-do compile } */ +/* { dg-options "" } */ + +int test1(char *ptr) +{ + return ptr == "foo"; +} + +int test2() +{ + return "foo" != (const char*)0; +} + +int test3() +{ + return "foo" == (const char*)0; +} + +int test4() +{ + return (const char*)0 != "foo"; +} + +int test5() +{ + return (const char*)0 == "foo"; +} + diff --git a/gcc/testsuite/g++.dg/warn/Wstring-literal-comparison-4.C b/gcc/testsuite/g++.dg/warn/Wstring-literal-comparison-4.C new file mode 100644 index 00000000000..27f25f3ca98 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wstring-literal-comparison-4.C @@ -0,0 +1,29 @@ +/* PR c/7776 */ +/* { dg-do compile } */ +/* { dg-options "-Wall -Wno-string-literal-comparison" } */ + +int test1(char *ptr) +{ + return ptr == "foo"; +} + +int test2() +{ + return "foo" != (const char*)0; +} + +int test3() +{ + return "foo" == (const char*)0; +} + +int test4() +{ + return (const char*)0 != "foo"; +} + +int test5() +{ + return (const char*)0 == "foo"; +} +