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

Re: [PATCH v1 2/3] compat: address violations of MISRA C Rule 19.1


  • To: Stefano Stabellini <sstabellini@xxxxxxxxxx>
  • From: Jan Beulich <jbeulich@xxxxxxxx>
  • Date: Wed, 30 Apr 2025 08:16:45 +0200
  • Autocrypt: addr=jbeulich@xxxxxxxx; keydata= xsDiBFk3nEQRBADAEaSw6zC/EJkiwGPXbWtPxl2xCdSoeepS07jW8UgcHNurfHvUzogEq5xk hu507c3BarVjyWCJOylMNR98Yd8VqD9UfmX0Hb8/BrA+Hl6/DB/eqGptrf4BSRwcZQM32aZK 7Pj2XbGWIUrZrd70x1eAP9QE3P79Y2oLrsCgbZJfEwCgvz9JjGmQqQkRiTVzlZVCJYcyGGsD /0tbFCzD2h20ahe8rC1gbb3K3qk+LpBtvjBu1RY9drYk0NymiGbJWZgab6t1jM7sk2vuf0Py O9Hf9XBmK0uE9IgMaiCpc32XV9oASz6UJebwkX+zF2jG5I1BfnO9g7KlotcA/v5ClMjgo6Gl MDY4HxoSRu3i1cqqSDtVlt+AOVBJBACrZcnHAUSuCXBPy0jOlBhxPqRWv6ND4c9PH1xjQ3NP nxJuMBS8rnNg22uyfAgmBKNLpLgAGVRMZGaGoJObGf72s6TeIqKJo/LtggAS9qAUiuKVnygo 3wjfkS9A3DRO+SpU7JqWdsveeIQyeyEJ/8PTowmSQLakF+3fote9ybzd880fSmFuIEJldWxp Y2ggPGpiZXVsaWNoQHN1c2UuY29tPsJgBBMRAgAgBQJZN5xEAhsDBgsJCAcDAgQVAggDBBYC AwECHgECF4AACgkQoDSui/t3IH4J+wCfQ5jHdEjCRHj23O/5ttg9r9OIruwAn3103WUITZee e7Sbg12UgcQ5lv7SzsFNBFk3nEQQCACCuTjCjFOUdi5Nm244F+78kLghRcin/awv+IrTcIWF hUpSs1Y91iQQ7KItirz5uwCPlwejSJDQJLIS+QtJHaXDXeV6NI0Uef1hP20+y8qydDiVkv6l IreXjTb7DvksRgJNvCkWtYnlS3mYvQ9NzS9PhyALWbXnH6sIJd2O9lKS1Mrfq+y0IXCP10eS FFGg+Av3IQeFatkJAyju0PPthyTqxSI4lZYuJVPknzgaeuJv/2NccrPvmeDg6Coe7ZIeQ8Yj t0ARxu2xytAkkLCel1Lz1WLmwLstV30g80nkgZf/wr+/BXJW/oIvRlonUkxv+IbBM3dX2OV8 AmRv1ySWPTP7AAMFB/9PQK/VtlNUJvg8GXj9ootzrteGfVZVVT4XBJkfwBcpC/XcPzldjv+3 HYudvpdNK3lLujXeA5fLOH+Z/G9WBc5pFVSMocI71I8bT8lIAzreg0WvkWg5V2WZsUMlnDL9 mpwIGFhlbM3gfDMs7MPMu8YQRFVdUvtSpaAs8OFfGQ0ia3LGZcjA6Ik2+xcqscEJzNH+qh8V m5jjp28yZgaqTaRbg3M/+MTbMpicpZuqF4rnB0AQD12/3BNWDR6bmh+EkYSMcEIpQmBM51qM EKYTQGybRCjpnKHGOxG0rfFY1085mBDZCH5Kx0cl0HVJuQKC+dV2ZY5AqjcKwAxpE75MLFkr wkkEGBECAAkFAlk3nEQCGwwACgkQoDSui/t3IH7nnwCfcJWUDUFKdCsBH/E5d+0ZnMQi+G0A nAuWpQkjM1ASeQwSHEeAWPgskBQL
  • Cc: victorm.lira@xxxxxxx, Nicola Vetrini <nicola.vetrini@xxxxxxxxxxx>, Andrew Cooper <andrew.cooper3@xxxxxxxxxx>, Anthony PERARD <anthony.perard@xxxxxxxxxx>, Michal Orzel <michal.orzel@xxxxxxx>, Julien Grall <julien@xxxxxxx>, Roger Pau Monné <roger.pau@xxxxxxxxxx>, Federico Serafini <federico.serafini@xxxxxxxxxxx>, Bertrand Marquis <bertrand.marquis@xxxxxxx>, xen-devel@xxxxxxxxxxxxxxxxxxxx
  • Delivery-date: Wed, 30 Apr 2025 06:16:56 +0000
  • List-id: Xen developer discussion <xen-devel.lists.xenproject.org>

On 30.04.2025 00:02, Stefano Stabellini wrote:
> On Tue, 29 Apr 2025, Jan Beulich wrote:
>> On 29.04.2025 01:21, Stefano Stabellini wrote:
>>> On Mon, 28 Apr 2025, Jan Beulich wrote:
>>>> On 26.04.2025 01:42, victorm.lira@xxxxxxx wrote:
>>>>> From: Nicola Vetrini <nicola.vetrini@xxxxxxxxxxx>
>>>>>
>>>>> Rule 19.1 states: "An object shall not be assigned or copied
>>>>> to an overlapping object". Since the "call" and "compat_call" are
>>>>> fields of the same union, reading from one member and writing to
>>>>> the other violates the rule, while not causing Undefined Behavior
>>>>> due to their relative sizes. However, a dummy variable is used to
>>>>> address the violation and prevent the future possibility of
>>>>> incurring in UB.
>>>>
>>>> If there is such a concern, ...
>>>>
>>>>> --- a/xen/common/compat/multicall.c
>>>>> +++ b/xen/common/compat/multicall.c
>>>>> @@ -15,8 +15,13 @@ typedef int ret_t;
>>>>>  static inline void xlat_multicall_entry(struct mc_state *mcs)
>>>>>  {
>>>>>      int i;
>>>>> +    xen_ulong_t arg;
>>>>> +
>>>>>      for (i=0; i<6; i++)
>>>>> -        mcs->compat_call.args[i] = mcs->call.args[i];
>>>>> +    {
>>>>> +        arg = mcs->call.args[i];
>>>>> +        mcs->compat_call.args[i] = arg;
>>>>> +    }
>>>>>  }
>>>>
>>>> ... wouldn't it be of concern as well that the alternating parts of
>>>> the union are still accessed in a flip-flop manner? IOW we continue to
>>>> rely on the relative placement properties of the individual array
>>>> elements. To eliminate such a concern, I think the resulting code would
>>>> also want to be correct if iteration was swapped to work downwards.
>>>>
>>>> Also the scope of the temporary could certainly be the loop body rather
>>>> than the entire function.
>>>
>>> Wouldn't be safer to do this then?
>>>
>>> static inline void xlat_multicall_entry(struct mc_state *mcs)
>>> {
>>>     int i;
>>>     xen_ulong_t args[6];
>>>
>>>     for ( i = 0; i < 6; i++ )
>>>     {
>>>         args[i] = mcs->call.args[i];
>>>     }
>>>     for ( i = 0; i < 6; i++ )
>>>     {
>>>         mcs->compat_call.args[i] = args[i];
>>>     }
>>> }
>>>
>>> If you have any specific suggestions I think C code would be easier to
>>> understand than English.
>>
>> Kind of the above, yes, with the further remark below also taken care of.
>> So ...
>>
>>>> I also don't think it needs to be xen_ulong_t,
>>>> but maybe using unsigned int instead wouldn't make a difference in
>>>> generated code.
>>>
>>> Keeping the same type as mcs->call.args[i] would seem more obviously
>>> correct? Not to mention that unsigned long is what we defined as
>>> register type? If we really want to avoid xen_ulong_t, then it should
>>> be uintptr_t?
>>>
>>> We should stick to one type to be used as register type. On ARM, we
>>> defined register_t.
>>
>> ... with both taken into account e.g.:
>>
>>     typeof(mcs->compat_call.args[0]) args[ARRAY_SIZE(mcs->call.args)];
>>
>>     for ( i = 0; i < ARRAY_SIZE(args); i++ )
>>         args[i] = mcs->call.args[i];
>>
>>     memcpy(mcs->compat_call.args, args, sizeof(args));
>>
>> Of course there are variations possible. There also may want to be a
>> BUILD_BUG_ON() to "document" both array sizes match, even if the compat
>> form is auto-generated from the native one.
>>
>> Tangential: As of 2f531c122e95 ("x86: limit number of hypercall parameters
>> to 5") it's kind of bogus that we process 6 array elements here. This even
>> extends to an assertion in hypercall_xlat_continuation() and to some of
>> the handling in hypercall_create_continuation(). I guess I will want to
>> make a patch there, which of course I could make cover the Misra aspect
>> here as well.
> 
> Please do, that would be much appreciated. Thank you!

I already did ["{hyper,multi}call: further limit arguments to just 5"]; all I
need there is an Arm side ack.

> Also thanks for 2f531c122e95.

I fear I don't understand this part. But it probably also doesn't matter much.

Jan



 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.