|
[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 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?
>
> 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?
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
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?
Dmytro.>
> Jan
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |