Don't access reference to a vector after pop_back
authorBenjamin Kramer <benny.kra@googlemail.com>
Tue, 7 Apr 2020 21:06:59 +0000 (23:06 +0200)
committerBenjamin Kramer <benny.kra@googlemail.com>
Tue, 7 Apr 2020 21:10:58 +0000 (23:10 +0200)
This is undefined behavior. Found by asan's detect_container_overflow.

lldb/source/Target/ThreadPlanStack.cpp

index 44e47f3..c51946a 100644 (file)
@@ -156,7 +156,7 @@ void ThreadPlanStack::PushPlan(lldb::ThreadPlanSP new_plan_sp) {
 lldb::ThreadPlanSP ThreadPlanStack::PopPlan() {
   assert(m_plans.size() > 1 && "Can't pop the base thread plan");
 
-  lldb::ThreadPlanSP &plan_sp = m_plans.back();
+  lldb::ThreadPlanSP plan_sp = std::move(m_plans.back());
   m_completed_plans.push_back(plan_sp);
   plan_sp->WillPop();
   m_plans.pop_back();
@@ -166,7 +166,7 @@ lldb::ThreadPlanSP ThreadPlanStack::PopPlan() {
 lldb::ThreadPlanSP ThreadPlanStack::DiscardPlan() {
   assert(m_plans.size() > 1 && "Can't discard the base thread plan");
 
-  lldb::ThreadPlanSP &plan_sp = m_plans.back();
+  lldb::ThreadPlanSP plan_sp = std::move(m_plans.back());
   m_discarded_plans.push_back(plan_sp);
   plan_sp->WillPop();
   m_plans.pop_back();