On 06/10/20 21:20, snizovt...@gmail.com wrote: > On Tue, 2020-10-06 at 01:55 -0400, Michael S. Tsirkin wrote: >> On Tue, Sep 29, 2020 at 04:47:14PM -0700, Sergey Nizovtsev wrote: >>> Some objects accidentally inherit ObjectClass instead of Object. >>> They compile silently but may crash after downcasting. >>> >>> In this patch, we introduce a coccinelle script to find broken >>> declarations and fix them manually with proper base type. >>> >>> Signed-off-by: Sergey Nizovtsev <snizovt...@gmail.com> >> >> Reviewed-by: Michael S. Tsirkin <m...@redhat.com> >> >> which tree should this go in through? > > Well, since this may only affect some generic QOM walking code, i > suggest it goes in QOM/QObject/QMP related tree. > > So, `scripts/get_maintainer.pl -f qom/object.c`: > > +CC Paolo Bonzini <pbonz...@redhat.com> > -CC Ben Warren <b...@skyportsystems.com>
Queued, thanks. Paolo > On Tue, 2020-10-06 at 00:06 +0400, Marc-André Lureau wrote: >> Reviewed-by: Marc-André Lureau <marcandre.lur...@redhat.com> > > On Mon, 2020-10-05 at 18:47 +0200, Igor Mammedov wrote: >> Reviewed-by: Igor Mammedov <imamm...@redhat.com> > >> >>> --- >>> scripts/coccinelle/qobject-parent-type.cocci | 26 >>> ++++++++++++++++++++ >>> include/hw/acpi/vmgenid.h | 2 +- >>> include/hw/misc/vmcoreinfo.h | 2 +- >>> include/net/can_host.h | 2 +- >>> MAINTAINERS | 1 + >>> 5 files changed, 30 insertions(+), 3 deletions(-) >>> create mode 100644 scripts/coccinelle/qobject-parent-type.cocci >>> >>> diff --git a/scripts/coccinelle/qobject-parent-type.cocci >>> b/scripts/coccinelle/qobject-parent-type.cocci >>> new file mode 100644 >>> index 0000000000..9afb3edd97 >>> --- /dev/null >>> +++ b/scripts/coccinelle/qobject-parent-type.cocci >>> @@ -0,0 +1,26 @@ >>> +// Highlight object declarations that don't look like object class >>> but >>> +// accidentally inherit from it. >>> + >>> +@match@ >>> +identifier obj_t, fld; >>> +type parent_t =~ ".*Class$"; >>> +@@ >>> +struct obj_t { >>> + parent_t fld; >>> + ... >>> +}; >>> + >>> +@script:python filter depends on match@ >>> +obj_t << match.obj_t; >>> +@@ >>> +is_class_obj = obj_t.endswith('Class') >>> +cocci.include_match(not is_class_obj) >>> + >>> +@replacement depends on filter@ >>> +identifier match.obj_t, match.fld; >>> +type match.parent_t; >>> +@@ >>> +struct obj_t { >>> +* parent_t fld; >>> + ... >>> +}; >>> diff --git a/include/hw/acpi/vmgenid.h b/include/hw/acpi/vmgenid.h >>> index d50fbacb8e..cb4ad37fc5 100644 >>> --- a/include/hw/acpi/vmgenid.h >>> +++ b/include/hw/acpi/vmgenid.h >>> @@ -19,7 +19,7 @@ >>> OBJECT_DECLARE_SIMPLE_TYPE(VmGenIdState, VMGENID) >>> >>> struct VmGenIdState { >>> - DeviceClass parent_obj; >>> + DeviceState parent_obj; >>> QemuUUID guid; /* The 128-bit GUID seen by the >>> guest */ >>> uint8_t vmgenid_addr_le[8]; /* Address of the GUID (little- >>> endian) */ >>> }; >>> diff --git a/include/hw/misc/vmcoreinfo.h >>> b/include/hw/misc/vmcoreinfo.h >>> index ebada6617a..0b7b55d400 100644 >>> --- a/include/hw/misc/vmcoreinfo.h >>> +++ b/include/hw/misc/vmcoreinfo.h >>> @@ -24,7 +24,7 @@ DECLARE_INSTANCE_CHECKER(VMCoreInfoState, >>> VMCOREINFO, >>> typedef struct fw_cfg_vmcoreinfo FWCfgVMCoreInfo; >>> >>> struct VMCoreInfoState { >>> - DeviceClass parent_obj; >>> + DeviceState parent_obj; >>> >>> bool has_vmcoreinfo; >>> FWCfgVMCoreInfo vmcoreinfo; >>> diff --git a/include/net/can_host.h b/include/net/can_host.h >>> index 4e3ce3f954..caab71bdda 100644 >>> --- a/include/net/can_host.h >>> +++ b/include/net/can_host.h >>> @@ -35,7 +35,7 @@ >>> OBJECT_DECLARE_TYPE(CanHostState, CanHostClass, CAN_HOST) >>> >>> struct CanHostState { >>> - ObjectClass oc; >>> + Object oc; >>> >>> CanBusState *bus; >>> CanBusClientState bus_client; >>> diff --git a/MAINTAINERS b/MAINTAINERS >>> index 5eed1e692b..2160b8196a 100644 >>> --- a/MAINTAINERS >>> +++ b/MAINTAINERS >>> @@ -2402,6 +2402,7 @@ F: qobject/ >>> F: include/qapi/qmp/ >>> X: include/qapi/qmp/dispatch.h >>> F: scripts/coccinelle/qobject.cocci >>> +F: scripts/coccinelle/qobject-parent-type.cocci >>> F: tests/check-qdict.c >>> F: tests/check-qjson.c >>> F: tests/check-qlist.c >>> -- >>> 2.28.0 >