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

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




> On 7 Mar 2018, at 11:50, Frediano Ziglio <fziglio@xxxxxxxxxx> wrote:
> 
>>> On 6 Mar 2018, at 17:15, Christophe Fergeau <cfergeau@xxxxxxxxxx> 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@xxxxxxxxxx> 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.

> - 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.



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

_______________________________________________
Spice-devel mailing list
Spice-devel@xxxxxxxxxxxxxxxxxxxxx
https://lists.freedesktop.org/mailman/listinfo/spice-devel




[Index of Archives]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Security]     [Bugtraq]     [Linux]     [Linux OMAP]     [Linux MIPS]     [ECOS]     [Asterisk Internet PBX]     [Linux API]     [Monitors]