Am 20. April 2012 08:53 schrieb Matthias Bolte <matthias.bolte@xxxxxxxxxxxxxx>: > Am 20. April 2012 01:36 schrieb Eric Blake <eblake@xxxxxxxxxx>: >> Commit 78345c68 makes at least gcc 4.1.2 on RHEL 5 complain: >> >> cc1: warnings being treated as errors >> In file included from vbox/vbox_V4_0.c:13: >> vbox/vbox_tmpl.c: In function 'vboxDomainUndefineFlags': >> vbox/vbox_tmpl.c:5298: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing] >> >> * src/vbox/vbox_tmpl.c (vboxDomainUndefineFlags): Use union to >> avoid compiler warning. >> --- >> >> Pushing this under the build-breaker rule. >> >> src/vbox/vbox_tmpl.c | 7 +++++-- >> 1 files changed, 5 insertions(+), 2 deletions(-) >> >> diff --git a/src/vbox/vbox_tmpl.c b/src/vbox/vbox_tmpl.c >> index be25828..57c18a4 100644 >> --- a/src/vbox/vbox_tmpl.c >> +++ b/src/vbox/vbox_tmpl.c >> @@ -5294,8 +5294,11 @@ vboxDomainUndefineFlags(virDomainPtr dom, unsigned int flags) >> >> ((IMachine_Delete)machine->vtbl->Delete)(machine, &safeArray, &progress); >> # else >> - vboxArray array = VBOX_ARRAY_INITIALIZER; >> - machine->vtbl->Delete(machine, 0, (IMedium**)&array, &progress); >> + union { >> + vboxArray array; >> + IMedium *medium; >> + } u = { .array = VBOX_ARRAY_INITIALIZER }; >> + machine->vtbl->Delete(machine, 0, &u.medium, &progress); >> # endif >> if (progress != NULL) { >> progress->vtbl->WaitForCompletion(progress, -1); > > Actually, NACK. As stated in the other mail, vboxArray is not castable > to IMedium*. True, it silences the compiler any might even work by > accident on XPCOM because VirtualBox might not touch the pointer > beyond checking it for being non-NULL because the 0 tells it that it's > an empty array. But still this is wrong and might crash on MSCOM. > > I might come up with a proper solution tomorrow. Okay, looking at this in a bigger context shows that we already have a special case in place for this call for MSCOM that doesn't use vboxArray, because I didn't want to add a full vboxArray solution for this single case. XPCOM doesn't like being pass NULL for an array even if it's an empty array, according to Jean-Baptiste (I can not reproduce the problem). Anyway, I think the proper special case for this is to just a dummy IMedium* array not involving vboxArray at all. IMedium *array[] = { NULL }; machine->vtbl->Delete(machine, 0, array, &progress); See this patch https://www.redhat.com/archives/libvir-list/2012-April/msg01211.html -- Matthias Bolte http://photron.blogspot.com -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list