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 Levon void 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