1*1f5207b7SJohn Levon #include "check_debug.h" 2*1f5207b7SJohn Levon 3*1f5207b7SJohn Levon int frob(void); 4*1f5207b7SJohn Levon #define get_user(x, y) ({ int __val_gu = frob(); x = __val_gu; 0; }) 5*1f5207b7SJohn Levon func(void)6*1f5207b7SJohn Levonvoid func(void) 7*1f5207b7SJohn Levon { 8*1f5207b7SJohn Levon int *user_ptr; 9*1f5207b7SJohn Levon int foo, bar; 10*1f5207b7SJohn Levon unsigned int x; 11*1f5207b7SJohn Levon 12*1f5207b7SJohn Levon get_user(foo, user_ptr); 13*1f5207b7SJohn Levon bar = foo + 1; 14*1f5207b7SJohn Levon 15*1f5207b7SJohn Levon get_user(bar, user_ptr); 16*1f5207b7SJohn Levon if (bar > foo) 17*1f5207b7SJohn Levon bar = foo; 18*1f5207b7SJohn Levon foo = bar * 8; 19*1f5207b7SJohn Levon 20*1f5207b7SJohn Levon get_user(x, user_ptr); 21*1f5207b7SJohn Levon if (x > foo) 22*1f5207b7SJohn Levon x = foo; 23*1f5207b7SJohn Levon foo = x * 8; 24*1f5207b7SJohn Levon 25*1f5207b7SJohn Levon get_user(x, user_ptr); 26*1f5207b7SJohn Levon foo = x * 8; 27*1f5207b7SJohn Levon } 28*1f5207b7SJohn Levon /* 29*1f5207b7SJohn Levon * check-name: smatch get_user() #1 30*1f5207b7SJohn Levon * check-command: smatch -p=kernel -I.. sm_get_user1.c 31*1f5207b7SJohn Levon * 32*1f5207b7SJohn Levon * check-output-start 33*1f5207b7SJohn Levon sm_get_user1.c:13 func() warn: check for integer over/underflow 'foo' 34*1f5207b7SJohn Levon sm_get_user1.c:18 func() warn: check for integer underflow 'bar' 35*1f5207b7SJohn Levon sm_get_user1.c:26 func() warn: check for integer overflow 'x' 36*1f5207b7SJohn Levon * check-output-end 37*1f5207b7SJohn Levon */ 38