]>
Commit | Line | Data |
---|---|---|
7e44c9ca PS |
1 | Date: Tue, 14 Jun 2005 00:20:06 -0600 (MDT) |
2 | From: Roger Sayle <roger at eyesopen dot com> | |
3 | Subject: [PATCH] PR 7776: Warn about if ("abc" < "xyz") ... (take 2) | |
4 | ||
5 | The following patch is a revised version of my proposed solution to | |
6 | PR middle-end/7776, which addresses Daniel Jacobowitz's concerns about | |
7 | the potential utility of testing string literals for equality/inequality | |
8 | with NULL. | |
9 | ||
10 | See http://gcc.gnu.org/ml/gcc-patches/2005-06/msg00369.html (and the | |
11 | following thread) for details and motivation. | |
12 | ||
13 | The following patch has been tested on i686-pc-linux-gnu with a full | |
14 | "make bootstrap", all default languages, and regression tested with a | |
15 | top-level "make -k check" with no new failures. | |
16 | ||
17 | Ok for mainline? | |
18 | ||
19 | 2005-06-13 Roger Sayle <roger@eyesopen.com> | |
20 | ||
21 | PR middle-end/7776 | |
22 | * common.opt (Wstring-literal-comparison): New command line option. | |
23 | * c-opts.c (c_common_handle_option): Set it with -Wall. | |
24 | * c-typeck.c (parser_build_binary_op): Issue warning if either | |
25 | operand of a comparison operator is a string literal, except for | |
26 | testing equality or inequality against NULL. | |
27 | ||
28 | * gcc.dg/Wstring-literal-comparison-1.c: New test case. | |
29 | * gcc.dg/Wstring-literal-comparison-2.c: Likewise. | |
30 | * gcc.dg/Wstring-literal-comparison-3.c: Likewise. | |
31 | * gcc.dg/Wstring-literal-comparison-4.c: Likewise. | |
32 | ||
33 | ||
34 | *** a/gcc/common.opt 4 Jun 2005 17:07:55 -0000 1.73 | |
35 | --- b/gcc/common.opt 13 Jun 2005 16:59:28 -0000 | |
36 | *************** Wstrict-aliasing= | |
37 | *** 117,122 **** | |
38 | --- 117,126 ---- | |
39 | Common Joined UInteger | |
40 | Warn about code which might break strict aliasing rules | |
41 | ||
42 | + Wstring-literal-comparison | |
43 | + Common Var(warn_string_literal_comparison) | |
44 | + Warn about comparisons to constant string literals | |
45 | + | |
46 | Wswitch | |
47 | Common Var(warn_switch) | |
48 | Warn about enumerated switches, with no default, missing a case | |
49 | *** a/gcc/c-opts.c 25 May 2005 03:58:55 -0000 1.146 | |
50 | --- b/gcc/c-opts.c 13 Jun 2005 16:59:29 -0000 | |
51 | *************** c_common_handle_option (size_t scode, co | |
52 | *** 370,375 **** | |
53 | --- 370,376 ---- | |
54 | warn_sign_compare = value; | |
55 | warn_switch = value; | |
56 | warn_strict_aliasing = value; | |
57 | + warn_string_literal_comparison = value; | |
58 | ||
59 | /* Only warn about unknown pragmas that are not in system | |
60 | headers. */ | |
61 | *** a/gcc/c-typeck.c 11 Jun 2005 19:47:01 -0000 1.453 | |
62 | --- b/gcc/c-typeck.c 13 Jun 2005 16:59:31 -0000 | |
63 | *************** parser_build_binary_op (enum tree_code c | |
64 | *** 2412,2417 **** | |
65 | --- 2412,2434 ---- | |
66 | ||
67 | } | |
68 | ||
69 | + /* Warn about comparisons against string literals, with the exception | |
70 | + of testing for equality or inequality of a string literal with NULL. */ | |
71 | + if (code == EQ_EXPR || code == NE_EXPR) | |
72 | + { | |
73 | + if ((TREE_CODE (arg1.value) == STRING_CST | |
74 | + && !integer_zerop (arg2.value)) | |
75 | + || (TREE_CODE (arg2.value) == STRING_CST | |
76 | + && !integer_zerop (arg1.value))) | |
77 | + warning (OPT_Wstring_literal_comparison, | |
78 | + "comparison with string literal"); | |
79 | + } | |
80 | + else if (TREE_CODE_CLASS (code) == tcc_comparison | |
81 | + && (TREE_CODE (arg1.value) == STRING_CST | |
82 | + || TREE_CODE (arg2.value) == STRING_CST)) | |
83 | + warning (OPT_Wstring_literal_comparison, | |
84 | + "comparison with string literal"); | |
85 | + | |
86 | unsigned_conversion_warning (result.value, arg1.value); | |
87 | unsigned_conversion_warning (result.value, arg2.value); | |
88 | overflow_warning (result.value); |