All of lore.kernel.org
 help / color / mirror / Atom feed
* Re: [RFC PATCH] qom/object: Disallow comma in type names
       [not found] ` <ZVM+hvRk5KYn5WYh@redhat.com>
@ 2023-11-14  9:56   ` Thomas Huth
  2023-11-14 13:22     ` Markus Armbruster
  0 siblings, 1 reply; 2+ messages in thread
From: Thomas Huth @ 2023-11-14  9:56 UTC (permalink / raw)
  To: Daniel P. Berrangé, QEMU Developers
  Cc: Paolo Bonzini, Markus Armbruster, Eduardo Habkost


Forgot to CC: qemu-devel (sorry) - thanks to Markus for the hint.
So let's repeat it here:

On 14/11/2023 10.31, Daniel P. Berrangé wrote:
> On Tue, Nov 14, 2023 at 10:05:37AM +0100, Thomas Huth wrote:
>> QOM names currently don't have any enforced naming rules. This can
>> be problematic, e.g. when they are used on the command line for
>> the "-device" option (where the comma is used to separate properties).
>> To avoid that such problematic type names come in again, let's
>> disallow them now by adding an g_assert() during the type registration.
>>
>> Signed-off-by: Thomas Huth <thuth@redhat.com>
>> ---
>>   Based-on: <20231113134344.1195478-1-armbru@redhat.com>
>>   (without Markus' patches, the g_assert() triggers with the current
>>    code base)
>>   
>>   See discussion here:
>>   https://lore.kernel.org/qemu-devel/87y1f0hjdh.fsf@pond.sub.org/
>>
>>   Questions: Should we disallow other characters, too? Slash and
>>   backslash maybe (since they can cause trouble with module names)?
>>   Dot and colon would maybe be good candidates, too, but they seem
>>   to be in wide use already, so these don't really seem to be
>>   feasible...
> 
> There's two questions.
> 
>    * What should we enforce today
>    * What should we ideally enforce in future
> 
> Ideally the answers would be the same, but getting there will
> almost certainly require some cleanup first.
> 
> Given that we can now define QOM types using QAPI, I feel we
> preserve everyone's sanity by enforcing the same rules for
> QOM and QAPI type naming. IOW
> 
>    All QOM type names must begin with a letter, and contain
>    only ASCII letters, digits, hyphen, and underscore.
> 
> is the answer for the second question.
> 
> In terms of what we can enforce today, we can block ',',
> but we can't block '.' without some cleanup, and possibly
> the same for ':'. Can we assume we don't have any other
> non-alphanumeric chars used ?
> 
> If so, I think that today we we could probably get away with
> saying:
> 
>    All QOM type names must begin with a letter, and contain
>    only ASCII letters, digits, hyphen, underscore, period
>    and colon. Usage of period and colon is deprecated.
> 
>>   qom/object.c | 2 ++
>>   1 file changed, 2 insertions(+)
>>
>> diff --git a/qom/object.c b/qom/object.c
>> index 95c0dc8285..85461ab0d2 100644
>> --- a/qom/object.c
>> +++ b/qom/object.c
>> @@ -113,6 +113,8 @@ static TypeImpl *type_new(const TypeInfo *info)
>>           abort();
>>       }
>>   
>> +    g_assert(!strchr(info->name, ','));
> 
> 
> So with helpers:
> 
>    #define QOM_VALID_TYPECHARS "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLNMOPQRSTUVWXYZ0123456789-_.:"
> 
>    static bool qom_valid_typename(const char *name) {
>       return name[0] != '\0' &&
>          g_ascii_isalpha(name[0]) &&
>          strspn(name, QOM_VALID_TYPECHARS) == strlen(name));
>    }
> 
> The check would then become
> 
>       g_assert(qom_valid_typename(info->name));
> 
>       if (strstr(info->name, '.') ||
>           strstr(info->name, ':')) {
>          warn_report("Usage of '.' and ':', in type name %s is deprecated", info->name)
>       }
> 
> 
> The warn_report could be a bit annoying if we the unusual type names are
> something we're going to hit frequently ?
> 
> With regards,
> Daniel

I've added a debug printf, and seems like we register a lot of types like:

  cfi.pflash01
  virt-2.6-machine::hotplug-handler
  aspeed.i2c.slave::vmstate-if
  pc-i440fx-3.0-machine::nmi

... just to name some few. So I don't think it is feasible to use the 
warn_report here.

  Thomas



^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: [RFC PATCH] qom/object: Disallow comma in type names
  2023-11-14  9:56   ` [RFC PATCH] qom/object: Disallow comma in type names Thomas Huth
@ 2023-11-14 13:22     ` Markus Armbruster
  0 siblings, 0 replies; 2+ messages in thread
From: Markus Armbruster @ 2023-11-14 13:22 UTC (permalink / raw)
  To: Thomas Huth
  Cc: Daniel P. Berrangé, QEMU Developers, Paolo Bonzini,
	Eduardo Habkost

Thomas Huth <thuth@redhat.com> writes:

> Forgot to CC: qemu-devel (sorry) - thanks to Markus for the hint.
> So let's repeat it here:
>
> On 14/11/2023 10.31, Daniel P. Berrangé wrote:
>> On Tue, Nov 14, 2023 at 10:05:37AM +0100, Thomas Huth wrote:
>>> QOM names currently don't have any enforced naming rules. This can
>>> be problematic, e.g. when they are used on the command line for
>>> the "-device" option (where the comma is used to separate properties).
>>> To avoid that such problematic type names come in again, let's
>>> disallow them now by adding an g_assert() during the type registration.
>>>
>>> Signed-off-by: Thomas Huth <thuth@redhat.com>
>>> ---
>>>   Based-on: <20231113134344.1195478-1-armbru@redhat.com>
>>>   (without Markus' patches, the g_assert() triggers with the current
>>>    code base)
>>>   
>>>   See discussion here:
>>>   https://lore.kernel.org/qemu-devel/87y1f0hjdh.fsf@pond.sub.org/
>>>
>>>   Questions: Should we disallow other characters, too? Slash and
>>>   backslash maybe (since they can cause trouble with module names)?
>>>   Dot and colon would maybe be good candidates, too, but they seem
>>>   to be in wide use already, so these don't really seem to be
>>>   feasible...
>> 
>> There's two questions.
>> 
>>    * What should we enforce today
>>    * What should we ideally enforce in future
>> 
>> Ideally the answers would be the same, but getting there will
>> almost certainly require some cleanup first.
>> 
>> Given that we can now define QOM types using QAPI, I feel we
>> preserve everyone's sanity by enforcing the same rules for
>> QOM and QAPI type naming. IOW

Agree!

>>    All QOM type names must begin with a letter, and contain
>>    only ASCII letters, digits, hyphen, and underscore.
>> 
>> is the answer for the second question.

As long as type names only occur as *values*, the next sentence's first
exception applies, too:

      There are two exceptions: enum values may start with a digit, and
      names that are downstream extensions (see section `Downstream
      extensions`_) start with underscore.

This is of course docs/devel/qapi-code-gen.rst.

I'm willing to tweak the QAPI naming rules within reason.

>> In terms of what we can enforce today, we can block ',',
>> but we can't block '.' without some cleanup, and possibly
>> the same for ':'. Can we assume we don't have any other
>> non-alphanumeric chars used ?

I ran qom-list-types (without 'abstract': true) for all 31
qemu-system-FOO, extracted the type names, and sorted them into buckets.

* I found 3255 distinct names

* 2445 names conform to the QAPI naming rule "only letters, digits,
  hyphen, and underscore, starting with a letter"

* 157 more names conform with the enum exception "may start with a
  digit"

* The remainder contain unwanted characters

  - 9 contain ',' and no other unwanted characters

    My "hw: Replace anti-social QOM type names (again)" fixes them.

  - 638 contain '.' and no other unwanted characters

    That's a lot.

    Perhaps we can permit '.' in enum names.  Needs thought.

  - 6 contain '.' and '+'

    Sun-UltraSparc-IIIi+-sparc64-cpu
    Sun-UltraSparc-IV+-sparc64-cpu
    power5+_v2.1-powerpc64-cpu
    power5+_v2.1-spapr-cpu-core
    power7+_v2.1-powerpc64-cpu
    power7+_v2.1-spapr-cpu-core

    Spell out "plus"?

I found no names with ':'.  Looks like we use ':' only for abstract
types (which includes interfaces).

The only #define TYPE_FOO with a colon I can see is

    #define TYPE_RAM_DISCARD_MANAGER "qemu:ram-discard-manager"

An interface type.  Let's ditch the "qemu:".

There are a bunch of interface names containing "::".  These come from
type_initialize_interface():

    info.name = g_strdup_printf("%s::%s", ti->name, interface_type->name);

>> If so, I think that today we we could probably get away with
>> saying:
>> 
>>    All QOM type names must begin with a letter, and contain
>>    only ASCII letters, digits, hyphen, underscore, period
>>    and colon. Usage of period and colon is deprecated.

I think we should reserve colon for QOM internal use.

[...]



^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2023-11-14 13:23 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
     [not found] <20231114090537.154151-1-thuth@redhat.com>
     [not found] ` <ZVM+hvRk5KYn5WYh@redhat.com>
2023-11-14  9:56   ` [RFC PATCH] qom/object: Disallow comma in type names Thomas Huth
2023-11-14 13:22     ` Markus Armbruster

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.