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