This revision was automatically updated to reflect the committed changes. Closed by commit rGfdb69539bcd2: [AST] Fix potential nullptr dereference in Expr::HasSideEffects (authored by jkorous). Herald added a project: clang. Herald added a subscriber: cfe-commits.
Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D83438/new/ https://reviews.llvm.org/D83438 Files: clang/include/clang/AST/ExprCXX.h clang/lib/AST/Expr.cpp clang/unittests/AST/CMakeLists.txt clang/unittests/AST/HasSideEffectsTest.cpp
Index: clang/unittests/AST/HasSideEffectsTest.cpp =================================================================== --- /dev/null +++ clang/unittests/AST/HasSideEffectsTest.cpp @@ -0,0 +1,86 @@ +//===- unittest/AST/HasSideEffectsTest.cpp --------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "clang/AST/RecursiveASTVisitor.h" +#include "clang/AST/ASTConsumer.h" +#include "clang/AST/ASTContext.h" +#include "clang/AST/Attr.h" +#include "clang/Frontend/FrontendAction.h" +#include "clang/Tooling/Tooling.h" +#include "llvm/ADT/FunctionExtras.h" +#include "llvm/ADT/STLExtras.h" +#include "gmock/gmock.h" +#include "gtest/gtest.h" +#include <cassert> + +using namespace clang; + +namespace { +class ProcessASTAction : public clang::ASTFrontendAction { +public: + ProcessASTAction(llvm::unique_function<void(clang::ASTContext &)> Process) + : Process(std::move(Process)) { + assert(this->Process); + } + + std::unique_ptr<ASTConsumer> CreateASTConsumer(CompilerInstance &CI, + StringRef InFile) { + class Consumer : public ASTConsumer { + public: + Consumer(llvm::function_ref<void(ASTContext &CTx)> Process) + : Process(Process) {} + + void HandleTranslationUnit(ASTContext &Ctx) override { Process(Ctx); } + + private: + llvm::function_ref<void(ASTContext &CTx)> Process; + }; + + return std::make_unique<Consumer>(Process); + } + +private: + llvm::unique_function<void(clang::ASTContext &)> Process; +}; + +class RunHasSideEffects + : public RecursiveASTVisitor<RunHasSideEffects> { +public: + RunHasSideEffects(ASTContext& Ctx) + : Ctx(Ctx) {} + + bool VisitLambdaExpr(LambdaExpr *LE) { + LE->HasSideEffects(Ctx); + return true; + } + + ASTContext& Ctx; +}; +} // namespace + +TEST(HasSideEffectsTest, All) { + llvm::StringRef Code = R"cpp( +void Test() { + int msize = 4; + float arr[msize]; + [&arr] {}; +} + )cpp"; + + ASSERT_NO_FATAL_FAILURE( + clang::tooling::runToolOnCode( + std::make_unique<ProcessASTAction>( + [&](clang::ASTContext &Ctx) { + RunHasSideEffects Visitor(Ctx); + Visitor.TraverseAST(Ctx); + } + ), + Code) + ); + +} Index: clang/unittests/AST/CMakeLists.txt =================================================================== --- clang/unittests/AST/CMakeLists.txt +++ clang/unittests/AST/CMakeLists.txt @@ -26,6 +26,7 @@ DeclTest.cpp EvaluateAsRValueTest.cpp ExternalASTSourceTest.cpp + HasSideEffectsTest.cpp NamedDeclPrinterTest.cpp RecursiveASTVisitorTest.cpp SizelessTypesTest.cpp Index: clang/lib/AST/Expr.cpp =================================================================== --- clang/lib/AST/Expr.cpp +++ clang/lib/AST/Expr.cpp @@ -3629,7 +3629,7 @@ case LambdaExprClass: { const LambdaExpr *LE = cast<LambdaExpr>(this); for (Expr *E : LE->capture_inits()) - if (E->HasSideEffects(Ctx, IncludePossibleEffects)) + if (E && E->HasSideEffects(Ctx, IncludePossibleEffects)) return true; return false; } Index: clang/include/clang/AST/ExprCXX.h =================================================================== --- clang/include/clang/AST/ExprCXX.h +++ clang/include/clang/AST/ExprCXX.h @@ -1931,6 +1931,7 @@ /// Const iterator that walks over the capture initialization /// arguments. + /// FIXME: This interface is prone to being used incorrectly. using const_capture_init_iterator = Expr *const *; /// Retrieve the initialization expressions for this lambda's captures.
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits