[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH] misra: address MISRA C Rule 18.3 compliance
On 23.07.2025 12:12, Dmytro Prokopchuk1 wrote: > --- a/automation/eclair_analysis/ECLAIR/deviations.ecl > +++ b/automation/eclair_analysis/ECLAIR/deviations.ecl > @@ -568,6 +568,14 @@ C99 Undefined Behaviour 45: Pointers that do not point > into, or just beyond, the > -config=MC3A2.R18.2,reports+={safe, > "any_area(any_loc(any_exp(macro(^page_to_mfn$))))"} > -doc_end > > +-doc_begin="Consider relational pointer comparisons in kernel-related > sections as safe and compliant." > +-config=MC3R1.R18.3,reports+={safe, > "any_area(any_loc(any_exp(macro(name(is_kernel||is_kernel_text||is_kernel_rodata||is_kernel_inittext)))))"} > +-doc_end > + > +-doc_begin="Allow deviations for pointer comparisons in BUG_ON and ASSERT > macros, treating them as safe for debugging and validation." > +-config=MC3R1.R18.3,reports+={safe, > "any_area(any_loc(any_exp(macro(name(BUG_ON||ASSERT)))))"} > +-doc_end Nit: Drop "deviations for" from the verbal description? > --- a/xen/arch/x86/efi/efi-boot.h > +++ b/xen/arch/x86/efi/efi-boot.h > @@ -461,7 +461,8 @@ static void __init efi_arch_edd(void) > params->device_path_info_length = > sizeof(struct edd_device_params) - > offsetof(struct edd_device_params, key); > - for ( p = (const u8 *)¶ms->key; p < ¶ms->checksum; > ++p ) > + for ( p = (const u8 *)¶ms->key; > + (uintptr_t)p < (uintptr_t)¶ms->checksum; ++p ) There mere addition of such casts makes code more fragile imo. What about the alternative of using != instead of < here? I certainly prefer < in such situations, but functionally != ought to be equivalent (and less constrained by C and Misra). As mentioned several times when discussing these rules, it's also not easy to see how "pointers of different objects" could be involved here: It's all within *params, isn't it? Finally, when touching such code it would be nice if u<N> was converted to uint<N>_t. > --- a/xen/common/sched/core.c > +++ b/xen/common/sched/core.c > @@ -360,7 +360,7 @@ static always_inline void sched_spin_lock_double( > { > *flags = _spin_lock_irqsave(lock1); > } > - else if ( lock1 < lock2 ) > + else if ( (uintptr_t)lock1 < (uintptr_t)lock2 ) Similarly, no matter what C or Misra may have to say here, imo such casts are simply dangerous. Especially when open-coded. > --- a/xen/common/virtual_region.c > +++ b/xen/common/virtual_region.c > @@ -83,8 +83,8 @@ const struct virtual_region *find_text_region(unsigned long > addr) > rcu_read_lock(&rcu_virtual_region_lock); > list_for_each_entry_rcu ( iter, &virtual_region_list, list ) > { > - if ( (void *)addr >= iter->text_start && > - (void *)addr < iter->text_end ) > + if ( addr >= (unsigned long)iter->text_start && > + addr < (unsigned long)iter->text_end ) Considering further casts to unsigned long of the same struct fields, was it considered to alter the type of the struct fields instead? Jan
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |