https://github.com/cor3ntin updated https://github.com/llvm/llvm-project/pull/91718
>From fe25f0455d84ea3fd0d8dd988be6ae907f6661c2 Mon Sep 17 00:00:00 2001 From: Corentin Jabot <corentinja...@gmail.com> Date: Fri, 10 May 2024 10:55:20 +0200 Subject: [PATCH 1/2] [Clang] Fix Undefined Behavior introduced by #91199 We stacked allocated an OpaqueExpr that woukd be used after it was destroyed. --- clang/lib/Sema/SemaExprCXX.cpp | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/clang/lib/Sema/SemaExprCXX.cpp b/clang/lib/Sema/SemaExprCXX.cpp index ae844bc699143..1bd40a4b5db7e 100644 --- a/clang/lib/Sema/SemaExprCXX.cpp +++ b/clang/lib/Sema/SemaExprCXX.cpp @@ -5630,7 +5630,8 @@ static bool EvaluateBinaryTypeTrait(Sema &Self, TypeTrait BTT, const TypeSourceI static ExprResult CheckConvertibilityForTypeTraits(Sema &Self, const TypeSourceInfo *Lhs, const TypeSourceInfo *Rhs, - SourceLocation KeyLoc) { + SourceLocation KeyLoc, + llvm::BumpPtrAllocator & OpaqueExprAllocator) { QualType LhsT = Lhs->getType(); QualType RhsT = Rhs->getType(); @@ -5675,9 +5676,9 @@ static ExprResult CheckConvertibilityForTypeTraits(Sema &Self, // Build a fake source and destination for initialization. InitializedEntity To(InitializedEntity::InitializeTemporary(RhsT)); - OpaqueValueExpr From(KeyLoc, LhsT.getNonLValueExprType(Self.Context), + Expr* From = new (OpaqueExprAllocator.Allocate<OpaqueValueExpr>()) + OpaqueValueExpr(KeyLoc, LhsT.getNonLValueExprType(Self.Context), Expr::getValueKindForType(LhsT)); - Expr *FromPtr = &From; InitializationKind Kind = InitializationKind::CreateCopy(KeyLoc, SourceLocation()); @@ -5687,11 +5688,11 @@ static ExprResult CheckConvertibilityForTypeTraits(Sema &Self, Self, Sema::ExpressionEvaluationContext::Unevaluated); Sema::SFINAETrap SFINAE(Self, /*AccessCheckingSFINAE=*/true); Sema::ContextRAII TUContext(Self, Self.Context.getTranslationUnitDecl()); - InitializationSequence Init(Self, To, Kind, FromPtr); + InitializationSequence Init(Self, To, Kind, From); if (Init.Failed()) return ExprError(); - ExprResult Result = Init.Perform(Self, To, Kind, FromPtr); + ExprResult Result = Init.Perform(Self, To, Kind, From); if (Result.isInvalid() || SFINAE.hasErrorOccurred()) return ExprError(); @@ -5819,7 +5820,7 @@ static bool EvaluateBooleanTypeTrait(Sema &S, TypeTrait Kind, S.Context.getPointerType(T.getNonReferenceType())); TypeSourceInfo *UPtr = S.Context.CreateTypeSourceInfo( S.Context.getPointerType(U.getNonReferenceType())); - return !CheckConvertibilityForTypeTraits(S, UPtr, TPtr, RParenLoc) + return !CheckConvertibilityForTypeTraits(S, UPtr, TPtr, RParenLoc, OpaqueExprAllocator) .isInvalid(); } @@ -6028,9 +6029,9 @@ static bool EvaluateBinaryTypeTrait(Sema &Self, TypeTrait BTT, const TypeSourceI case BTT_IsNothrowConvertible: { if (RhsT->isVoidType()) return LhsT->isVoidType(); - + llvm::BumpPtrAllocator OpaqueExprAllocator; ExprResult Result = - CheckConvertibilityForTypeTraits(Self, Lhs, Rhs, KeyLoc); + CheckConvertibilityForTypeTraits(Self, Lhs, Rhs, KeyLoc, OpaqueExprAllocator); if (Result.isInvalid()) return false; >From 559084f20614cd8b4f716fab1f7b4a7ba58d3cde Mon Sep 17 00:00:00 2001 From: Corentin Jabot <corentinja...@gmail.com> Date: Fri, 10 May 2024 11:08:08 +0200 Subject: [PATCH 2/2] Format --- clang/lib/Sema/SemaExprCXX.cpp | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/clang/lib/Sema/SemaExprCXX.cpp b/clang/lib/Sema/SemaExprCXX.cpp index 1bd40a4b5db7e..c181092113e1f 100644 --- a/clang/lib/Sema/SemaExprCXX.cpp +++ b/clang/lib/Sema/SemaExprCXX.cpp @@ -5627,11 +5627,9 @@ static bool EvaluateUnaryTypeTrait(Sema &Self, TypeTrait UTT, static bool EvaluateBinaryTypeTrait(Sema &Self, TypeTrait BTT, const TypeSourceInfo *Lhs, const TypeSourceInfo *Rhs, SourceLocation KeyLoc); -static ExprResult CheckConvertibilityForTypeTraits(Sema &Self, - const TypeSourceInfo *Lhs, - const TypeSourceInfo *Rhs, - SourceLocation KeyLoc, - llvm::BumpPtrAllocator & OpaqueExprAllocator) { +static ExprResult CheckConvertibilityForTypeTraits( + Sema &Self, const TypeSourceInfo *Lhs, const TypeSourceInfo *Rhs, + SourceLocation KeyLoc, llvm::BumpPtrAllocator &OpaqueExprAllocator) { QualType LhsT = Lhs->getType(); QualType RhsT = Rhs->getType(); @@ -5676,9 +5674,9 @@ static ExprResult CheckConvertibilityForTypeTraits(Sema &Self, // Build a fake source and destination for initialization. InitializedEntity To(InitializedEntity::InitializeTemporary(RhsT)); - Expr* From = new (OpaqueExprAllocator.Allocate<OpaqueValueExpr>()) - OpaqueValueExpr(KeyLoc, LhsT.getNonLValueExprType(Self.Context), - Expr::getValueKindForType(LhsT)); + Expr *From = new (OpaqueExprAllocator.Allocate<OpaqueValueExpr>()) + OpaqueValueExpr(KeyLoc, LhsT.getNonLValueExprType(Self.Context), + Expr::getValueKindForType(LhsT)); InitializationKind Kind = InitializationKind::CreateCopy(KeyLoc, SourceLocation()); @@ -5820,7 +5818,8 @@ static bool EvaluateBooleanTypeTrait(Sema &S, TypeTrait Kind, S.Context.getPointerType(T.getNonReferenceType())); TypeSourceInfo *UPtr = S.Context.CreateTypeSourceInfo( S.Context.getPointerType(U.getNonReferenceType())); - return !CheckConvertibilityForTypeTraits(S, UPtr, TPtr, RParenLoc, OpaqueExprAllocator) + return !CheckConvertibilityForTypeTraits(S, UPtr, TPtr, RParenLoc, + OpaqueExprAllocator) .isInvalid(); } @@ -6030,8 +6029,8 @@ static bool EvaluateBinaryTypeTrait(Sema &Self, TypeTrait BTT, const TypeSourceI if (RhsT->isVoidType()) return LhsT->isVoidType(); llvm::BumpPtrAllocator OpaqueExprAllocator; - ExprResult Result = - CheckConvertibilityForTypeTraits(Self, Lhs, Rhs, KeyLoc, OpaqueExprAllocator); + ExprResult Result = CheckConvertibilityForTypeTraits(Self, Lhs, Rhs, KeyLoc, + OpaqueExprAllocator); if (Result.isInvalid()) return false; _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits