Kevin Wolf <kw...@redhat.com> writes: > Am 02.11.2023 um 13:55 hat Markus Armbruster geschrieben: >> Kevin Wolf <kw...@redhat.com> writes: >> >> > The 'name' parameter of QOM setters is primarily used to specify the name >> > of the currently parsed input element in the visitor interface. For >> > top-level qdev properties, this is always set and matches 'prop->name'. >> > >> > However, for list elements it is NULL, because each element of a list >> > doesn't have a separate name. Passing a non-NULL value runs into >> > assertion failures in the visitor code. >> >> Yes. visitor.h's big comment: >> >> * The @name parameter of visit_type_FOO() describes the relation >> * between this QAPI value and its parent container. When visiting >> * the root of a tree, @name is ignored; when visiting a member of an >> * object, @name is the key associated with the value; when visiting a >> * member of a list, @name is NULL; and when visiting the member of an >> * alternate, @name should equal the name used for visiting the >> * alternate. >> >> > Therefore, using 'name' in error messages is not right for property >> > types that are used in lists, because "(null)" isn't very helpful to >> > identify what QEMU is complaining about. >> >> We get "(null)" on some hosts, and SEGV on others. > > Fair, I can add "(or even a segfault)" to the commit message. > >> Same problem in all property setters and getters (qdev and QOM), I >> presume. The @name parameter looks like a death trap. Thoughts? > > All property setters and getters that abuse @name instead of just > passing it to the visitor. I don't know how many do, but let's see: > > * qdev_prop_size32 uses @name in an error message > > * Array properties themselves use @name in an error message, too > (preexisting) > > * qdev-properties-system.c has more complicated properties, which have > the same problem: drive, chardev, macaddr, netdev (before this patch), > reserved_region, pci_devfn (one error path explicitly considers name > == NULL, but another doesn't), uuid > > * Outside of hw/core/ we may have some problematic properties, too. > I found qdev_prop_tpm, and am now too lazy to go through all devices. > These are probably specialised enough that they are less likely to be > used in arrays. > > We can fix these on top of this series, though we should probably first > figure out what the best way to replace it is to avoid touching > everything twice.
Makes sense. >> Any reproducer known before the next patch? > > Not to me. > >> > Change netdev properties to use 'prop->name' instead, which will contain >> > the name of the array property after switching array properties to lists >> > in the external interface. >> >> Points at the entire array property without telling the user which of >> the elements is at fault. Sure better than NULL. I'm not asking you to >> improve the error message further. Mention the error message's lack of >> precision in the commit message? > > Can do. > > At least the input visitor has better ways internally to identify the > currently visited object with full_name(). If other visitor types can do > similar things, maybe extending the public visitor interface to access > the name would be possible? Yes, there's a need for better error reporting around visitors, ideally without doing it in every visitor like the QObject input visitor does. I've thought about it, but only briefly, and without a conclusion. I figure your idea is to provide a visitor method to get a malloced string describing the thing being visited. Might work, but to know for sure, we have to try. This could also help with getting rid of the dangerous @name use we discussed above. Thanks!