r349054 - Make -Wstring-plus-int warns even if when the result is not out of bounds

Evgenii Stepanov via cfe-commits cfe-commits at lists.llvm.org
Thu Dec 13 12:51:13 PST 2018


Hi,

this broke Clang :: SemaCXX/constant-expression-cxx1y.cpp:
http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux-bootstrap-msan/builds/9144

error: 'warning' diagnostics seen but not expected:
  File /b/sanitizer-x86_64-linux-bootstrap-msan/build/llvm/tools/clang/test/SemaCXX/constant-expression-cxx1y.cpp
Line 447: adding 'int' to a string does not append to the string
error: 'note' diagnostics seen but not expected:
  File /b/sanitizer-x86_64-linux-bootstrap-msan/build/llvm/tools/clang/test/SemaCXX/constant-expression-cxx1y.cpp
Line 447: use array indexing to silence this warning
2 errors generated.

On Thu, Dec 13, 2018 at 8:09 AM Sylvestre Ledru via cfe-commits
<cfe-commits at lists.llvm.org> wrote:
>
> Author: sylvestre
> Date: Thu Dec 13 08:06:23 2018
> New Revision: 349054
>
> URL: http://llvm.org/viewvc/llvm-project?rev=349054&view=rev
> Log:
> Make -Wstring-plus-int warns even if when the result is not out of bounds
>
> Summary: Patch by Arnaud Bienner
>
> Reviewers: sylvestre.ledru, thakis
>
> Reviewed By: thakis
>
> Subscribers: cfe-commits
>
> Differential Revision: https://reviews.llvm.org/D55382
>
> Modified:
>     cfe/trunk/lib/Sema/SemaExpr.cpp
>     cfe/trunk/test/SemaCXX/string-plus-int.cpp
>
> Modified: cfe/trunk/lib/Sema/SemaExpr.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExpr.cpp?rev=349054&r1=349053&r2=349054&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaExpr.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaExpr.cpp Thu Dec 13 08:06:23 2018
> @@ -9135,16 +9135,6 @@ static void diagnoseStringPlusInt(Sema &
>    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();
>
> Modified: cfe/trunk/test/SemaCXX/string-plus-int.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/string-plus-int.cpp?rev=349054&r1=349053&r2=349054&view=diff
> ==============================================================================
> --- cfe/trunk/test/SemaCXX/string-plus-int.cpp (original)
> +++ cfe/trunk/test/SemaCXX/string-plus-int.cpp Thu Dec 13 08:06:23 2018
> @@ -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>
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


More information about the cfe-commits mailing list