[Bug c++/65149] New: unaligned atomic object causes Bus Error on SPARC

alexey.lapshin at oracle dot com gcc-bugzilla@gcc.gnu.org
Fri Feb 20 20:34:00 GMT 2015


https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65149

            Bug ID: 65149
           Summary: unaligned atomic object causes Bus Error on SPARC
           Product: gcc
           Version: 4.9.2
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: alexey.lapshin at oracle dot com

Following test case caused Bus Error on SPARC :

$ cat bus_error.cpp

#include <atomic>
#include <stdio.h>

typedef struct {
  char c[8];
} struct8;

typedef struct {
  char c[1];
  std::atomic< struct8 > as;  
} obj_t;

obj_t obj;

int main( void ) {

  printf("\n sizeof(obj.as) %d alignof(obj.as) %d", sizeof(obj.as),
alignof(obj.as) );

  printf("\n\n atomic_is_lock_free(&obj.as) %d
__atomic_always_lock_free(sizeof(obj.as), &(obj.as)) %d",
atomic_is_lock_free(&obj.as), __atomic_always_lock_free(sizeof(obj.as),
&(obj.as)), atomic_is_lock_free(&obj.as) );

  printf("\n\n");

  return obj.as.load().c[0];
}

$ g++ version is - 4.9.2 (GCC)

$ g++ bus_error.cpp -latomic -m32 -std=c++11

$ ./a.out

 sizeof(obj.as) 8 alignof(obj.as) 1

 atomic_is_lock_free(&obj.as) 1 __atomic_always_lock_free(sizeof(obj.as),
&(obj.as)) 0

Bus Error (core dumped) <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

The reason for the failure is that __atomic_always_lock_free() reported 0, 
but compiler inserts lock-free implementation :

_ZNKSt6atomicI7struct8E4loadESt12memory_order:
.LLFB359:
        save    %sp, -104, %sp
.LLCFI4:
        ld      [%fp+64], %i5
        st      %i0, [%fp+68]
        st      %i1, [%fp+72]
        ld      [%fp+68], %g1
        membar  2
        ldd     [%g1], %g2
        std     %g2, [%fp-8]
        mov     %i5, %g3
        add     %fp, -8, %g2
        mov     8, %g1
        mov     %g3, %o0
        mov     %g2, %o1
        mov     %g1, %o2
        call    memcpy, 0
         nop
        nop
        mov     %i5, %i0
        return  %i7+12
         nop
.LLFE359:

This lock-free implementation could not work correctly with unaligned data.

The bug was found on Solaris SPARC, but it could exist on other platforms.



More information about the Gcc-bugs mailing list