4 #include "arch.h" // page_size
6 #include "sanitise.h" // get_address
8 #include "log.h" // For BUG
10 static void fabricate_onepage_struct(char *page
)
15 for (i
= 0; i
< page_size
; ) {
16 ptr
= (void*)&page
[i
];
19 i
+= sizeof(unsigned int);
22 *(unsigned int *)ptr
= rand32();
25 i
+= sizeof(unsigned long);
28 *(unsigned long *)ptr
= rand64();
37 i
+= sizeof(unsigned int);
40 *(unsigned int *)ptr
= rand() % page_size
;
43 BUG("unreachable!\n");
49 void generate_random_page(char *page
)
55 /* return a page of complete trash */
57 for (i
= 0; i
< page_size
; )
58 page
[i
++] = (unsigned char)rand();
62 for (i
= 0; i
< (page_size
/ 2); ) {
64 page
[i
++] = (unsigned char)rand();
69 for (i
= 0; i
< (page_size
/ 4); ) {
73 page
[i
++] = (unsigned char)rand();
77 /* return a page that looks kinda like a struct */
78 case 3: fabricate_onepage_struct(page
);
81 /* return a page of unicode nonsense. */
82 case 4: gen_unicode_page(page
);
85 /* page of 0's and 1's. */
87 for (i
= 0; i
< page_size
; )
88 page
[i
++] = (unsigned char)rand_bool();
91 /* page full of format strings. */
93 for (i
= 0; i
< page_size
; ) {
95 switch (rand_bool()) {
96 case 0: page
[i
++] = 'd';
98 case 1: page
[i
++] = 's';
103 page_size
= getpagesize(); // Hack for clang 3.3 false positive.
104 page
[rand() % page_size
] = 0;
107 /* ascii representation of a random number */
109 switch (rand() % 3) {
111 switch (rand() % 3) {
112 case 0: p
= sprintf(page_rand
, "%lu", rand64());
114 case 1: p
= sprintf(page_rand
, "%ld", rand64());
116 case 2: p
= sprintf(page_rand
, "%lx", rand64());
123 switch (rand() % 3) {
124 case 0: p
= sprintf(page_rand
, "%u", (unsigned int) rand64());
126 case 1: p
= sprintf(page_rand
, "%d", (int) rand64());
128 case 2: p
= sprintf(page_rand
, "%x", (int) rand64());
135 switch (rand() % 3) {
136 case 0: p
= sprintf(page_rand
, "%u", (unsigned char) rand64());
138 case 1: p
= sprintf(page_rand
, "%d", (char) rand64());
140 case 2: p
= sprintf(page_rand
, "%x", (char) rand64());
154 BUG("unreachable!\n");