diff options
author | Arnaud Bienner <arnaud.bienner@gmail.com> | 2019-01-03 17:45:28 +0000 |
---|---|---|
committer | Arnaud Bienner <arnaud.bienner@gmail.com> | 2019-01-03 17:45:28 +0000 |
commit | 57fc9582f97feb9e2a22bfa647b9f49d7bf2d1b3 (patch) | |
tree | faaf5f66dfea3bbe1b95643f572c888b3049cd6d | |
parent | 0785e7307ef76168d1a58faa9ea44afc5a6aab1c (diff) | |
download | bcm5719-llvm-57fc9582f97feb9e2a22bfa647b9f49d7bf2d1b3.tar.gz bcm5719-llvm-57fc9582f97feb9e2a22bfa647b9f49d7bf2d1b3.zip |
Make -Wstring-plus-int warns even if when the result is not out of bounds
Summary: Patch by Arnaud Bienner
Reviewers: sylvestre.ledru, thakis, serge-sans-paille
Reviewed By: thakis
Subscribers: arphaman, dyung, anemet, llvm-commits, cfe-commits
Differential Revision: https://reviews.llvm.org/D55382
llvm-svn: 350335
-rw-r--r-- | clang/bindings/python/tests/cindex/test_diagnostics.py | 4 | ||||
-rw-r--r-- | clang/lib/Sema/SemaExpr.cpp | 10 | ||||
-rw-r--r-- | clang/test/SemaCXX/string-plus-int.cpp | 23 |
3 files changed, 13 insertions, 24 deletions
diff --git a/clang/bindings/python/tests/cindex/test_diagnostics.py b/clang/bindings/python/tests/cindex/test_diagnostics.py index 79d7a5fd411..c17d5b28efe 100644 --- a/clang/bindings/python/tests/cindex/test_diagnostics.py +++ b/clang/bindings/python/tests/cindex/test_diagnostics.py @@ -51,7 +51,7 @@ class TestDiagnostics(unittest.TestCase): self.assertEqual(tu.diagnostics[0].fixits[0].value, '.f0 = ') def test_diagnostic_range(self): - tu = get_tu('void f() { int i = "a" + 1; }') + tu = get_tu('void f() { int i = "a"; }') self.assertEqual(len(tu.diagnostics), 1) self.assertEqual(tu.diagnostics[0].severity, Diagnostic.Warning) self.assertEqual(tu.diagnostics[0].location.line, 1) @@ -63,7 +63,7 @@ class TestDiagnostics(unittest.TestCase): self.assertEqual(tu.diagnostics[0].ranges[0].start.line, 1) self.assertEqual(tu.diagnostics[0].ranges[0].start.column, 20) self.assertEqual(tu.diagnostics[0].ranges[0].end.line, 1) - self.assertEqual(tu.diagnostics[0].ranges[0].end.column, 27) + self.assertEqual(tu.diagnostics[0].ranges[0].end.column, 23) with self.assertRaises(IndexError): tu.diagnostics[0].ranges[1].start.line diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index d38ae0fdc84..f8b991b7c74 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -9143,16 +9143,6 @@ static void diagnoseStringPlusInt(Sema &Self, SourceLocation OpLoc, if (!IsStringPlusInt || IndexExpr->isValueDependent()) return; - Expr::EvalResult Result; - if (IndexExpr->EvaluateAsInt(Result, Self.getASTContext())) { - llvm::APSInt index = Result.Val.getInt(); - unsigned StrLenWithNull = StrExpr->getLength() + 1; - if (index.isNonNegative() && - index <= llvm::APSInt(llvm::APInt(index.getBitWidth(), StrLenWithNull), - index.isUnsigned())) - return; - } - SourceRange DiagRange(LHSExpr->getBeginLoc(), RHSExpr->getEndLoc()); Self.Diag(OpLoc, diag::warn_string_plus_int) << DiagRange << IndexExpr->IgnoreImpCasts()->getType(); diff --git a/clang/test/SemaCXX/string-plus-int.cpp b/clang/test/SemaCXX/string-plus-int.cpp index fe9c7194969..448fb49fb49 100644 --- a/clang/test/SemaCXX/string-plus-int.cpp +++ b/clang/test/SemaCXX/string-plus-int.cpp @@ -31,37 +31,36 @@ void f(int index) { consume("foo" + 5); // expected-warning {{adding 'int' to a string does not append to the string}} expected-note {{use array indexing to silence this warning}} consume("foo" + index); // expected-warning {{adding 'int' to a string does not append to the string}} expected-note {{use array indexing to silence this warning}} consume("foo" + kMyEnum); // expected-warning {{adding 'MyEnum' to a string does not append to the string}} expected-note {{use array indexing to silence this warning}} + consume("foo" + kMySmallEnum); // expected-warning {{adding 'MyEnum' to a string does not append to the string}} expected-note {{use array indexing to silence this warning}} consume(5 + "foo"); // expected-warning {{adding 'int' to a string does not append to the string}} expected-note {{use array indexing to silence this warning}} consume(index + "foo"); // expected-warning {{adding 'int' to a string does not append to the string}} expected-note {{use array indexing to silence this warning}} consume(kMyEnum + "foo"); // expected-warning {{adding 'MyEnum' to a string does not append to the string}} expected-note {{use array indexing to silence this warning}} + consume(kMySmallEnum + "foo"); // expected-warning {{adding 'MyEnum' to a string does not append to the string}} expected-note {{use array indexing to silence this warning}} // FIXME: suggest replacing with "foo"[5] consumeChar(*("foo" + 5)); // expected-warning {{adding 'int' to a string does not append to the string}} expected-note {{use array indexing to silence this warning}} consumeChar(*(5 + "foo")); // expected-warning {{adding 'int' to a string does not append to the string}} expected-note {{use array indexing to silence this warning}} consume(L"foo" + 5); // expected-warning {{adding 'int' to a string does not append to the string}} expected-note {{use array indexing to silence this warning}} + consume(L"foo" + 2); // expected-warning {{adding 'int' to a string does not append to the string}} expected-note {{use array indexing to silence this warning}} + + consume("foo" + 3); // expected-warning {{adding 'int' to a string does not append to the string}} expected-note {{use array indexing to silence this warning}} + consume("foo" + 4); // expected-warning {{adding 'int' to a string does not append to the string}} expected-note {{use array indexing to silence this warning}} + consume("\pfoo" + 4); // expected-warning {{adding 'int' to a string does not append to the string}} expected-note {{use array indexing to silence this warning}} + + #define A "foo" + #define B "bar" + consume(A B + sizeof(A) - 1); // expected-warning {{to a string does not append to the string}} expected-note {{use array indexing to silence this warning}} // Should not warn. consume(&("foo"[3])); consume(&("foo"[index])); consume(&("foo"[kMyEnum])); - consume("foo" + kMySmallEnum); - consume(kMySmallEnum + "foo"); - consume(L"foo" + 2); - - consume("foo" + 3); // Points at the \0 - consume("foo" + 4); // Points 1 past the \0, which is legal too. - consume("\pfoo" + 4); // Pascal strings don't have a trailing \0, but they - // have a leading length byte, so this is fine too. consume("foo" + kMyOperatorOverloadedEnum); consume(kMyOperatorOverloadedEnum + "foo"); - - #define A "foo" - #define B "bar" - consume(A B + sizeof(A) - 1); } template <typename T> |