On Thu, Apr 06, 2023 at 10:20:46AM +0200, Michal Prívozník wrote:
On 4/5/23 19:21, Andrea Bolognani wrote:
> On Wed, Apr 05, 2023 at 01:30:17PM +0200, Michal Privoznik wrote:
>> + if (nodeHeader->len < sizeof(*nodeHeader)) {
>> + virReportError(VIR_ERR_INTERNAL_ERROR,
>> + _("IORT table node type %1$s has invalid length:
%2$" PRIu16),
>
> I'm not sure this plays well with the recently introduced changes to
> translatable strings. Have you checked with Jirka?
I haven't. But, gcc complains if only a part of string contains
positioned arguments. That is:
"argument value %1$s and another argument %s"
"argument value %s and another argument %2$s"
are invalid format string and compiler throws an error. Now, using no
positions works:
"argument value %s and another argument %s"
but then, Jirka's syntax-check rule throws an error. But it doesn't for
the case I'm using:
"integer value %" PRIu16
Yeah, either your usage is fine or the syntax-check rule should be
improve to catch it. Jirka?
Although, one could argue that if the translate tool doesn't
allow fixed
size integer types modifiers, then the tool is broken. Surely, libvirt's
not the only one using fixed size integers. But okay, for error messages
I can typecast arguments. IOW:
virReportError(VIR_ERR_INTERNAL_ERROR,
_("IORT table node type %1$s has invalid length: %2$u"),
NULLSTR(typeStr), (unsigned int)nodeHeader->len);
This looks fine.
Perhaps a bit more useful:
virReportError(VIR_ERR_INTERNAL_ERROR,
_("IORT table node type %1$s has invalid length: got
%2$u, expected at least %3$lu"),
NULLSTR(typeStr), (unsigned int)nodeHeader->len,
sizeof(*nodeHeader));
>> +typedef enum {
>> + VIR_IORT_NODE_TYPE_UNKNOWN = -1,
>
> Do we need this? virIORTNodeHeader.type is defined as unsigned.
You didn't answer this one :)
>> +typedef struct virIORTNodeHeader virIORTNodeHeader;
>> +struct virIORTNodeHeader {
>> + uint8_t type; /* One of virIORTNodeType */
>> + uint16_t len;
>> + uint8_t revision;
>> + uint32_t identifier;
>> + uint32_t nmappings;
>> + uint32_t reference_id;
>
> Since we only care about type and length, we could simply not declare
> the other four fields at all, right?
Yes, except these fields are defined by the standard. We may need them
in the future. Anyway - these are thrown right away anyway, if it's
added memory consumption you're worried about.
By the same token, we don't care about other types (root comples, PMCG,
ITS group, ...) and yet we have them in the enum.
It's fine to keep them, I'm not too concerned about the memory usage,
I was just wondering how much we should push towards minimalism ;)
What about renaming @reference_id to @mappings_offset though, to
match the corresponding fields for nodes in virIORTHeader?
--
Andrea Bolognani / Red Hat / Virtualization