[Cython] Memory views: dereferencing pointer does break strict-aliasing rules

Yury V. Zaytsev yury at shurup.com
Tue Jul 2 13:54:41 CEST 2013


Hi,

The simplest possible program using memory views compiles with a large
number of warnings for me, even for a rather outdated version of gcc:

    def hello(int [:] a):
        print(a, "world")

If I translate it with the latest released version of Cython like this:

    cython cpp.pyx
    cython --cplus cpp.pyx

and compile like this:

    gcc -O3 -march=native -Wall -fPIC -I/opt/ActivePython-2.7/include/python2.7 -c ./cpp.c -o cpp.o
    g++ -O3 -march=native -Wall -fPIC -I/opt/ActivePython-2.7/include/python2.7 -c ./cpp.cpp -o cpp.o

I get lots of warnings (see attached).

It doesn't seem to be related to C++ as such, but rather it seems that
the memory views code indeed somehow violates strict-aliasing rules.

I'm not sure of how severe it is, but the documentation seems to suggest
that this might even lead to incorrect results.

Can this possibly be fixed in Cython and how important is that? Shall I
create a bug report on the Trac? Is my only resort to test whether the
compiler supports -fno-strict-aliasing and use that?

Thanks!

-- 
Sincerely yours,
Yury V. Zaytsev

-------------- next part --------------
./cpp.c: In function ‘get_memview_MemoryView_5array_7memview___get__’:
./cpp.c:2565: warning: dereferencing type-punned pointer will break strict-aliasing rules
./cpp.c:2565: warning: dereferencing type-punned pointer will break strict-aliasing rules
./cpp.c: In function ‘__pyx_array_new’:
./cpp.c:2873: warning: dereferencing type-punned pointer will break strict-aliasing rules
./cpp.c:2873: warning: dereferencing type-punned pointer will break strict-aliasing rules
./cpp.c: In function ‘__pyx_memoryview_is_slice’:
./cpp.c:4045: warning: dereferencing type-punned pointer will break strict-aliasing rules
./cpp.c:4045: warning: dereferencing type-punned pointer will break strict-aliasing rules
./cpp.c: In function ‘__pyx_memoryview_MemoryView_10memoryview_16is_c_contig’:
./cpp.c:6196: warning: dereferencing type-punned pointer will break strict-aliasing rules
./cpp.c:6196: warning: dereferencing type-punned pointer will break strict-aliasing rules
./cpp.c: In function ‘__pyx_memoryview_MemoryView_10memoryview_18is_f_contig’:
./cpp.c:6261: warning: dereferencing type-punned pointer will break strict-aliasing rules
./cpp.c:6261: warning: dereferencing type-punned pointer will break strict-aliasing rules
./cpp.c: In function ‘__pyx_memoryview_new’:
./cpp.c:6479: warning: dereferencing type-punned pointer will break strict-aliasing rules
./cpp.c:6479: warning: dereferencing type-punned pointer will break strict-aliasing rules
./cpp.c: In function ‘_unellipsify’:
./cpp.c:6660: warning: dereferencing type-punned pointer will break strict-aliasing rules
./cpp.c:6660: warning: dereferencing type-punned pointer will break strict-aliasing rules
./cpp.c:6816: warning: dereferencing type-punned pointer will break strict-aliasing rules
./cpp.c:6816: warning: dereferencing type-punned pointer will break strict-aliasing rules
./cpp.c:6876: warning: dereferencing type-punned pointer will break strict-aliasing rules
./cpp.c:6876: warning: dereferencing type-punned pointer will break strict-aliasing rules
./cpp.c: In function ‘__pyx_memoryview_fromslice’:
./cpp.c:8920: warning: dereferencing type-punned pointer will break strict-aliasing rules
./cpp.c:8920: warning: dereferencing type-punned pointer will break strict-aliasing rules
./cpp.c: In function ‘__pyx_getprop___pyx_array_memview’:
./cpp.c:2565: warning: dereferencing pointer ‘_Py_TrueStruct.131’ does break strict-aliasing rules
./cpp.c:2565: warning: dereferencing pointer ‘_Py_TrueStruct.131’ does break strict-aliasing rules
./cpp.c:2565: note: initialized from here
./cpp.c:2565: warning: dereferencing pointer ‘_Py_ZeroStruct.132’ does break strict-aliasing rules
./cpp.c:2565: warning: dereferencing pointer ‘_Py_ZeroStruct.132’ does break strict-aliasing rules
./cpp.c:2565: note: initialized from here
./cpp.c: In function ‘__pyx_memoryview_new’:
./cpp.c:6479: warning: dereferencing pointer ‘_Py_TrueStruct.440’ does break strict-aliasing rules
./cpp.c:6479: warning: dereferencing pointer ‘_Py_TrueStruct.440’ does break strict-aliasing rules
./cpp.c:6479: note: initialized from here
./cpp.c:6479: warning: dereferencing pointer ‘_Py_ZeroStruct.441’ does break strict-aliasing rules
./cpp.c:6479: warning: dereferencing pointer ‘_Py_ZeroStruct.441’ does break strict-aliasing rules
./cpp.c:6479: note: initialized from here
./cpp.c: In function ‘__pyx_memoryview_is_f_contig’:
./cpp.c:6261: warning: dereferencing pointer ‘_Py_TrueStruct.430’ does break strict-aliasing rules
./cpp.c:6261: warning: dereferencing pointer ‘_Py_TrueStruct.430’ does break strict-aliasing rules
./cpp.c:6261: note: initialized from here
./cpp.c:6261: warning: dereferencing pointer ‘_Py_ZeroStruct.431’ does break strict-aliasing rules
./cpp.c:6261: warning: dereferencing pointer ‘_Py_ZeroStruct.431’ does break strict-aliasing rules
./cpp.c:6261: note: initialized from here
./cpp.c:6270: warning: dereferencing pointer ‘__pyx_r’ does break strict-aliasing rules
./cpp.c:6270: warning: dereferencing pointer ‘__pyx_r’ does break strict-aliasing rules
./cpp.c:6270: warning: dereferencing pointer ‘__pyx_r’ does break strict-aliasing rules
./cpp.c:6270: warning: dereferencing pointer ‘__pyx_r’ does break strict-aliasing rules
./cpp.c:6261: note: initialized from here
./cpp.c:6261: note: initialized from here
./cpp.c: In function ‘__pyx_memoryview_is_c_contig’:
./cpp.c:6196: warning: dereferencing pointer ‘_Py_TrueStruct.424’ does break strict-aliasing rules
./cpp.c:6196: warning: dereferencing pointer ‘_Py_TrueStruct.424’ does break strict-aliasing rules
./cpp.c:6196: note: initialized from here
./cpp.c:6196: warning: dereferencing pointer ‘_Py_ZeroStruct.425’ does break strict-aliasing rules
./cpp.c:6196: warning: dereferencing pointer ‘_Py_ZeroStruct.425’ does break strict-aliasing rules
./cpp.c:6196: note: initialized from here
./cpp.c:6205: warning: dereferencing pointer ‘__pyx_r’ does break strict-aliasing rules
./cpp.c:6205: warning: dereferencing pointer ‘__pyx_r’ does break strict-aliasing rules
./cpp.c:6205: warning: dereferencing pointer ‘__pyx_r’ does break strict-aliasing rules
./cpp.c:6205: warning: dereferencing pointer ‘__pyx_r’ does break strict-aliasing rules
./cpp.c:6196: note: initialized from here
./cpp.c:6196: note: initialized from here
./cpp.c: In function ‘__pyx_memoryview_is_slice’:
./cpp.c:4045: warning: dereferencing pointer ‘_Py_TrueStruct.251’ does break strict-aliasing rules
./cpp.c:4045: warning: dereferencing pointer ‘_Py_TrueStruct.251’ does break strict-aliasing rules
./cpp.c:4045: note: initialized from here
./cpp.c:4045: warning: dereferencing pointer ‘_Py_ZeroStruct.252’ does break strict-aliasing rules
./cpp.c:4045: warning: dereferencing pointer ‘_Py_ZeroStruct.252’ does break strict-aliasing rules
./cpp.c:4045: note: initialized from here
./cpp.c: In function ‘_unellipsify’:
./cpp.c:6660: warning: dereferencing pointer ‘_Py_ZeroStruct.453’ does break strict-aliasing rules
./cpp.c:6660: warning: dereferencing pointer ‘_Py_ZeroStruct.453’ does break strict-aliasing rules
./cpp.c:6660: note: initialized from here
./cpp.c:6816: warning: dereferencing pointer ‘_Py_TrueStruct.482’ does break strict-aliasing rules
./cpp.c:6816: warning: dereferencing pointer ‘_Py_TrueStruct.482’ does break strict-aliasing rules
./cpp.c:6816: note: initialized from here
./cpp.c:6973: warning: dereferencing pointer ‘__pyx_v_have_slices’ does break strict-aliasing rules
./cpp.c:6973: warning: dereferencing pointer ‘__pyx_v_have_slices’ does break strict-aliasing rules
./cpp.c:6884: warning: dereferencing pointer ‘__pyx_v_have_slices’ does break strict-aliasing rules
./cpp.c:6884: warning: dereferencing pointer ‘__pyx_v_have_slices’ does break strict-aliasing rules
./cpp.c:6884: warning: dereferencing pointer ‘__pyx_v_have_slices’ does break strict-aliasing rules
./cpp.c:6884: warning: dereferencing pointer ‘__pyx_v_have_slices’ does break strict-aliasing rules
./cpp.c:6881: warning: dereferencing pointer ‘__pyx_v_have_slices’ does break strict-aliasing rules
./cpp.c:6881: warning: dereferencing pointer ‘__pyx_v_have_slices’ does break strict-aliasing rules
./cpp.c:6818: warning: dereferencing pointer ‘__pyx_v_have_slices’ does break strict-aliasing rules
./cpp.c:6818: warning: dereferencing pointer ‘__pyx_v_have_slices’ does break strict-aliasing rules
./cpp.c:6818: warning: dereferencing pointer ‘__pyx_v_have_slices’ does break strict-aliasing rules
./cpp.c:6818: warning: dereferencing pointer ‘__pyx_v_have_slices’ does break strict-aliasing rules
./cpp.c:6662: note: initialized from here
./cpp.c:6819: note: initialized from here
./cpp.c:6876: note: initialized from here
./cpp.c:6876: note: initialized from here
./cpp.c:6876: warning: dereferencing pointer ‘_Py_TrueStruct.482’ does break strict-aliasing rules
./cpp.c:6876: warning: dereferencing pointer ‘_Py_TrueStruct.482’ does break strict-aliasing rules
./cpp.c:6876: note: initialized from here
./cpp.c:6876: warning: dereferencing pointer ‘_Py_ZeroStruct.453’ does break strict-aliasing rules
./cpp.c:6876: warning: dereferencing pointer ‘_Py_ZeroStruct.453’ does break strict-aliasing rules
./cpp.c:6876: note: initialized from here
cc1: warning: dereferencing pointer ‘__pyx_v_have_slices’ does break strict-aliasing rules
./cpp.c:6816: note: initialized from here
./cpp.c:15681: note: initialized from here
./cpp.c:6660: note: initialized from here
./cpp.c: In function ‘__pyx_memoryview_fromslice’:
./cpp.c:8920: warning: dereferencing pointer ‘_Py_TrueStruct.595’ does break strict-aliasing rules
./cpp.c:8920: warning: dereferencing pointer ‘_Py_TrueStruct.595’ does break strict-aliasing rules
./cpp.c:8920: note: initialized from here
./cpp.c:8920: warning: dereferencing pointer ‘_Py_ZeroStruct.596’ does break strict-aliasing rules
./cpp.c:8920: warning: dereferencing pointer ‘_Py_ZeroStruct.596’ does break strict-aliasing rules
./cpp.c:8920: note: initialized from here
./cpp.c:9128: warning: dereferencing pointer ‘__pyx_t_2’ does break strict-aliasing rules
./cpp.c:9128: warning: dereferencing pointer ‘__pyx_t_2’ does break strict-aliasing rules
./cpp.c:9128: warning: dereferencing pointer ‘__pyx_t_2’ does break strict-aliasing rules
./cpp.c:8920: note: initialized from here
./cpp.c:8920: note: initialized from here



More information about the cython-devel mailing list