From: Bob M. <rma...@ee...> - 2006-07-01 01:44:05
|
William S Fulton wrote: > Bob Marinier wrote: > >> I've attached a simple example demonstrating my problem. When I build >> it with SWIG 1.3.29, g++ 4.1.1 and the -O2 and -Wall flags, I get the >> following warnings: >> >> $ swig -c++ -java example.i >> $ g++ -c -fpic example_wrap.cxx -I/opt/sun-jdk-1.4.2.10/include >> -I/opt/sun-jdk-1.4.2.10/include/linux -Wall -O2 >> example_wrap.cxx: In function 'jlong Java_exampleJNI_new_1Shape(JNIEnv*, >> _jclass*)': >> example_wrap.cxx:206: warning: dereferencing type-punned pointer will >> break strict-aliasing rules >> example_wrap.cxx: In function 'void >> Java_exampleJNI_delete_1Shape(JNIEnv*, _jclass*, jlong)': >> example_wrap.cxx:216: warning: dereferencing type-punned pointer will >> break strict-aliasing rules >> >> If I finish building and test it (as shown below), everything works fine >> in this simple case: >> >> $ g++ -shared example_wrap.o -o libexample.so >> $ javac *.java >> $ java main >> Creating some objects: >> Created shape Shape@f5da06 >> >> Guess I'll clean up now >> Goodbye >> >> However, I have some real code that is a lot more complicated, and it >> crashes if I compile with -O2. Adding the -fno-strict-aliasing flag >> "fixes" the problem, but this is undesirable because it disables some >> optimizations. >> >> The offending lines in the example look look like this: >> >> *(Shape **)&jresult = result; >> >> To fix this, the line should be changed to: >> >> *(Shape **)(void *)&jresult = result; >> >> That is, add an intermediate cast to void*. This eliminates the warning >> (and presumably the crash, although I don't want to manually change >> hundreds of lines of code to confirm that in my complex code, and I >> haven't devised a simple test case that crashes. However, we had some >> similar code that we wrote ourselves with the same problem, and adding >> the intermediate cast did fix it). >> >> > > Adding the cast does not fix the problem. All it does is mask a useful > compiler warning telling you that the code will crash. Look for the > discussion on aliasing in Java.html for more info. If you see some slow > down in the wrapper code due to using -fno-strict-aliasing, I'd like to > see this. You only have to use -fno-strict-aliasing on the SWIG > generated code. There is discussion of aliasing on the swig-devel > mailing list earlier this year which you might find interesting. > > William > Thanks for the info. It turns out our old code isn't fixed after all :) Bob |