1*1f5207b7SJohn Levon #include "check_debug.h"
2*1f5207b7SJohn Levon 
memset(void * ptr,char c,int size)3*1f5207b7SJohn Levon void memset(void *ptr, char c, int size){}
4*1f5207b7SJohn Levon 
copy_to_user(void * dest,void * data,int size)5*1f5207b7SJohn Levon int copy_to_user(void *dest, void *data, int size){}
some_func(struct foo * p)6*1f5207b7SJohn Levon int some_func(struct foo *p){}
7*1f5207b7SJohn Levon 
8*1f5207b7SJohn Levon typedef struct zr364xx_pipeinfo {
9*1f5207b7SJohn Levon 	char x;
10*1f5207b7SJohn Levon 	int y;
11*1f5207b7SJohn Levon } aa_policy_t;
12*1f5207b7SJohn Levon 
13*1f5207b7SJohn Levon struct aa_policy {
14*1f5207b7SJohn Levon 	int x;
15*1f5207b7SJohn Levon };
16*1f5207b7SJohn Levon 
17*1f5207b7SJohn Levon struct foo {
18*1f5207b7SJohn Levon 	struct aa_policy a;
19*1f5207b7SJohn Levon 	int x;
20*1f5207b7SJohn Levon 	int y;
21*1f5207b7SJohn Levon };
22*1f5207b7SJohn Levon 
23*1f5207b7SJohn Levon struct foo *p;
24*1f5207b7SJohn Levon struct foo global_dec;
25*1f5207b7SJohn Levon void *ptr;
26*1f5207b7SJohn Levon 
main(void)27*1f5207b7SJohn Levon int main(void)
28*1f5207b7SJohn Levon {
29*1f5207b7SJohn Levon 	struct zr364xx_pipeinfo one;
30*1f5207b7SJohn Levon 	struct aa_policy two;
31*1f5207b7SJohn Levon 	aa_policy_t three;
32*1f5207b7SJohn Levon 	struct foo four;
33*1f5207b7SJohn Levon 	struct foo five;
34*1f5207b7SJohn Levon 	struct foo six;
35*1f5207b7SJohn Levon 	struct foo seven;
36*1f5207b7SJohn Levon 	struct foo eight;
37*1f5207b7SJohn Levon 	struct foo nine;
38*1f5207b7SJohn Levon 
39*1f5207b7SJohn Levon 	p->a.x = 0;
40*1f5207b7SJohn Levon 	global_dec.x = 0;
41*1f5207b7SJohn Levon 	memset(&two, 0, sizeof(two));
42*1f5207b7SJohn Levon 	four.x = 0;
43*1f5207b7SJohn Levon 	six = five;
44*1f5207b7SJohn Levon 	some_func(&seven);
45*1f5207b7SJohn Levon 	eight.x = (four.x < 5 ? four.x : 5);
46*1f5207b7SJohn Levon 	eight.y = !five.y;
47*1f5207b7SJohn Levon 	if (some_func()) {
48*1f5207b7SJohn Levon 		nine.x = 1;
49*1f5207b7SJohn Levon 		nine.y = 2;
50*1f5207b7SJohn Levon 	}
51*1f5207b7SJohn Levon 
52*1f5207b7SJohn Levon 	copy_to_user(ptr, &p->a, sizeof(struct aa_policy));
53*1f5207b7SJohn Levon 	copy_to_user(ptr, &global_dec, sizeof(global_dec));
54*1f5207b7SJohn Levon 	copy_to_user(ptr, &one, sizeof(one));
55*1f5207b7SJohn Levon 	copy_to_user(ptr, &two, sizeof(two));
56*1f5207b7SJohn Levon 	copy_to_user(ptr, &three, sizeof(three));
57*1f5207b7SJohn Levon 	copy_to_user(ptr, &four, sizeof(four));
58*1f5207b7SJohn Levon 	copy_to_user(ptr, &five, sizeof(five));
59*1f5207b7SJohn Levon 	copy_to_user(ptr, &six, sizeof(six));
60*1f5207b7SJohn Levon 	copy_to_user(ptr, &seven, sizeof(seven));
61*1f5207b7SJohn Levon 	copy_to_user(ptr, &eight, sizeof(eight));
62*1f5207b7SJohn Levon 	copy_to_user(ptr, &nine, sizeof(nine));
63*1f5207b7SJohn Levon 	return 0;
64*1f5207b7SJohn Levon }
65*1f5207b7SJohn Levon /*
66*1f5207b7SJohn Levon  * check-name: Rosenberg Leaks
67*1f5207b7SJohn Levon  * check-command: smatch -p=kernel -I.. sm_rosenberg.c
68*1f5207b7SJohn Levon  *
69*1f5207b7SJohn Levon  * check-output-start
70*1f5207b7SJohn Levon sm_rosenberg.c:54 main() warn: check that 'one' doesn't leak information (struct has a hole after 'x')
71*1f5207b7SJohn Levon sm_rosenberg.c:56 main() warn: check that 'three' doesn't leak information (struct has a hole after 'x')
72*1f5207b7SJohn Levon sm_rosenberg.c:57 main() warn: check that 'four.y' doesn't leak information
73*1f5207b7SJohn Levon sm_rosenberg.c:62 main() warn: check that 'nine.x' doesn't leak information
74*1f5207b7SJohn Levon  * check-output-end
75*1f5207b7SJohn Levon  */
76