general: Fix various strict-aliasing warnings with g_clear_pointer()
This is just unfortunate. It’s an aliasing violation to cast a pointer
to a pointer (and there’s no way round that), although in practice it
will not cause a problem. People do quite often compile with
`-Werror=strict-aliasing`, though, so fixing the warnings is helpful.
Warnings are of the form:
```
../../source/gnome-control-center/panels/keyboard/cc-keyboard-shortcut-dialog.c: In function ‘cc_keyboard_shortcut_dialog_finalize’:
../../source/gnome-control-center/panels/keyboard/cc-keyboard-shortcut-dialog.c:518:20: error: dereferencing type-punned pointer will break strict-aliasing rules [-Werror=strict-aliasing]
518 | g_clear_pointer ((GtkWindow**)&self->shortcut_editor, gtk_window_destroy);
/opt/gnome/install/include/glib-2.0/glib/gmacros.h:871:47: note: in definition of macro ‘G_STATIC_ASSERT’
871 | #define G_STATIC_ASSERT(expr) _Static_assert (expr, "Expression evaluates to false")
| ^~~~
../../source/gnome-control-center/panels/keyboard/cc-keyboard-shortcut-dialog.c:518:3: note: in expansion of macro ‘g_clear_pointer’
518 | g_clear_pointer ((GtkWindow**)&self->shortcut_editor, gtk_window_destroy);
| ^~~~~~~~~~~~~~~
In file included from /opt/gnome/install/include/glib-2.0/glib/gatomic.h:30,
from /opt/gnome/install/include/glib-2.0/glib/gthread.h:34,
from /opt/gnome/install/include/glib-2.0/glib/gasyncqueue.h:34,
from /opt/gnome/install/include/glib-2.0/glib.h:34:
../../source/gnome-control-center/panels/keyboard/cc-keyboard-shortcut-dialog.c:518:20: error: dereferencing type-punned pointer will break strict-aliasing rules [-Werror=strict-aliasing]
518 | g_clear_pointer ((GtkWindow**)&self->shortcut_editor, gtk_window_destroy);
/opt/gnome/install/include/glib-2.0/glib/glib-typeof.h:39:36: note: in definition of macro ‘glib_typeof’
39 | #define glib_typeof(t) __typeof__ (t)
| ^
../../source/gnome-control-center/panels/keyboard/cc-keyboard-shortcut-dialog.c:518:3: note: in expansion of macro ‘g_clear_pointer’
518 | g_clear_pointer ((GtkWindow**)&self->shortcut_editor, gtk_window_destroy);
| ^~~~~~~~~~~~~~~
cc1: all warnings being treated as errors
```
I believe it’s better to fix these by expanding out the
`g_clear_pointer()` call, than by changing the types of variables — the
latter approach means everything becomes a `GtkWidget` or a `GtkWindow`,
which loses type specificity. So this approach is in contrast to that
taken in commit 1bafd46ea3
, for example.
Alternative approaches would be:
1. Add internal `cc_clear_window()` and `cc_clear_widget()` helpers
which do this in a single line without aliasing violations.
2. Enforce compiling with `-Wno-strict-aliasing` if strict aliasing is
not something that g-c-c maintainers want to care about (which would
be fine, aliasing checks probably won’t catch any bugs in this kind
of code).
Signed-off-by: Philip Withnall <pwithnall@gnome.org>
Fixes: #2563
This commit is contained in:
parent
d2f4fe0447
commit
ea014f24eb
6 changed files with 32 additions and 7 deletions
|
@ -1848,7 +1848,11 @@ cc_color_panel_dispose (GObject *object)
|
|||
g_clear_object (&self->list_box_size);
|
||||
g_clear_pointer (&self->sensors, g_ptr_array_unref);
|
||||
g_clear_pointer (&self->list_box_filter, g_free);
|
||||
g_clear_pointer ((GtkWindow **)&self->dialog_assign, gtk_window_destroy);
|
||||
|
||||
if (self->dialog_assign != NULL) {
|
||||
gtk_window_destroy (GTK_WINDOW (self->dialog_assign));
|
||||
self->dialog_assign = NULL;
|
||||
}
|
||||
|
||||
G_OBJECT_CLASS (cc_color_panel_parent_class)->dispose (object);
|
||||
}
|
||||
|
|
|
@ -189,7 +189,10 @@ cc_vertical_row_dispose (GObject *object)
|
|||
}
|
||||
|
||||
cc_vertical_row_set_activatable_widget (self, NULL);
|
||||
g_clear_pointer ((GtkWidget**)&priv->header, gtk_widget_unparent);
|
||||
if (priv->header != NULL) {
|
||||
gtk_widget_unparent (GTK_WIDGET (priv->header));
|
||||
priv->header = NULL;
|
||||
}
|
||||
|
||||
G_OBJECT_CLASS (cc_vertical_row_parent_class)->dispose (object);
|
||||
}
|
||||
|
|
|
@ -515,7 +515,11 @@ cc_keyboard_shortcut_dialog_finalize (GObject *object)
|
|||
g_clear_pointer (&self->search_terms, g_strfreev);
|
||||
g_clear_object (&self->sections);
|
||||
g_clear_object (&self->filtered_shortcuts);
|
||||
g_clear_pointer ((GtkWindow**)&self->shortcut_editor, gtk_window_destroy);
|
||||
|
||||
if (self->shortcut_editor != NULL) {
|
||||
gtk_window_destroy (GTK_WINDOW (self->shortcut_editor));
|
||||
self->shortcut_editor = NULL;
|
||||
}
|
||||
|
||||
G_OBJECT_CLASS (cc_keyboard_shortcut_dialog_parent_class)->finalize (object);
|
||||
}
|
||||
|
|
|
@ -154,9 +154,13 @@ ce_page_8021x_security_dispose (GObject *object)
|
|||
CEPage8021xSecurity *self = CE_PAGE_8021X_SECURITY (object);
|
||||
|
||||
g_clear_object (&self->connection);
|
||||
g_clear_pointer ((GtkWidget **) &self->security, gtk_widget_unparent);
|
||||
g_clear_object (&self->group);
|
||||
|
||||
if (self->security != NULL) {
|
||||
gtk_widget_unparent (GTK_WIDGET (self->security));
|
||||
self->security = NULL;
|
||||
}
|
||||
|
||||
G_OBJECT_CLASS (ce_page_8021x_security_parent_class)->dispose (object);
|
||||
}
|
||||
|
||||
|
|
|
@ -936,7 +936,11 @@ cc_bolt_page_dispose (GObject *object)
|
|||
|
||||
/* Must be destroyed in dispose, not finalize. */
|
||||
cc_bolt_device_dialog_set_device (self->device_dialog, NULL, NULL);
|
||||
g_clear_pointer ((GtkWindow **) &self->device_dialog, gtk_window_destroy);
|
||||
|
||||
if (self->device_dialog != NULL) {
|
||||
gtk_window_destroy (GTK_WINDOW (self->device_dialog));
|
||||
self->device_dialog = NULL;
|
||||
}
|
||||
|
||||
G_OBJECT_CLASS (cc_bolt_page_parent_class)->dispose (object);
|
||||
}
|
||||
|
|
|
@ -204,8 +204,14 @@ cc_volume_slider_dispose (GObject *object)
|
|||
{
|
||||
CcVolumeSlider *self = CC_VOLUME_SLIDER (object);
|
||||
|
||||
g_clear_pointer ((GtkWidget **) &self->volume_scale, gtk_widget_unparent);
|
||||
g_clear_pointer ((GtkWidget **) &self->mute_button, gtk_widget_unparent);
|
||||
if (self->volume_scale != NULL) {
|
||||
gtk_widget_unparent (GTK_WIDGET (self->volume_scale));
|
||||
self->volume_scale = NULL;
|
||||
}
|
||||
if (self->mute_button != NULL) {
|
||||
gtk_widget_unparent (GTK_WIDGET (self->mute_button));
|
||||
self->mute_button = NULL;
|
||||
}
|
||||
|
||||
g_clear_object (&self->mixer_control);
|
||||
g_clear_object (&self->stream);
|
||||
|
|
Loading…
Add table
Reference in a new issue