diff --git a/lldb/source/Target/ThreadPlanStack.cpp b/lldb/source/Target/ThreadPlanStack.cpp --- a/lldb/source/Target/ThreadPlanStack.cpp +++ b/lldb/source/Target/ThreadPlanStack.cpp @@ -142,7 +142,10 @@ lldb::ThreadPlanSP ThreadPlanStack::PopPlan() { assert(m_plans.size() > 1 && "Can't pop the base thread plan"); - lldb::ThreadPlanSP plan_sp = std::move(m_plans.back()); + // Note that `std::move` on `m_plans` elements can break its non-null + // invariant - if also calling functions (such as `WillPop`) that can't + // guarantee `m_plans` is not accessed in its inconsistent state. + lldb::ThreadPlanSP plan_sp = m_plans.back(); m_completed_plans.push_back(plan_sp); plan_sp->WillPop(); m_plans.pop_back(); @@ -152,7 +155,10 @@ lldb::ThreadPlanSP ThreadPlanStack::DiscardPlan() { assert(m_plans.size() > 1 && "Can't discard the base thread plan"); - lldb::ThreadPlanSP plan_sp = std::move(m_plans.back()); + // Note that `std::move` on `m_plans` elements can break its non-null + // invariant - if also calling functions (such as `WillPop`) that can't + // guarantee `m_plans` is not accessed in its inconsistent state. + lldb::ThreadPlanSP plan_sp = m_plans.back(); m_discarded_plans.push_back(plan_sp); plan_sp->WillPop(); m_plans.pop_back();