Ping. Is it ok to commit this one?
//Anders
________________________________________
Från: Anders Rönnholm
Skickat: den 30 april 2014 08:16
Till: Nico Weber
Cc: Jordan Rose; [email protected]
Ämne: SV: [PATCH] String plus char
I have run it on LibreOffice and LLVM with no bugs found and no false positives
either.
//Anders
________________________________________
Från: [email protected] [[email protected]] för Nico Weber
[[email protected]]
Skickat: den 25 april 2014 17:36
Till: Anders Rönnholm
Cc: Jordan Rose; [email protected]
Ämne: Re: [PATCH] String plus char
Have you run this warning on some large codebase (test codebases we've
used in the past include LLVM itself, Chromium, Firefox, OpenOffice)
and measured how many bugs and false positives it causes?
On Fri, Apr 25, 2014 at 3:24 AM, Anders Rönnholm
<[email protected]> wrote:
> Your right. I think it's a left over from when i first tried to cast it to an
> arraysubscriptexpr.
>
> Here is a new patch with array type removed.
>
> //Anders
> ________________________________________
> Från: Jordan Rose [[email protected]]
> Skickat: den 24 april 2014 18:43
> Till: Anders Rönnholm
> Cc: [email protected]
> Ämne: Re: [PATCH] String plus char
>
> If we're not looking through implicit casts, when would there ever be a case
> when the StringRefExpr is a constant array type? Shouldn't it always decay to
> a pointer?
>
> Jordan
>
>
> On Apr 17, 2014, at 5:19 , Anders Rönnholm <[email protected]>
> wrote:
>
>> Hi,
>>
>> I have made some improvements on the string plus char warning.
>>
>> It can now also handle arrays, struct members and return values from
>> function calls.
>>
>> e.q
>>
>> ab->a + 'b';
>>
>> foo() + 'c';
>>
>> char *strArr2[] = {"ac","dc"};
>> str = strArr2[0] + 'c';
>>
>> //Anders
>> <stringpluschar.diff>_______________________________________________
>> cfe-commits mailing list
>> [email protected]
>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
>
> _______________________________________________
> cfe-commits mailing list
> [email protected]
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
Index: lib/Sema/SemaExpr.cpp
===================================================================
--- lib/Sema/SemaExpr.cpp (revision 224237)
+++ lib/Sema/SemaExpr.cpp (working copy)
@@ -7312,13 +7312,13 @@
/// \brief Emit a warning when adding a char literal to a string.
static void diagnoseStringPlusChar(Sema &Self, SourceLocation OpLoc,
Expr *LHSExpr, Expr *RHSExpr) {
- const DeclRefExpr *StringRefExpr =
- dyn_cast<DeclRefExpr>(LHSExpr->IgnoreImpCasts());
+ const Expr *StringRefExpr = LHSExpr;
const CharacterLiteral *CharExpr =
dyn_cast<CharacterLiteral>(RHSExpr->IgnoreImpCasts());
- if (!StringRefExpr) {
- StringRefExpr = dyn_cast<DeclRefExpr>(RHSExpr->IgnoreImpCasts());
+
+ if (!CharExpr) {
CharExpr = dyn_cast<CharacterLiteral>(LHSExpr->IgnoreImpCasts());
+ StringRefExpr = RHSExpr;
}
if (!CharExpr || !StringRefExpr)
Index: test/Sema/string-plus-char.c
===================================================================
--- test/Sema/string-plus-char.c (revision 224237)
+++ test/Sema/string-plus-char.c (working copy)
@@ -1,5 +1,11 @@
// RUN: %clang_cc1 -fsyntax-only -verify %s
+struct AB{const char *a; const char*b;};
+
+const char *foo(const struct AB *ab) {
+ return ab->a + 'b'; // expected-warning {{adding 'char' to a string pointer does not append to the string}} expected-note {{use array indexing to silence this warning}}
+}
+
void f(const char *s) {
char *str = 0;
char *str2 = str + 'c'; // expected-warning {{adding 'char' to a string pointer does not append to the string}} expected-note {{use array indexing to silence this warning}}
@@ -8,6 +14,15 @@
str = 'c' + str;// expected-warning {{adding 'char' to a string pointer does not append to the string}} expected-note {{use array indexing to silence this warning}}
+ char strArr[] = "foo";
+ str = strArr + 'c'; // expected-warning {{adding 'char' to a string pointer does not append to the string}} expected-note {{use array indexing to silence this warning}}
+ char *strArr2[] = {"ac","dc"};
+ str = strArr2[0] + 'c'; // expected-warning {{adding 'char' to a string pointer does not append to the string}} expected-note {{use array indexing to silence this warning}}
+
+
+ struct AB ab;
+ constStr = foo(&ab) + 'c'; // expected-warning {{adding 'char' to a string pointer does not append to the string}} expected-note {{use array indexing to silence this warning}}
+
// no-warning
char c = 'c';
str = str + c;
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits