Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
[sonar] Use unsigned char* for context stacks.
authorArnaud Giersch <arnaud.giersch@univ-fcomte.fr>
Wed, 6 Mar 2019 16:51:30 +0000 (17:51 +0100)
committerArnaud Giersch <arnaud.giersch@univ-fcomte.fr>
Wed, 6 Mar 2019 17:33:38 +0000 (18:33 +0100)
src/kernel/context/Context.hpp
src/kernel/context/ContextBoost.cpp
src/kernel/context/ContextSwapped.cpp
src/kernel/context/ContextSwapped.hpp
src/simix/smx_global.cpp

index 97b99e2..c02dd39 100644 (file)
@@ -104,7 +104,7 @@ XBT_PRIVATE void SIMIX_context_mod_init();
 XBT_PRIVATE void SIMIX_context_mod_exit();
 
 #ifndef WIN32
-XBT_PUBLIC_DATA char sigsegv_stack[SIGSTKSZ];
+XBT_PUBLIC_DATA unsigned char sigsegv_stack[SIGSTKSZ];
 #endif
 
 /** @brief Executes all the processes to run (in parallel if possible). */
index 4298641..95743c6 100644 (file)
@@ -31,9 +31,9 @@ BoostContext::BoostContext(std::function<void()> code, smx_actor_t actor, Swappe
     /* We need to pass the bottom of the stack to make_fcontext,
        depending on the stack direction it may be the lower or higher address: */
 #if PTH_STACKGROWTH == -1
-    void* stack = static_cast<char*>(get_stack()) + smx_context_usable_stack_size;
+    unsigned char* stack = get_stack() + smx_context_usable_stack_size;
 #else
-    void* stack = get_stack();
+    unsigned char* stack = get_stack();
 #endif
 #if BOOST_VERSION < 106100
     this->fc_ = boost::context::make_fcontext(stack, smx_context_usable_stack_size, BoostContext::wrapper);
index 9f40217..9aabd63 100644 (file)
@@ -71,14 +71,16 @@ SwappedContext::SwappedContext(std::function<void()> code, smx_actor_t actor, Sw
 #if SIMGRID_HAVE_MC
       /* Cannot use posix_memalign when SIMGRID_HAVE_MC. Align stack by hand, and save the
        * pointer returned by xbt_malloc0. */
-      char* alloc           = (char*)xbt_malloc0(size + xbt_pagesize);
-      stack_                = alloc - ((uintptr_t)alloc & (xbt_pagesize - 1)) + xbt_pagesize;
-      *((void**)stack_ - 1) = alloc;
+      unsigned char* alloc = static_cast<unsigned char*>(xbt_malloc0(size + xbt_pagesize));
+      stack_               = alloc - (reinterpret_cast<uintptr_t>(alloc) & (xbt_pagesize - 1)) + xbt_pagesize;
+      reinterpret_cast<unsigned char**>(stack_)[-1] = alloc;
 #elif !defined(_WIN32)
-      if (posix_memalign(&this->stack_, xbt_pagesize, size) != 0)
+      void* alloc;
+      if (posix_memalign(&alloc, xbt_pagesize, size) != 0)
         xbt_die("Failed to allocate stack.");
+      this->stack_ = static_cast<unsigned char*>(alloc);
 #else
-      this->stack_ = _aligned_malloc(size, xbt_pagesize);
+      this->stack_ = static_cast<unsigned char*>(_aligned_malloc(size, xbt_pagesize));
 #endif
 
 #ifndef _WIN32
@@ -93,20 +95,19 @@ SwappedContext::SwappedContext(std::function<void()> code, smx_actor_t actor, Sw
         /* This is fatal. We are going to fail at some point when we try reusing this. */
       }
 #endif
-      this->stack_ = (char*)this->stack_ + smx_context_guard_size;
+      this->stack_ = this->stack_ + smx_context_guard_size;
     } else {
-      this->stack_ = xbt_malloc0(smx_context_stack_size);
+      this->stack_ = static_cast<unsigned char*>(xbt_malloc0(smx_context_stack_size));
     }
 
 #if PTH_STACKGROWTH == -1
-    ASAN_ONLY(this->asan_stack_ = static_cast<char*>(this->stack_) + smx_context_usable_stack_size);
+    ASAN_ONLY(this->asan_stack_ = this->stack_ + smx_context_usable_stack_size);
 #else
     ASAN_ONLY(this->asan_stack_ = this->stack_);
 #endif
 #if HAVE_VALGRIND_H
-    unsigned int valgrind_stack_id =
-        VALGRIND_STACK_REGISTER(this->stack_, (char*)this->stack_ + smx_context_stack_size);
-    memcpy((char*)this->stack_ + smx_context_usable_stack_size, &valgrind_stack_id, sizeof valgrind_stack_id);
+    unsigned int valgrind_stack_id = VALGRIND_STACK_REGISTER(this->stack_, this->stack_ + smx_context_stack_size);
+    memcpy(this->stack_ + smx_context_usable_stack_size, &valgrind_stack_id, sizeof valgrind_stack_id);
 #endif
   }
 }
@@ -118,20 +119,20 @@ SwappedContext::~SwappedContext()
 
 #if HAVE_VALGRIND_H
   unsigned int valgrind_stack_id;
-  memcpy(&valgrind_stack_id, (char*)stack_ + smx_context_usable_stack_size, sizeof valgrind_stack_id);
+  memcpy(&valgrind_stack_id, stack_ + smx_context_usable_stack_size, sizeof valgrind_stack_id);
   VALGRIND_STACK_DEREGISTER(valgrind_stack_id);
 #endif
 
 #ifndef _WIN32
   if (smx_context_guard_size > 0 && not MC_is_active()) {
-    stack_ = (char*)stack_ - smx_context_guard_size;
+    stack_ = stack_ - smx_context_guard_size;
     if (mprotect(stack_, smx_context_guard_size, PROT_READ | PROT_WRITE) == -1) {
       XBT_WARN("Failed to remove page protection: %s", strerror(errno));
       /* try to pursue anyway */
     }
 #if SIMGRID_HAVE_MC
     /* Retrieve the saved pointer.  See SIMIX_context_stack_new above. */
-    stack_ = *((void**)stack_ - 1);
+    stack_ = reinterpret_cast<unsigned char**>(stack_)[-1];
 #endif
   }
 #endif /* not windows */
@@ -139,7 +140,7 @@ SwappedContext::~SwappedContext()
   xbt_free(stack_);
 }
 
-void* SwappedContext::get_stack()
+unsigned char* SwappedContext::get_stack()
 {
   return stack_;
 }
index 0195e1b..f7eedcd 100644 (file)
@@ -48,7 +48,7 @@ public:
 
   virtual void swap_into(SwappedContext* to) = 0; // Defined in Raw, Boost and UContext subclasses
 
-  void* get_stack();
+  unsigned char* get_stack();
 
   static thread_local uintptr_t worker_id_;
 
@@ -60,7 +60,7 @@ public:
 #endif
 
 private:
-  void* stack_ = nullptr;                /* the thread stack */
+  unsigned char* stack_ = nullptr;       /* the thread stack */
   SwappedContextFactory* const factory_; // for sequential and parallel run_all()
 };
 
index 82d46ab..2686185 100644 (file)
@@ -77,7 +77,7 @@ static void segvhandler(int signum, siginfo_t* siginfo, void* /*context*/)
   std::raise(signum);
 }
 
-char sigsegv_stack[SIGSTKSZ];   /* alternate stack for SIGSEGV handler */
+unsigned char sigsegv_stack[SIGSTKSZ]; /* alternate stack for SIGSEGV handler */
 
 /**
  * Install signal handler for SIGSEGV.  Check that nobody has already installed