|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v2] misra: consider conversion from UL or (void*) to function pointer as safe
On 25.09.2025 20:37, Dmytro Prokopchuk1 wrote:
> On 9/25/25 16:25, Jan Beulich wrote:
>> On 25.09.2025 10:04, Dmytro Prokopchuk1 wrote:
>>> --- a/docs/misra/deviations.rst
>>> +++ b/docs/misra/deviations.rst
>>> @@ -366,11 +366,22 @@ Deviations related to MISRA C:2012 Rules:
>>> - Tagged as `safe` for ECLAIR.
>>>
>>> * - R11.1
>>> - - The conversion from a function pointer to unsigned long or (void
>>> \*) does
>>> + - The conversion from a function pointer to unsigned long or '(void
>>> *)' does
>>> not lose any information, provided that the target type has enough
>>> bits
>>> to store it.
>>> - Tagged as `safe` for ECLAIR.
>>>
>>> + * - R11.1
>>> + - The conversion from unsigned long or '(void *)' to a function
>>> pointer is
>>> + safe because it relies on both ABI definitions and compiler
>>> implementations
>>> + supported by Xen which define consistent and compatible
>>> representations
>>> + (i.e., having the same size and memory layout) for '(void *)',
>>> unsigned
>>> + long, and function pointers, enabling safe conversions between
>>> these types
>>> + without data loss or corruption. The compile-time assertions
>>> (BUILD_BUG_ON
>>> + macro) is integrated into 'xen/common/version.c' to confirm
>>> conversions
>>> + compatibility across all target platforms.
>>
>> As you use (and mean) plural, s/is/are/ ? I also think the "The" at the start
>> of the sentence wants dropping.
> Ok.
>
>>
>> Further, why this very dissimilar wording compared to what's said about
>> conversions _from_ function pointer types?
> Do you mean the following wording should be placed instead (to be
> similar with previous one)?
>
> "Conversions from unsigned long or (void *) to a function pointer do not
> lose any information, provided that the source type has enough bits to
> restore it."
>
> And wording about "ABI, compiler..." should be only in commit message?
Perhaps.
>> And then ...
>>
>>> --- a/xen/common/version.c
>>> +++ b/xen/common/version.c
>>> @@ -217,6 +217,17 @@ void __init xen_build_init(void)
>>> #endif /* CONFIG_X86 */
>>> }
>>> #endif /* BUILD_ID */
>>> +
>>> +static void __init __maybe_unused build_assertions(void)
>>> +{
>>> + /*
>>> + * To confirm conversion compatibility between unsigned long, (void *)
>>> + * and function pointers for all supported architectures.
>>> + */
>>> + BUILD_BUG_ON(sizeof(unsigned long) != sizeof(void (*)(void)));
>>> + BUILD_BUG_ON(sizeof(void *) != sizeof(void (*)(void)));
>>> +}
>>
>> ... I'm unconvinced checking merely the sizes is sufficient. On architectures
>> involving function descriptors (e.g. ia64) converting in this direction is
>> safe only if earlier on the value was obtained as the result of a conversion
>> in the opposite direction (and all of this within a single component, which
>> of course is guaranteed for Xen).
> As I know mainline Xen doesn't support IA-64 currently (this support was
> dropped).
> Why we still need to mention about IA-64 here?
Because I needed to use an example I know. Aiui there are other architectures
which use function descriptors (or alike).
> Anyway...
> Yes, this deviation wouldn't work with architectures where the
> representation of a function involves more than just its address (e.g.
> IA-64). If not proved that such conversion is symmetric.
>
> Probably, additional guard may be added below to exclude such
> architectures (e.g. IA-64):
>
> static void __init __maybe_unused build_assertions(void)
> {
> #if defined (__IA64__) || defined (__ia64__)
> #error "Conversions to function pointer isn't safe - architecture uses
> function descriptors."
> #endif
Well, no, I didn't mean to ask that you add dead code.
> BUILD_BUG_ON(sizeof(unsigned long) != sizeof(void (*)(void)));
> BUILD_BUG_ON(sizeof(void *) != sizeof(void (*)(void)));
> }
>
> But if someone really will try to run Xen on such platform, the build
> will fail.
>
> Or just mention explicitly that other architectures (e.g., IA-64) might
> not be safe for such conversions?
My main point really is that once again I wonder how convincing such an
argument would be to assessors, when it's clearly not generic (yet being
worded and the checking coded as if it was).
Jan
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |