On 10/15/2019 11:39 PM, Qian Cai wrote: > On Tue, 2019-10-15 at 14:51 +0530, Anshuman Khandual wrote: >> +static unsigned long __init get_random_vaddr(void) >> +{ >> + unsigned long random_vaddr, random_pages, total_user_pages; >> + >> + total_user_pages = (TASK_SIZE - FIRST_USER_ADDRESS) / PAGE_SIZE; >> + >> + random_pages = get_random_long() % total_user_pages; >> + random_vaddr = FIRST_USER_ADDRESS + random_pages * PAGE_SIZE; >> + >> + WARN_ON(random_vaddr > TASK_SIZE); >> + WARN_ON(random_vaddr < FIRST_USER_ADDRESS); > > It would be nice if this patch does not introduce a new W=1 GCC warning here on > x86 because FIRST_USER_ADDRESS is 0, and GCC think the code is dumb because > "random_vaddr" is unsigned, > > In file included from ./arch/x86/include/asm/bug.h:83, > from ./include/linux/bug.h:5, > from ./include/linux/mmdebug.h:5, > from ./include/linux/gfp.h:5, > from mm/debug_vm_pgtable.c:13: > mm/debug_vm_pgtable.c: In function ‘get_random_vaddr’: > mm/debug_vm_pgtable.c:359:23: warning: comparison of unsigned expression < 0 is > always false [-Wtype-limits] > WARN_ON(random_vaddr < FIRST_USER_ADDRESS); > ^ > ./include/asm-generic/bug.h:113:25: note: in definition of macro ‘WARN_ON’ > int __ret_warn_on = !!(condition); \ > ^~~~~~~~~ The test checks against an erroneous unsigned long overflow when FIRST_USER_ADDRESS is not 0 but a positive number. Wondering if the compiler will still complain if we merge both the WARN_ON() checks as || on a single statement.