Author: Tatyana Krasnukha Date: 2020-02-18T13:49:07+03:00 New Revision: b624b7dfd087809fb58bff0737750e75375fe450
URL: https://github.com/llvm/llvm-project/commit/b624b7dfd087809fb58bff0737750e75375fe450 DIFF: https://github.com/llvm/llvm-project/commit/b624b7dfd087809fb58bff0737750e75375fe450.diff LOG: [lldb] Make shared_from_this-related code safer Pass TargetSP to filters' CreateFromStructuredData, don't let them guess whether target object is managed by a shared_ptr. Make Breakpoint sure that m_target.shared_from_this() is safe by passing TargetSP to all its static Create*** member-functions. This should be enough, since Breakpoint's constructors are private/protected and never called directly (except by Target itself). Added: Modified: lldb/include/lldb/Breakpoint/Breakpoint.h lldb/include/lldb/Core/SearchFilter.h lldb/source/Breakpoint/Breakpoint.cpp lldb/source/Core/SearchFilter.cpp lldb/source/Target/Target.cpp Removed: ################################################################################ diff --git a/lldb/include/lldb/Breakpoint/Breakpoint.h b/lldb/include/lldb/Breakpoint/Breakpoint.h index c48a0ad73d4e..bdff7772fc6b 100644 --- a/lldb/include/lldb/Breakpoint/Breakpoint.h +++ b/lldb/include/lldb/Breakpoint/Breakpoint.h @@ -142,7 +142,8 @@ class Breakpoint : public std::enable_shared_from_this<Breakpoint>, // Saving & restoring breakpoints: static lldb::BreakpointSP CreateFromStructuredData( - Target &target, StructuredData::ObjectSP &data_object_sp, Status &error); + lldb::TargetSP target_sp, StructuredData::ObjectSP &data_object_sp, + Status &error); static bool SerializedBreakpointMatchesNames(StructuredData::ObjectSP &bkpt_object_sp, @@ -570,7 +571,7 @@ class Breakpoint : public std::enable_shared_from_this<Breakpoint>, // This one should only be used by Target to copy breakpoints from target to // target - primarily from the dummy target to prime new targets. - static lldb::BreakpointSP CopyFromBreakpoint(Target& new_target, + static lldb::BreakpointSP CopyFromBreakpoint(lldb::TargetSP new_target, const Breakpoint &bp_to_copy_from); protected: diff --git a/lldb/include/lldb/Core/SearchFilter.h b/lldb/include/lldb/Core/SearchFilter.h index ab5dc962230f..8846ec0cf922 100644 --- a/lldb/include/lldb/Core/SearchFilter.h +++ b/lldb/include/lldb/Core/SearchFilter.h @@ -190,7 +190,7 @@ class SearchFilter { lldb::SearchFilterSP CopyForBreakpoint(Breakpoint &breakpoint); static lldb::SearchFilterSP - CreateFromStructuredData(Target &target, + CreateFromStructuredData(const lldb::TargetSP& target_sp, const StructuredData::Dictionary &data_dict, Status &error); @@ -288,7 +288,7 @@ class SearchFilterForUnconstrainedSearches : public SearchFilter { bool ModulePasses(const lldb::ModuleSP &module_sp) override; static lldb::SearchFilterSP - CreateFromStructuredData(Target &target, + CreateFromStructuredData(const lldb::TargetSP& target_sp, const StructuredData::Dictionary &data_dict, Status &error); @@ -334,7 +334,7 @@ class SearchFilterByModule : public SearchFilter { void Search(Searcher &searcher) override; static lldb::SearchFilterSP - CreateFromStructuredData(Target &target, + CreateFromStructuredData(const lldb::TargetSP& target_sp, const StructuredData::Dictionary &data_dict, Status &error); @@ -385,7 +385,7 @@ class SearchFilterByModuleList : public SearchFilter { void Search(Searcher &searcher) override; static lldb::SearchFilterSP - CreateFromStructuredData(Target &target, + CreateFromStructuredData(const lldb::TargetSP& target_sp, const StructuredData::Dictionary &data_dict, Status &error); @@ -425,7 +425,7 @@ class SearchFilterByModuleListAndCU : public SearchFilterByModuleList { void Search(Searcher &searcher) override; static lldb::SearchFilterSP - CreateFromStructuredData(Target &target, + CreateFromStructuredData(const lldb::TargetSP& target_sp, const StructuredData::Dictionary &data_dict, Status &error); diff --git a/lldb/source/Breakpoint/Breakpoint.cpp b/lldb/source/Breakpoint/Breakpoint.cpp index 39c6828d3f09..09122cfc2bfa 100644 --- a/lldb/source/Breakpoint/Breakpoint.cpp +++ b/lldb/source/Breakpoint/Breakpoint.cpp @@ -66,9 +66,12 @@ Breakpoint::Breakpoint(Target &new_target, const Breakpoint &source_bp) // Destructor Breakpoint::~Breakpoint() = default; -BreakpointSP Breakpoint::CopyFromBreakpoint(Target& new_target, +BreakpointSP Breakpoint::CopyFromBreakpoint(TargetSP new_target, const Breakpoint& bp_to_copy_from) { - BreakpointSP bp(new Breakpoint(new_target, bp_to_copy_from)); + if (!new_target) + return BreakpointSP(); + + BreakpointSP bp(new Breakpoint(*new_target, bp_to_copy_from)); // Now go through and copy the filter & resolver: bp->m_resolver_sp = bp_to_copy_from.m_resolver_sp->CopyForBreakpoint(*bp); bp->m_filter_sp = bp_to_copy_from.m_filter_sp->CopyForBreakpoint(*bp); @@ -125,8 +128,10 @@ StructuredData::ObjectSP Breakpoint::SerializeToStructuredData() { } lldb::BreakpointSP Breakpoint::CreateFromStructuredData( - Target &target, StructuredData::ObjectSP &object_data, Status &error) { + TargetSP target_sp, StructuredData::ObjectSP &object_data, Status &error) { BreakpointSP result_sp; + if (!target_sp) + return result_sp; StructuredData::Dictionary *breakpoint_dict = object_data->GetAsDictionary(); @@ -160,11 +165,11 @@ lldb::BreakpointSP Breakpoint::CreateFromStructuredData( SearchFilter::GetSerializationKey(), filter_dict); SearchFilterSP filter_sp; if (!success) - filter_sp = std::make_shared<SearchFilterForUnconstrainedSearches>( - target.shared_from_this()); + filter_sp = + std::make_shared<SearchFilterForUnconstrainedSearches>(target_sp); else { - filter_sp = SearchFilter::CreateFromStructuredData(target, *filter_dict, - create_error); + filter_sp = SearchFilter::CreateFromStructuredData(target_sp, *filter_dict, + create_error); if (create_error.Fail()) { error.SetErrorStringWithFormat( "Error creating breakpoint filter from data: %s.", @@ -175,6 +180,7 @@ lldb::BreakpointSP Breakpoint::CreateFromStructuredData( std::unique_ptr<BreakpointOptions> options_up; StructuredData::Dictionary *options_dict; + Target& target = *target_sp; success = breakpoint_dict->GetValueForKeyAsDictionary( BreakpointOptions::GetSerializationKey(), options_dict); if (success) { @@ -192,8 +198,8 @@ lldb::BreakpointSP Breakpoint::CreateFromStructuredData( success = breakpoint_dict->GetValueForKeyAsBoolean( Breakpoint::GetKey(OptionNames::Hardware), hardware); - result_sp = - target.CreateBreakpoint(filter_sp, resolver_sp, false, hardware, true); + result_sp = target.CreateBreakpoint(filter_sp, resolver_sp, false, + hardware, true); if (result_sp && options_up) { result_sp->m_options_up = std::move(options_up); diff --git a/lldb/source/Core/SearchFilter.cpp b/lldb/source/Core/SearchFilter.cpp index 64d22797a224..a42fa968656f 100644 --- a/lldb/source/Core/SearchFilter.cpp +++ b/lldb/source/Core/SearchFilter.cpp @@ -75,7 +75,8 @@ SearchFilter::SearchFilter(const TargetSP &target_sp, unsigned char filterType) SearchFilter::~SearchFilter() = default; SearchFilterSP SearchFilter::CreateFromStructuredData( - Target &target, const StructuredData::Dictionary &filter_dict, + const lldb::TargetSP& target_sp, + const StructuredData::Dictionary &filter_dict, Status &error) { SearchFilterSP result_sp; if (!filter_dict.IsValid()) { @@ -109,19 +110,19 @@ SearchFilterSP SearchFilter::CreateFromStructuredData( switch (filter_type) { case Unconstrained: result_sp = SearchFilterForUnconstrainedSearches::CreateFromStructuredData( - target, *subclass_options, error); + target_sp, *subclass_options, error); break; case ByModule: result_sp = SearchFilterByModule::CreateFromStructuredData( - target, *subclass_options, error); + target_sp, *subclass_options, error); break; case ByModules: result_sp = SearchFilterByModuleList::CreateFromStructuredData( - target, *subclass_options, error); + target_sp, *subclass_options, error); break; case ByModulesAndCU: result_sp = SearchFilterByModuleListAndCU::CreateFromStructuredData( - target, *subclass_options, error); + target_sp, *subclass_options, error); break; case Exception: error.SetErrorString("Can't serialize exception breakpoints yet."); @@ -212,7 +213,7 @@ void SearchFilter::Search(Searcher &searcher) { searcher.SearchCallback(*this, empty_sc, nullptr); return; } - + DoModuleIteration(empty_sc, searcher); } @@ -362,11 +363,11 @@ Searcher::CallbackReturn SearchFilter::DoFunctionIteration( // Selects a shared library matching a given file spec, consulting the targets // "black list". SearchFilterSP SearchFilterForUnconstrainedSearches::CreateFromStructuredData( - Target &target, const StructuredData::Dictionary &data_dict, + const lldb::TargetSP& target_sp, + const StructuredData::Dictionary &data_dict, Status &error) { // No options for an unconstrained search. - return std::make_shared<SearchFilterForUnconstrainedSearches>( - target.shared_from_this()); + return std::make_shared<SearchFilterForUnconstrainedSearches>(target_sp); } StructuredData::ObjectSP @@ -472,7 +473,8 @@ SearchFilterByModule::DoCopyForBreakpoint(Breakpoint &breakpoint) { } SearchFilterSP SearchFilterByModule::CreateFromStructuredData( - Target &target, const StructuredData::Dictionary &data_dict, + const lldb::TargetSP& target_sp, + const StructuredData::Dictionary &data_dict, Status &error) { StructuredData::Array *modules_array; bool success = data_dict.GetValueForKeyAsArray(GetKey(OptionNames::ModList), @@ -497,8 +499,7 @@ SearchFilterSP SearchFilterByModule::CreateFromStructuredData( } FileSpec module_spec(module); - return std::make_shared<SearchFilterByModule>(target.shared_from_this(), - module_spec); + return std::make_shared<SearchFilterByModule>(target_sp, module_spec); } StructuredData::ObjectSP SearchFilterByModule::SerializeToStructuredData() { @@ -617,14 +618,15 @@ SearchFilterByModuleList::DoCopyForBreakpoint(Breakpoint &breakpoint) { } SearchFilterSP SearchFilterByModuleList::CreateFromStructuredData( - Target &target, const StructuredData::Dictionary &data_dict, + const lldb::TargetSP& target_sp, + const StructuredData::Dictionary &data_dict, Status &error) { StructuredData::Array *modules_array; bool success = data_dict.GetValueForKeyAsArray(GetKey(OptionNames::ModList), modules_array); if (!success) - return std::make_shared<SearchFilterByModuleList>(target.shared_from_this(), + return std::make_shared<SearchFilterByModuleList>(target_sp, FileSpecList{}); FileSpecList modules; size_t num_modules = modules_array->GetSize(); @@ -638,8 +640,7 @@ SearchFilterSP SearchFilterByModuleList::CreateFromStructuredData( } modules.EmplaceBack(module); } - return std::make_shared<SearchFilterByModuleList>(target.shared_from_this(), - modules); + return std::make_shared<SearchFilterByModuleList>(target_sp, modules); } void SearchFilterByModuleList::SerializeUnwrapped( @@ -667,7 +668,8 @@ SearchFilterByModuleListAndCU::SearchFilterByModuleListAndCU( SearchFilterByModuleListAndCU::~SearchFilterByModuleListAndCU() = default; lldb::SearchFilterSP SearchFilterByModuleListAndCU::CreateFromStructuredData( - Target &target, const StructuredData::Dictionary &data_dict, + const lldb::TargetSP& target_sp, + const StructuredData::Dictionary &data_dict, Status &error) { StructuredData::Array *modules_array = nullptr; SearchFilterSP result_sp; @@ -710,7 +712,7 @@ lldb::SearchFilterSP SearchFilterByModuleListAndCU::CreateFromStructuredData( } return std::make_shared<SearchFilterByModuleListAndCU>( - target.shared_from_this(), modules, cus); + target_sp, modules, cus); } StructuredData::ObjectSP diff --git a/lldb/source/Target/Target.cpp b/lldb/source/Target/Target.cpp index 49cb52bb0498..a867d6916f2d 100644 --- a/lldb/source/Target/Target.cpp +++ b/lldb/source/Target/Target.cpp @@ -131,7 +131,8 @@ void Target::PrimeFromDummyTarget(Target *target) { if (breakpoint_sp->IsInternal()) continue; - BreakpointSP new_bp(Breakpoint::CopyFromBreakpoint(*this, *breakpoint_sp)); + BreakpointSP new_bp( + Breakpoint::CopyFromBreakpoint(shared_from_this(), *breakpoint_sp)); AddBreakpoint(std::move(new_bp), false); } @@ -1108,8 +1109,8 @@ Status Target::CreateBreakpointsFromFile(const FileSpec &file, !Breakpoint::SerializedBreakpointMatchesNames(bkpt_data_sp, names)) continue; - BreakpointSP bkpt_sp = - Breakpoint::CreateFromStructuredData(*this, bkpt_data_sp, error); + BreakpointSP bkpt_sp = Breakpoint::CreateFromStructuredData( + shared_from_this(), bkpt_data_sp, error); if (!error.Success()) { error.SetErrorStringWithFormat( "Error restoring breakpoint %zu from %s: %s.", i, _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits