[Spice-devel] [PATCH 06/22] Get rid of C-style memset initializations, use C++ style aggregates

Christophe de Dinechin cdupontd at redhat.com
Thu Mar 8 11:35:29 UTC 2018



> On 8 Mar 2018, at 11:39, Frediano Ziglio <fziglio at redhat.com> wrote:
> 
>>> 
>>> On 7 Mar 2018, at 11:50, Frediano Ziglio <fziglio at redhat.com> wrote:
>>> 
>>>>> On 6 Mar 2018, at 17:15, Christophe Fergeau <cfergeau at redhat.com> wrote:
>>>>> 
>>>>> On Thu, Mar 01, 2018 at 09:01:37PM +0100, Christophe de Dinechin wrote:
>>>>>>> On 28 Feb 2018, at 17:36, Christophe Fergeau <cfergeau at redhat.com>
>>>>>>> wrote:
>>>>>>> 
>>>>>>> My understanding is that the previous iteration was quite
>>>>>>> controversial,
>>>>>>> I would just drop it from the series unless you get acks from everyone
>>>>>>> involved this time.
>>>>>> 
>>>>>> It’s a bit difficult to drop that from the series, as it is a core
>>>>>> element
>>>>>> of the next steps if you look carefully.
>>>>> 
>>>>> I only looked at the code with the full series applied, but it really
>>>>> seems
>>>>> like both way would
>>>>> be possible?
>>>>> 
>>>>> diff --git a/src/concrete-agent.cpp b/src/concrete-agent.cpp
>>>>> index fe8564f..2e1472a 100644
>>>>> --- a/src/concrete-agent.cpp
>>>>> +++ b/src/concrete-agent.cpp
>>>>> @@ -140,7 +140,10 @@ public:
>>>>>   }
>>>>>   void write_message_body(Stream &stream, unsigned w, unsigned h,
>>>>>   uint8_t
>>>>>   c)
>>>>>   {
>>>>> -        StreamMsgFormat msg = { .width = w, .height = h, .codec = c,
>>>>> .padding1 = {} };
>>>>> +        StreamMsgFormat msg;
>>>>> +        msg.width = w;
>>>>> +        msg.height = h;
>>>>> +        msg.codec = c;
>>>>>       stream.write_all("format", &msg, sizeof(msg));
>>>>>   }
>>>>> };
>>>>> diff --git a/src/message.hpp b/src/message.hpp
>>>>> index fd69033..674e122 100644
>>>>> --- a/src/message.hpp
>>>>> +++ b/src/message.hpp
>>>>> @@ -21,13 +21,12 @@ class Message
>>>>> public:
>>>>>   template <typename ...PayloadArgs>
>>>>>   Message(PayloadArgs... payload_args)
>>>>> -        : hdr(StreamDevHeader {
>>>>> -              .protocol_version = STREAM_DEVICE_PROTOCOL,
>>>>> -              .padding = 0,     // Workaround GCC bug "sorry: not
>>>>> implemented"
>>>>> -              .type = Type,
>>>>> -              .size = (uint32_t) Info::size(payload_args...)
>>>>> -          })
>>>>> -    { }
>>>>> +    {
>>>>> +        hdr.protocol_version = STREAM_DEVICE_PROTOCOL;
>>>>> +        hdr.padding = 0;
>>>>> +        hdr.type = Type;
>>>>> +        hdr.size = (uint32_t) Info::size(payload_args...);
>>>>> +    }
>>>>>   void write_header(Stream &stream)
>>>>>   {
>>>>>       stream.write_all("header", &hdr, sizeof(hdr));
>>>>> 
>>>>> Not strongly advocating for that change to be made just now, I was just
>>>>> a bit surprised by how you dismissed this ;)
>>>> 
>>>> I did not dismiss it, and I regret you interpreted it that way ;-)
>>>> 
>>>> The meaning I gave to “core element of the next steps” was that
>>>> practically
>>>> every patch touches that part in one way or another. So changing it and
>>>> keeping it consistent essentially means redoing a good fraction of the
>>>> whole
>>>> series by hand. That’s a lot of churn.
>>>> 
>>>> I could do it if I saw value in doing the change. But I feel like I
>>>> replied
>>>> to Frediano’s objections on this topic, as well as to yours. I also
>>>> believe
>>>> that the code is significantly simpler, more type-safe and more readable
>>>> the
>>>> way I wrote it, for example because we get a warning or an error if we
>>>> forget a field.
>>>> 
>>> 
>>> I confirm, the problem of the paddings and security was discussed
>>> and agreed is not a problem.
>> 
>> Thanks.
>> 
>>> 
>>>> Does that address your objection?
>>>> 
>>>>> 
>>>>> Christophe
>>>> 
>>> 
>>> There are however still some issues:
>>> - the syntax is using C++20 while we state we use C++11 syntax, this
>>> is basically using C compatibility extensions. I just tried and for
>>> instance this code is not accepted on Visual C++ 2015 (not an issue
>>> at the moment);
>> 
>> No, but it is annoying. Will make that obvious in the commit log.
>> 
> 
> I don't think that a comment on the log will make Visual C++
> compile that code. Stating C++11 was the reason of this, not use too
> advance syntax that could have problems.

It won’t. But you stated “not an issue at the moment”.

What do you want then? A change to get rid of designated initializers, or a commit log that states we did that knowingly?

> 
>>> - the "Also note that GCC is a bit picky and will generate strange
>>> "unsupported" or "not implemented" errors if the fields are not all
>>> initialized in exact declaration order." is wrong, this is not a
>>> GCC errors, just that GCC is respecting C++. Fields are required
>>> to be initialized in the correct order in C++ (this differs from
>>> C99);
>> 
>> It’s picky relative to clang. But I agree that rephrasing the comment would
>> improve it.
>> 
>> (I don’t want to refer to C++20, since this is WIP and that specific aspect
>> may still change)
>> 
>> 
>>> - the "Writing this patch also highlighted an inconsistency between the
>>> type of a 'codec' local variable and the type used in the actual data
>>> type." is misleading, the protocol is defined that way not for
>>> inconsistency but being a C file is subject to C limits and
>>> you cannot portably specify a binary size for enumerations.
>> 
>> I understand the rationale, and I can add it. But the comment is not
>> misleading, it was a response to a question you had about the reason for the
>> type change (the reason being that I had a warning without it).
>> 
>> Changed in working branch to:
>> 
>> Also note that designated initializers is a C99 or C++20 feature.
>> It is presently accepted by both gcc and clang, but not VS2015.
>> Also note that gcc is picky relative to clang, but closer to the
>> current working draft for C++20, in that it requires fields to be
>> initialized in declaration order and to all be initialized, and that
>> you don't get a clear error message but an "unsupported" or
>> "unimplementd" message if you do not follow that rule.
>> 
>> Writing this patch also highlighted an inconsistency between the type
>> of a 'codec' local variable and the type used in the actual data
>> type (which must obey C rules, since it's in the protocol).
>> In order to avoid a warning, this patch changes the type of the
>> variable to uint8_t to match that in the structure declaration.
>> 
>> 
>>> 
>>> As I said previously if the problem is the time that take to
>>> do the change to the patch I can do it.
>> 
>> It will not really help, since that series already received a fair number of
>> changes, and so you patch would add on top of the pile.
>> 
> 
> Not proposing to add patches, to change them.

I understand. What I’m saying is that my working branch is already quite a bit ahead of what you have to work with. You may start from my private branch https://github.com/c3d/spice-streaming-agent/commits/c%2B%2B-refactoring.

I’d appreciate suggestions as where to put the cut point to stick with what was reviewed already. Some stuff in there is new, e.g. adding export-dynamic right away. The exception handling API shows no sign that either sign manages to convince the other.

At this point, I am not sending again because I’m blocked by this discussion, and that exception handling patch is right in the middle.


> 
> Frediano
> _______________________________________________
> Spice-devel mailing list
> Spice-devel at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/spice-devel



More information about the Spice-devel mailing list