Bug 17136 - [mingw/cygwin] Conflicting JNI function declarations
: [mingw/cygwin] Conflicting JNI function declarations
Status: NEW
Product: gcc
Classification: Unclassified
Component: libgcj
: 4.0.0
: P2 normal
: ---
Assigned To: Not yet assigned to anyone
: http://gcc.gnu.org/ml/java-patches/20...
: patch
:
:
  Show dependency treegraph
 
Reported: 2004-08-22 10:05 UTC by Danny Smith
Modified: 2005-07-23 22:39 UTC (History)
2 users (show)

See Also:
Host: i686-pc-mingw32
Target: i686-pc-mingw32
Build: i686-pc-mingw32
Known to work:
Known to fail:
Last reconfirmed: 2005-07-21 00:32:33


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Danny Smith 2004-08-22 10:05:55 UTC
This has been reported to Java list.  Reporting here so it doesn't get lost.

While testing a patch to fix PR c++/15774 (Conflicting function decls
not diagnosed)  http://gcc.gnu.org/bugzilla/show_bug.cgi?id=15774

I get this in libjava build.

../../../gcc/libjava/jni.cc:
In function `java::lang::Object* _Jv_JNI_ToReflectedField(JNIEnv*,
java::lang::Class*, _Jv_Field*, jboolean)'
: ../../../gcc/libjava/jni.cc:1612: error: new declaration
`java::lang::Object* _Jv_JNI_ToReflectedField(JNIEnv*,
java::lang::Class*, _Jv_Field*, jboolean)'

./java/lang/reflect/Field.h:70: error: ambiguates old declaration
`java::lang::Object* _Jv_JNI_ToReflectedField(_Jv_JNIEnv*,
java::lang::Class*, _Jv_Field*, jboolean)'

 ../../../gcc/libjava/jni.cc:
In function `java::lang::Object* _Jv_JNI_ToReflectedMethod(JNIEnv*,
java::lang::Class*, _Jv_Method*, jboolean)':
../../../gcc/libjava/jni.cc:1643: error: new declaration
`java::lang::Object* _Jv_JNI_ToReflectedMethod(JNIEnv*,
java::lang::Class*, _Jv_Method*, jboolean)'

./java/lang/reflect/Method.h:40: error: ambiguates old declaration
`java::lang::Object* _Jv_JNI_ToReflectedMethod(_Jv_JNIEnv*,
java::lang::Class*, _Jv_Method*, jboolean)' make[2]: *** [jni.lo] Error

These errors -- although introduced by my sandbox patch -- are valid
complaints.

The friend declarations in the generated headers and in the provided
header, java/lang/Class.h lack the JNICALL (== __stdcall__) attribute
that is added in the function definitions in jni.cc. 

In general, this is dangerous, even if the definition is visible or if
the function is later redeclared with the attribute, since the function
may be referenced (without the attribute) before the attribute is added.
In these specific cases in libjava, the definition is not visible, nor
is there any user-visible redeclaration with the stdcall attribute.

Although I do not have a specific testcase (my knowledge of java-land
reflection semantics is minimal) to demonstrate, this mismatch is very
likely to lead to stack corruption. (Failure to correctly prototype
win32api stdcall functions is always a prime suspect when stack
corruption bugs are reported in mingw-land).

A patch to add JNICALL to the declarations has  been submitted at:

http://gcc.gnu.org/ml/java-patches/2004-q3/msg00456.html

Danny
Comment 1 Danny Smith 2004-08-22 10:11:59 UTC
*** Bug 17137 has been marked as a duplicate of this bug. ***
Comment 2 Andrew Pinski 2004-08-22 14:18:46 UTC
Confirmed.