http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54729



             Bug #: 54729

           Summary: __compare_and_swap does not return on all paths

    Classification: Unclassified

           Product: gcc

           Version: 4.7.0

            Status: UNCONFIRMED

          Severity: normal

          Priority: P3

         Component: c++

        AssignedTo: unassig...@gcc.gnu.org

        ReportedBy: cvo...@gmail.com





I had wrongly used the __compare_and_swap with a "volatile bool" variable and

without the _GLIBCXX_DEBUG and _GLIBCXX_PARALLEL being defined.



Analyzing the function I would like to suggest to return false before leaving

the function, otherwise the user belive that the CAS was successful while he is

actually using it incorrectly.



Possible solution is something like this.



  template<typename _Tp>

  inline bool

  __compare_and_swap(volatile _Tp* __ptr, _Tp __comparand, _Tp __replacement)

  {

    if (sizeof(_Tp) == sizeof(int32_t))

      return __compare_and_swap_32((volatile int32_t*) __ptr,

                                   (int32_t)__comparand,

                                   (int32_t)__replacement);

    else if (sizeof(_Tp) == sizeof(int64_t))

      return __compare_and_swap_64((volatile int64_t*) __ptr,

                                   (int64_t)__comparand,

                                   (int64_t)__replacement);

    else

      _GLIBCXX_PARALLEL_ASSERT(false);



    return false;

  }

Reply via email to