From e9331a56fead1823d528d6412828fb9e16fd62ff Mon Sep 17 00:00:00 2001 From: Adrian Prantl Date: Wed, 8 Jan 2020 14:18:47 -0800 Subject: [PATCH] Add missing nullptr checks. GetPersistentExpressionStateForLanguage() can return a nullptr if it cannot construct a typesystem. This patch adds missing nullptr checks at all uses. Inspired by rdar://problem/58317195 Differential Revision: https://reviews.llvm.org/D72413 --- lldb/source/Expression/REPL.cpp | 2 ++ lldb/source/Expression/UserExpression.cpp | 5 +++-- .../ExpressionParser/Clang/ASTResultSynthesizer.cpp | 5 ++++- .../ExpressionParser/Clang/ClangExpressionDeclMap.cpp | 11 ++++++++--- .../ExpressionParser/Clang/ClangExpressionParser.cpp | 17 +++++++++-------- .../Clang/ClangExpressionSourceCode.cpp | 10 ++++------ .../ExpressionParser/Clang/ClangUserExpression.cpp | 19 +++++++++++-------- lldb/source/Target/ABI.cpp | 2 +- 8 files changed, 42 insertions(+), 29 deletions(-) diff --git a/lldb/source/Expression/REPL.cpp b/lldb/source/Expression/REPL.cpp index 4f81ee3..fcd0836 100644 --- a/lldb/source/Expression/REPL.cpp +++ b/lldb/source/Expression/REPL.cpp @@ -283,6 +283,8 @@ void REPL::IOHandlerInputComplete(IOHandler &io_handler, std::string &code) { PersistentExpressionState *persistent_state = m_target.GetPersistentExpressionStateForLanguage(GetLanguage()); + if (!persistent_state) + return; const size_t var_count_before = persistent_state->GetSize(); diff --git a/lldb/source/Expression/UserExpression.cpp b/lldb/source/Expression/UserExpression.cpp index 271bd9b..3b507da 100644 --- a/lldb/source/Expression/UserExpression.cpp +++ b/lldb/source/Expression/UserExpression.cpp @@ -396,8 +396,9 @@ UserExpression::Execute(DiagnosticManager &diagnostic_manager, diagnostic_manager, exe_ctx, options, shared_ptr_to_me, result_var); Target *target = exe_ctx.GetTargetPtr(); if (options.GetResultIsInternal() && result_var && target) { - target->GetPersistentExpressionStateForLanguage(m_language) - ->RemovePersistentVariable(result_var); + if (auto *persistent_state = + target->GetPersistentExpressionStateForLanguage(m_language)) + persistent_state->RemovePersistentVariable(result_var); } return expr_result; } diff --git a/lldb/source/Plugins/ExpressionParser/Clang/ASTResultSynthesizer.cpp b/lldb/source/Plugins/ExpressionParser/Clang/ASTResultSynthesizer.cpp index 19cab1d..77bb954 100644 --- a/lldb/source/Plugins/ExpressionParser/Clang/ASTResultSynthesizer.cpp +++ b/lldb/source/Plugins/ExpressionParser/Clang/ASTResultSynthesizer.cpp @@ -447,8 +447,11 @@ void ASTResultSynthesizer::RecordPersistentDecl(NamedDecl *D) { } void ASTResultSynthesizer::CommitPersistentDecls() { - PersistentExpressionState *state = + auto *state = m_target.GetPersistentExpressionStateForLanguage(lldb::eLanguageTypeC); + if (!state) + return; + auto *persistent_vars = llvm::cast(state); ClangASTContext *scratch_ctx = ClangASTContext::GetScratch(m_target); diff --git a/lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionDeclMap.cpp b/lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionDeclMap.cpp index 6634824..a302a73c 100644 --- a/lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionDeclMap.cpp +++ b/lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionDeclMap.cpp @@ -126,7 +126,7 @@ void ClangExpressionDeclMap::InstallCodeGenerator( } void ClangExpressionDeclMap::DidParse() { - if (m_parser_vars) { + if (m_parser_vars && m_parser_vars->m_persistent_vars) { for (size_t entity_index = 0, num_entities = m_found_entities.GetSize(); entity_index < num_entities; ++entity_index) { ExpressionVariableSP var_sp( @@ -262,6 +262,9 @@ bool ClangExpressionDeclMap::AddPersistentVariable(const NamedDecl *decl, if (!m_parser_vars->m_target_info.IsValid()) return false; + if (!m_parser_vars->m_persistent_vars) + return false; + ClangExpressionVariable *var = llvm::cast( m_parser_vars->m_persistent_vars ->CreatePersistentVariable( @@ -327,7 +330,7 @@ bool ClangExpressionDeclMap::AddValueToStruct(const NamedDecl *decl, ClangExpressionVariable *var(ClangExpressionVariable::FindVariableInList( m_found_entities, decl, GetParserID())); - if (!var) { + if (!var && m_parser_vars->m_persistent_vars) { var = ClangExpressionVariable::FindVariableInList( *m_parser_vars->m_persistent_vars, decl, GetParserID()); is_persistent_variable = true; @@ -733,6 +736,8 @@ clang::NamedDecl *ClangExpressionDeclMap::GetPersistentDecl(ConstString name) { ClangASTContext::GetScratch(*target); + if (!m_parser_vars->m_persistent_vars) + return nullptr; return m_parser_vars->m_persistent_vars->GetPersistentDecl(name); } @@ -1390,7 +1395,7 @@ void ClangExpressionDeclMap::FindExternalVisibleDecls( return; // No ParserVars means we can't do register or variable lookup. - if (!m_parser_vars) + if (!m_parser_vars || !m_parser_vars->m_persistent_vars) return; ExpressionVariableSP pvar_sp( diff --git a/lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionParser.cpp b/lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionParser.cpp index ebd2d5c..dfd3e0e 100644 --- a/lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionParser.cpp +++ b/lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionParser.cpp @@ -583,15 +583,16 @@ ClangExpressionParser::ClangExpressionParser( if (ClangModulesDeclVendor *decl_vendor = target_sp->GetClangModulesDeclVendor()) { - ClangPersistentVariables *clang_persistent_vars = - llvm::cast( + if (auto *clang_persistent_vars = llvm::cast( target_sp->GetPersistentExpressionStateForLanguage( - lldb::eLanguageTypeC)); - std::unique_ptr pp_callbacks(new LLDBPreprocessorCallbacks( - *decl_vendor, *clang_persistent_vars, m_compiler->getSourceManager())); - m_pp_callbacks = - static_cast(pp_callbacks.get()); - m_compiler->getPreprocessor().addPPCallbacks(std::move(pp_callbacks)); + lldb::eLanguageTypeC))) { + std::unique_ptr pp_callbacks( + new LLDBPreprocessorCallbacks(*decl_vendor, *clang_persistent_vars, + m_compiler->getSourceManager())); + m_pp_callbacks = + static_cast(pp_callbacks.get()); + m_compiler->getPreprocessor().addPPCallbacks(std::move(pp_callbacks)); + } } // 8. Most of this we get from the CompilerInstance, but we also want to give diff --git a/lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionSourceCode.cpp b/lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionSourceCode.cpp index 21cb334..7ebb5fe 100644 --- a/lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionSourceCode.cpp +++ b/lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionSourceCode.cpp @@ -315,12 +315,10 @@ bool ClangExpressionSourceCode::GetText( } } - if (ClangModulesDeclVendor *decl_vendor = - target->GetClangModulesDeclVendor()) { - ClangPersistentVariables *persistent_vars = - llvm::cast( - target->GetPersistentExpressionStateForLanguage( - lldb::eLanguageTypeC)); + ClangModulesDeclVendor *decl_vendor = target->GetClangModulesDeclVendor(); + auto *persistent_vars = llvm::cast( + target->GetPersistentExpressionStateForLanguage(lldb::eLanguageTypeC)); + if (decl_vendor && persistent_vars) { const ClangModulesDeclVendor::ModuleVector &hand_imported_modules = persistent_vars->GetHandLoadedClangModules(); ClangModulesDeclVendor::ModuleVector modules_for_macros; diff --git a/lldb/source/Plugins/ExpressionParser/Clang/ClangUserExpression.cpp b/lldb/source/Plugins/ExpressionParser/Clang/ClangUserExpression.cpp index c6bed45..6698797 100644 --- a/lldb/source/Plugins/ExpressionParser/Clang/ClangUserExpression.cpp +++ b/lldb/source/Plugins/ExpressionParser/Clang/ClangUserExpression.cpp @@ -350,11 +350,12 @@ bool ClangUserExpression::SetupPersistentState(DiagnosticManager &diagnostic_man static void SetupDeclVendor(ExecutionContext &exe_ctx, Target *target) { if (ClangModulesDeclVendor *decl_vendor = target->GetClangModulesDeclVendor()) { + auto *persistent_state = llvm::cast( + target->GetPersistentExpressionStateForLanguage(lldb::eLanguageTypeC)); + if (!persistent_state) + return; const ClangModulesDeclVendor::ModuleVector &hand_imported_modules = - llvm::cast( - target->GetPersistentExpressionStateForLanguage( - lldb::eLanguageTypeC)) - ->GetHandLoadedClangModules(); + persistent_state->GetHandLoadedClangModules(); ClangModulesDeclVendor::ModuleVector modules_for_macros; for (ClangModulesDeclVendor::ModuleID module : hand_imported_modules) { @@ -682,10 +683,12 @@ bool ClangUserExpression::Parse(DiagnosticManager &diagnostic_manager, register_execution_unit = true; } - if (register_execution_unit) - exe_ctx.GetTargetPtr() - ->GetPersistentExpressionStateForLanguage(m_language) - ->RegisterExecutionUnit(m_execution_unit_sp); + if (register_execution_unit) { + if (auto *persistent_state = + exe_ctx.GetTargetPtr()->GetPersistentExpressionStateForLanguage( + m_language)) + persistent_state->RegisterExecutionUnit(m_execution_unit_sp); + } } if (generate_debug_info) { diff --git a/lldb/source/Target/ABI.cpp b/lldb/source/Target/ABI.cpp index 6217ee2e..58396ba 100644 --- a/lldb/source/Target/ABI.cpp +++ b/lldb/source/Target/ABI.cpp @@ -87,7 +87,7 @@ ValueObjectSP ABI::GetReturnValueObject(Thread &thread, CompilerType &ast_type, ast_type.GetMinimumLanguage()); if (!persistent_expression_state) - return ValueObjectSP(); + return {}; auto prefix = persistent_expression_state->GetPersistentVariablePrefix(); ConstString persistent_variable_name = -- 2.7.4