[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v5 4/4] xen/common: use SYMBOL when required
Use SYMBOL in cases of comparisons and subtractions of: _start, _end, __init_begin, __init_end, __2M_text_end, __2M_rodata_start, __2M_rodata_end, __2M_init_start,__2M_init_end, __2M_rwdata_start, __2M_rwdata_end, _stext, _etext, _srodata, _erodata, __end_vpci_array, __start_vpci_array, _sinittext, _einittext, _stextentry, _etextentry, __start_bug_frames, __stop_bug_frames_0, __stop_bug_frames_1, __stop_bug_frames_2,__stop_bug_frames_3, __note_gnu_build_id_start, __note_gnu_build_id_end, __start___ex_table, __stop___ex_table, __start___pre_ex_table, __stop___pre_ex_table, __lock_profile_start, __lock_profile_end, __param_start, __param_end, __setup_start, __setup_end, __initcall_start, __initcall_end, __presmp_initcall_end, __trampoline_rel_start, __trampoline_rel_stop, __trampoline_seg_start, __trampoline_seg_stop __alt_instructions, __alt_instructions_end, __ctors_start, __ctors_end, __end_schedulers_array, __start_schedulers_array, __bss_start, __bss_end, __per_cpu_start, __per_cpu_data_end, _splatform, _eplatform, _sdevice, _edevice, _asdevice, _aedevice, __proc_info_start, __proc_info_end, _sdtb as by the C standard [1]. M3CM: Rule-18.2: Subtraction between pointers shall only be applied to pointers that address elements of the same array [1] https://wiki.sei.cmu.edu/confluence/display/c/ARR36-C.+Do+not+subtract+or+compare+two+pointers+that+do+not+refer+to+the+same+array QAVerify: 2761 Signed-off-by: Stefano Stabellini <stefanos@xxxxxxxxxx> CC: JBeulich@xxxxxxxx CC: andrew.cooper3@xxxxxxxxxx --- Changes in v5: - remove two spurious changes - split into three patches - remove SYMBOL() from derived variables --- xen/common/kernel.c | 8 ++++++-- xen/common/lib.c | 2 +- xen/common/schedule.c | 2 +- xen/common/spinlock.c | 4 +++- xen/common/version.c | 6 +++--- xen/common/virtual_region.c | 6 +++++- xen/include/xen/kernel.h | 24 ++++++++++++------------ 7 files changed, 31 insertions(+), 21 deletions(-) diff --git a/xen/common/kernel.c b/xen/common/kernel.c index 5766a0f..97eb648 100644 --- a/xen/common/kernel.c +++ b/xen/common/kernel.c @@ -312,14 +312,18 @@ extern const initcall_t __initcall_start[], __presmp_initcall_end[], void __init do_presmp_initcalls(void) { const initcall_t *call; - for ( call = __initcall_start; call < __presmp_initcall_end; call++ ) + for ( call = __initcall_start; + (unsigned long)call < SYMBOL(__presmp_initcall_end); + call++ ) (*call)(); } void __init do_initcalls(void) { const initcall_t *call; - for ( call = __presmp_initcall_end; call < __initcall_end; call++ ) + for ( call = __presmp_initcall_end; + (unsigned long)call < SYMBOL(__initcall_end); + call++ ) (*call)(); } diff --git a/xen/common/lib.c b/xen/common/lib.c index 8ebec81..c1d2c96 100644 --- a/xen/common/lib.c +++ b/xen/common/lib.c @@ -497,7 +497,7 @@ extern const ctor_func_t __ctors_start[], __ctors_end[]; void __init init_constructors(void) { const ctor_func_t *f; - for ( f = __ctors_start; f < __ctors_end; ++f ) + for ( f = __ctors_start; (unsigned long)f < SYMBOL(__ctors_end); ++f ) (*f)(); /* Putting this here seems as good (or bad) as any other place. */ diff --git a/xen/common/schedule.c b/xen/common/schedule.c index a957c5e..063086e 100644 --- a/xen/common/schedule.c +++ b/xen/common/schedule.c @@ -68,7 +68,7 @@ DEFINE_PER_CPU(struct scheduler *, scheduler); DEFINE_PER_CPU(cpumask_t, cpumask_scratch); extern const struct scheduler *__start_schedulers_array[], *__end_schedulers_array[]; -#define NUM_SCHEDULERS (__end_schedulers_array - __start_schedulers_array) +#define NUM_SCHEDULERS (SYMBOL(__end_schedulers_array) - SYMBOL(__start_schedulers_array)) #define schedulers __start_schedulers_array static struct scheduler __read_mostly ops; diff --git a/xen/common/spinlock.c b/xen/common/spinlock.c index 6bc52d7..00a3a86 100644 --- a/xen/common/spinlock.c +++ b/xen/common/spinlock.c @@ -474,7 +474,9 @@ static int __init lock_prof_init(void) { struct lock_profile **q; - for ( q = &__lock_profile_start; q < &__lock_profile_end; q++ ) + for ( q = &__lock_profile_start; + (unsigned long)q < SYMBOL(&__lock_profile_end); + q++ ) { (*q)->next = lock_profile_glb_q.elem_q; lock_profile_glb_q.elem_q = *q; diff --git a/xen/common/version.c b/xen/common/version.c index 223cb52..0726c14 100644 --- a/xen/common/version.c +++ b/xen/common/version.c @@ -147,14 +147,14 @@ static int __init xen_build_init(void) int rc; /* --build-id invoked with wrong parameters. */ - if ( __note_gnu_build_id_end <= &n[0] ) + if ( SYMBOL(__note_gnu_build_id_end) <= (unsigned long)&n[0] ) return -ENODATA; /* Check for full Note header. */ - if ( &n[1] >= __note_gnu_build_id_end ) + if ( (unsigned long)&n[1] >= SYMBOL(__note_gnu_build_id_end) ) return -ENODATA; - sz = (void *)__note_gnu_build_id_end - (void *)n; + sz = SYMBOL(__note_gnu_build_id_end) - (unsigned long)n; rc = xen_build_id_check(n, sz, &build_id_p, &build_id_len); diff --git a/xen/common/virtual_region.c b/xen/common/virtual_region.c index aa23918..111c6fd 100644 --- a/xen/common/virtual_region.c +++ b/xen/common/virtual_region.c @@ -119,7 +119,11 @@ void __init setup_virtual_regions(const struct exception_table_entry *start, const struct bug_frame *s; s = bug_frames[i - 1]; - sz = bug_frames[i] - s; + /* + * Cast to unsigned long to calculate the size to avoid + * subtractions between pointers pointing to different objects. + */ + sz = (unsigned long)bug_frames[i] - (unsigned long)s; core.frame[i - 1].n_bugs = sz; core.frame[i - 1].bugs = s; diff --git a/xen/include/xen/kernel.h b/xen/include/xen/kernel.h index 548b64d..cd27030 100644 --- a/xen/include/xen/kernel.h +++ b/xen/include/xen/kernel.h @@ -66,27 +66,27 @@ }) extern char _start[], _end[], start[]; -#define is_kernel(p) ({ \ - char *__p = (char *)(unsigned long)(p); \ - (__p >= _start) && (__p < _end); \ +#define is_kernel(p) ({ \ + const unsigned long __p = (unsigned long)(p); \ + (__p >= SYMBOL(_start)) && (__p < SYMBOL(_end)); \ }) extern char _stext[], _etext[]; -#define is_kernel_text(p) ({ \ - char *__p = (char *)(unsigned long)(p); \ - (__p >= _stext) && (__p < _etext); \ +#define is_kernel_text(p) ({ \ + const unsigned long __p = (unsigned long)(p); \ + (__p >= SYMBOL(_stext)) && (__p < SYMBOL(_etext)); \ }) extern const char _srodata[], _erodata[]; -#define is_kernel_rodata(p) ({ \ - const char *__p = (const char *)(unsigned long)(p); \ - (__p >= _srodata) && (__p < _erodata); \ +#define is_kernel_rodata(p) ({ \ + const unsigned long __p = (unsigned long)(p); \ + (__p >= SYMBOL(_srodata)) && (__p < SYMBOL(_erodata)); \ }) extern char _sinittext[], _einittext[]; -#define is_kernel_inittext(p) ({ \ - char *__p = (char *)(unsigned long)(p); \ - (__p >= _sinittext) && (__p < _einittext); \ +#define is_kernel_inittext(p) ({ \ + const unsigned long __p = (unsigned long)(p); \ + (__p >= SYMBOL(_sinittext)) && (__p < SYMBOL(_einittext)); \ }) extern enum system_state { -- 1.9.1 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |