Skip to content

Commit afbc5b3

Browse files
authored
[C++] Get rid of compiler warnings (#703)
When Java.Interop is built with GCC (e.g. on Linux or with MinGW), the flags Xamarin.Android passes to the compiler cause a handful of warnings to be shown regarding incomplete field assignment when initializing structure instances: java-interop-gc-bridge-mono.cc:259:33: warning: missing initializer for member ‘JavaInteropGCBridge::BridgeProcessing_type’ [-Wmissing-field-initializers] 259 | JavaInteropGCBridge bridge = {0}; | ^ java-interop-gc-bridge-mono.cc:259:33: warning: missing initializer for member ‘JavaInteropGCBridge::BridgeProcessing_field’ [-Wmissing-field-initializers] java-interop-gc-bridge-mono.cc:259:33: warning: missing initializer for member ‘JavaInteropGCBridge::BridgeProcessing_vtables_count’ [-Wmissing-field-initializers] java-interop-gc-bridge-mono.cc:259:33: warning: missing initializer for member ‘JavaInteropGCBridge::BridgeProcessing_vtables_length’ [-Wmissing-field-initializers] java-interop-gc-bridge-mono.cc:259:33: warning: missing initializer for member ‘JavaInteropGCBridge::BridgeProcessing_domains’ [-Wmissing-field-initializers] java-interop-gc-bridge-mono.cc:259:33: warning: missing initializer for member ‘JavaInteropGCBridge::BridgeProcessing_vtables’ [-Wmissing-field-initializers] java-interop-gc-bridge-mono.cc:259:33: warning: missing initializer for member ‘JavaInteropGCBridge::num_bridge_types’ [-Wmissing-field-initializers] java-interop-gc-bridge-mono.cc:259:33: warning: missing initializer for member ‘JavaInteropGCBridge::mono_java_gc_bridge_info’ [-Wmissing-field-initializers] java-interop-gc-bridge-mono.cc:259:33: warning: missing initializer for member ‘JavaInteropGCBridge::gc_disabled’ [-Wmissing-field-initializers] java-interop-gc-bridge-mono.cc:259:33: warning: missing initializer for member ‘JavaInteropGCBridge::gc_gref_count’ [-Wmissing-field-initializers] java-interop-gc-bridge-mono.cc:259:33: warning: missing initializer for member ‘JavaInteropGCBridge::gc_weak_gref_count’ [-Wmissing-field-initializers] java-interop-gc-bridge-mono.cc:259:33: warning: missing initializer for member ‘JavaInteropGCBridge::Runtime_instance’ [-Wmissing-field-initializers] java-interop-gc-bridge-mono.cc:259:33: warning: missing initializer for member ‘JavaInteropGCBridge::Runtime_gc’ [-Wmissing-field-initializers] java-interop-gc-bridge-mono.cc:259:33: warning: missing initializer for member ‘JavaInteropGCBridge::WeakReference_class’ [-Wmissing-field-initializers] java-interop-gc-bridge-mono.cc:259:33: warning: missing initializer for member ‘JavaInteropGCBridge::WeakReference_init’ [-Wmissing-field-initializers] java-interop-gc-bridge-mono.cc:259:33: warning: missing initializer for member ‘JavaInteropGCBridge::WeakReference_get’ [-Wmissing-field-initializers] java-interop-gc-bridge-mono.cc:259:33: warning: missing initializer for member ‘JavaInteropGCBridge::GCUserPeerable_class’ [-Wmissing-field-initializers] java-interop-gc-bridge-mono.cc:259:33: warning: missing initializer for member ‘JavaInteropGCBridge::GCUserPeerable_add’ [-Wmissing-field-initializers] java-interop-gc-bridge-mono.cc:259:33: warning: missing initializer for member ‘JavaInteropGCBridge::GCUserPeerable_clear’ [-Wmissing-field-initializers] java-interop-gc-bridge-mono.cc:259:33: warning: missing initializer for member ‘JavaInteropGCBridge::gref_log’ [-Wmissing-field-initializers] java-interop-gc-bridge-mono.cc:259:33: warning: missing initializer for member ‘JavaInteropGCBridge::lref_log’ [-Wmissing-field-initializers] java-interop-gc-bridge-mono.cc:259:33: warning: missing initializer for member ‘JavaInteropGCBridge::gref_path’ [-Wmissing-field-initializers] java-interop-gc-bridge-mono.cc:259:33: warning: missing initializer for member ‘JavaInteropGCBridge::lref_path’ [-Wmissing-field-initializers] java-interop-gc-bridge-mono.cc:259:33: warning: missing initializer for member ‘JavaInteropGCBridge::gref_log_level’ [-Wmissing-field-initializers] java-interop-gc-bridge-mono.cc:259:33: warning: missing initializer for member ‘JavaInteropGCBridge::lref_log_level’ [-Wmissing-field-initializers] java-interop-gc-bridge-mono.cc:259:33: warning: missing initializer for member ‘JavaInteropGCBridge::gref_cleanup’ [-Wmissing-field-initializers] java-interop-gc-bridge-mono.cc:259:33: warning: missing initializer for member ‘JavaInteropGCBridge::lref_cleanup’ [-Wmissing-field-initializers] java-interop-gc-bridge-mono.cc: In function ‘_jmethodID* get_add_reference_method(JavaInteropGCBridge*, JNIEnv*, jobject, MonoClass*)’: java-interop-gc-bridge-mono.cc:1283:41: warning: missing initializer for member ‘MonoGCBridgeCallbacks::bridge_class_kind’ [-Wmissing-field-initializers] 1283 | MonoGCBridgeCallbacks bridge_cbs = {0}; | ^ java-interop-gc-bridge-mono.cc:1283:41: warning: missing initializer for member ‘MonoGCBridgeCallbacks::is_bridge_object’ [-Wmissing-field-initializers] java-interop-gc-bridge-mono.cc:1283:41: warning: missing initializer for member ‘MonoGCBridgeCallbacks::cross_references’ [-Wmissing-field-initializers] Instead of initializing every field, simply use **memset**(3) to initialize the structure memory to `0`. Another warning fixed by this commit is one regarding unused function parameters: java-interop-gc-bridge-mono.cc:899:93: warning: unused parameter ‘mclass’ [-Wunused-parameter] 899 | get_add_reference_method (JavaInteropGCBridge *bridge, JNIEnv *env, jobject obj, MonoClass *mclass) | ~~~~~~~~~~~^~~~~~ Yet another fixed warning relates to MinGW `RELEASE` builds only: java-interop-util.cc: In function ‘char* utf16_to_utf8(const wchar_t*)’: java-interop/java-interop-util.cc:11:6: warning: unused variable ‘converted_size’ [-Wunused-variable] 11 | int converted_size = WideCharToMultiByte (CP_UTF8, 0, widestr, -1, mbstr, required_size, NULL, NULL); | ^~~~~~~~~~~~~~ java-interop/java-interop-util.cc: In function ‘wchar_t* utf8_to_utf16(const char*)’: java-interop/java-interop-util.cc:23:6: warning: unused variable ‘converted_chars’ [-Wunused-variable] 23 | int converted_chars = MultiByteToWideChar (CP_UTF8, 0, mbstr, -1, widestr, required_chars); | ^~~~~~~~~~~~~~~ These warnings are shown because the `assert()` macro used in the above functions are not compiled in `RELEASE` builds, which leaves the variables mentioned above indeed unused.
1 parent e295b49 commit afbc5b3

File tree

2 files changed

+9
-3
lines changed

2 files changed

+9
-3
lines changed

src/java-interop/java-interop-gc-bridge-mono.cc

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -256,7 +256,8 @@ java_interop_gc_bridge_new (JavaVM *jvm)
256256
}
257257
#endif /* defined (XAMARIN_ANDROID_DYLIB_MONO) */
258258

259-
JavaInteropGCBridge bridge = {0};
259+
JavaInteropGCBridge bridge;
260+
memset (&bridge, 0, sizeof (bridge));
260261

261262
bridge.jvm = jvm;
262263

@@ -896,7 +897,7 @@ take_weak_global_ref_jni (JavaInteropGCBridge *bridge, JNIEnv *env, MonoObject *
896897
}
897898

898899
static jmethodID
899-
get_add_reference_method (JavaInteropGCBridge *bridge, JNIEnv *env, jobject obj, MonoClass *mclass)
900+
get_add_reference_method (JavaInteropGCBridge *bridge, JNIEnv *env, jobject obj, [[maybe_unused]] MonoClass *mclass)
900901
{
901902
if (!obj)
902903
return NULL;
@@ -1280,7 +1281,8 @@ java_interop_gc_bridge_register_hooks (JavaInteropGCBridge *bridge, int weak_ref
12801281

12811282
const char *message = NULL;
12821283

1283-
MonoGCBridgeCallbacks bridge_cbs = {0};
1284+
MonoGCBridgeCallbacks bridge_cbs;
1285+
memset (&bridge_cbs, 0, sizeof (bridge_cbs));
12841286

12851287
switch (weak_ref_kind) {
12861288
case JAVA_INTEROP_GC_BRIDGE_USE_WEAK_REFERENCE_KIND_JAVA:

src/java-interop/java-interop-util.cc

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ utf16_to_utf8 (const wchar_t *widestr)
1010
char *mbstr = static_cast<char*> (calloc (required_size, sizeof (char)));
1111
int converted_size = WideCharToMultiByte (CP_UTF8, 0, widestr, -1, mbstr, required_size, NULL, NULL);
1212

13+
// Hush a compiler warning about unused variable in RELEASE
14+
(void)converted_size;
1315
assert (converted_size == required_size);
1416

1517
return mbstr;
@@ -22,6 +24,8 @@ utf8_to_utf16 (const char *mbstr)
2224
wchar_t *widestr = static_cast<wchar_t*> (calloc (required_chars, sizeof (wchar_t)));
2325
int converted_chars = MultiByteToWideChar (CP_UTF8, 0, mbstr, -1, widestr, required_chars);
2426

27+
// Hush a compiler warning about unused variable in RELEASE
28+
(void)converted_chars;
2529
assert (converted_chars == required_chars);
2630

2731
return widestr;

0 commit comments

Comments
 (0)