From cb5c0fb6bd81952456a54789b6ad1d570067ae80 Mon Sep 17 00:00:00 2001 From: Arnaud Giersch Date: Thu, 16 Jan 2020 21:07:45 +0100 Subject: [PATCH] Define and use SwappedContext::verify_previous_context(). It's used by BoostContext to verify that, after a context switch, the originating context as it is expected. --- src/kernel/context/ContextBoost.cpp | 4 ++-- src/kernel/context/ContextSwapped.hpp | 11 +++++++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/kernel/context/ContextBoost.cpp b/src/kernel/context/ContextBoost.cpp index b6da4a1436..759837a4e1 100644 --- a/src/kernel/context/ContextBoost.cpp +++ b/src/kernel/context/ContextBoost.cpp @@ -43,7 +43,7 @@ void BoostContext::wrapper(BoostContext::arg_type arg) BoostContext* context = reinterpret_cast(arg); #else BoostContext* context = static_cast(arg.data)[1]; - ASAN_ONLY(xbt_assert(context->asan_ctx_ == static_cast(arg.data)[0])); + context->verify_previous_context(static_cast(arg.data)[0]); ASAN_FINISH_SWITCH(nullptr, &context->asan_ctx_->asan_stack_, &context->asan_ctx_->asan_stack_size_); static_cast(arg.data)[0]->fc_ = arg.fctx; #endif @@ -72,7 +72,7 @@ void BoostContext::swap_into(SwappedContext* to_) ASAN_ONLY(to->asan_ctx_ = this); ASAN_START_SWITCH(this->asan_stop_ ? nullptr : &fake_stack, to->asan_stack_, to->asan_stack_size_); boost::context::detail::transfer_t arg = boost::context::detail::jump_fcontext(to->fc_, ctx); - ASAN_ONLY(xbt_assert(this->asan_ctx_ == static_cast(arg.data)[0])); + this->verify_previous_context(static_cast(arg.data)[0]); ASAN_FINISH_SWITCH(fake_stack, &this->asan_ctx_->asan_stack_, &this->asan_ctx_->asan_stack_size_); static_cast(arg.data)[0]->fc_ = arg.fctx; #endif diff --git a/src/kernel/context/ContextSwapped.hpp b/src/kernel/context/ContextSwapped.hpp index c495b34b70..cabea51f29 100644 --- a/src/kernel/context/ContextSwapped.hpp +++ b/src/kernel/context/ContextSwapped.hpp @@ -57,6 +57,10 @@ public: bool asan_stop_ = false; #endif +protected: + // With ASan, after a context switch, check that the originating context is the expected one (see BoostContext) + void verify_previous_context(const SwappedContext* context) const; + private: static thread_local SwappedContext* worker_context_; @@ -68,6 +72,13 @@ private: #endif }; +inline void SwappedContext::verify_previous_context(XBT_ATTRIB_UNUSED const SwappedContext* context) const +{ +#if HAVE_SANITIZER_ADDRESS_FIBER_SUPPORT + xbt_assert(this->asan_ctx_ == context); +#endif +} + } // namespace context } // namespace kernel } // namespace simgrid -- 2.20.1