From: Bob M. <rma...@ee...> - 2006-06-30 16:53:41
|
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). Any chance this fix could be included in the next release? Thanks, Bob |
From: William S F. <ws...@fu...> - 2006-06-30 22:01:00
|
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 |
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 |