diff mbox series

qom: fix objects with improper parent type

Message ID CAHOaf96qxm6_qigD+DuoJ5GpS9rOqXe4Gv=2UnujiiwcfN0HHQ@mail.gmail.com
State Superseded
Headers show
Series qom: fix objects with improper parent type | expand

Commit Message

Sergey Nizovtsev Sept. 29, 2020, 11:47 p.m. UTC
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 <snizovtsev@gmail.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

Comments

Igor Mammedov Oct. 5, 2020, 4:47 p.m. UTC | #1
On Tue, 29 Sep 2020 16:47:14 -0700
Sergey Nizovtsev <snizovtsev@gmail.com> 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 <snizovtsev@gmail.com>


nice catch,

Reviewed-by: Igor Mammedov <imammedo@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
Marc-André Lureau Oct. 5, 2020, 8:06 p.m. UTC | #2
On Wed, Sep 30, 2020 at 3:47 AM Sergey Nizovtsev <snizovtsev@gmail.com> 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 <snizovtsev@gmail.com>


thanks!!
Reviewed-by: Marc-André Lureau <marcandre.lureau@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

>
Michael S. Tsirkin Oct. 6, 2020, 5:55 a.m. UTC | #3
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 <snizovtsev@gmail.com>


Reviewed-by: Michael S. Tsirkin <mst@redhat.com>


which tree should this go in through?

> ---

>  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
Sergey Nizovtsev Oct. 6, 2020, 7:20 p.m. UTC | #4
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 <snizovtsev@gmail.com>

> 

> Reviewed-by: Michael S. Tsirkin <mst@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 <pbonzini@redhat.com>
-CC Ben Warren <ben@skyportsystems.com>

On Tue, 2020-10-06 at 00:06 +0400, Marc-André Lureau wrote:
> Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>


On Mon, 2020-10-05 at 18:47 +0200, Igor Mammedov wrote:
> Reviewed-by: Igor Mammedov <imammedo@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
Paolo Bonzini Oct. 7, 2020, 7:37 a.m. UTC | #5
On 06/10/20 21:20, snizovtsev@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 <snizovtsev@gmail.com>

>>

>> Reviewed-by: Michael S. Tsirkin <mst@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 <pbonzini@redhat.com>

> -CC Ben Warren <ben@skyportsystems.com>


Queued, thanks.

Paolo

> On Tue, 2020-10-06 at 00:06 +0400, Marc-André Lureau wrote:

>> Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>

> 

> On Mon, 2020-10-05 at 18:47 +0200, Igor Mammedov wrote:

>> Reviewed-by: Igor Mammedov <imammedo@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

>
diff mbox series

Patch

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