unsigned int get_interesting_32bit_value(void) { unsigned int num = 0; switch (rand() % 10) { case 0: num = 0x00000000; break; case 1: num = rand() % 256; // 00-0xff break; case 2: num = 1 << (rand() % 32); // set a single bit. break; case 3: num = 0x8fffffff; break; case 4: num = 0xff; num = num << (rand() % 31); break; case 5: num = 0xffff0000; break; case 6: num = 0xffffe000; break; case 7: num = 0xffffff00 | (rand() % 256); break; case 8: num = 0xffffffff - page_size; break; case 9: num = 0xffffffff; break; } num = plus_minus_two(num); return num; }
unsigned long get_interesting_value(void) { unsigned long low = 0; switch (rand() % 3) { case 0: low = get_interesting_8bit_value(); break; case 1: low = get_interesting_16bit_value(); break; case 2: low = get_interesting_32bit_value(); break; } low = (rand() & 0xf) ? low : plus_minus_two(low); // 1 in 16 call plus_minus_two #if __WORDSIZE != 32 if (RAND_BOOL()) { // FIXME: This should likely be less aggressive than 50/50 switch (rand() % 11) { case 0: return 0x0000000100000000UL | low; case 1: return 0x7fffffff00000000UL | low; case 2: return 0x8000000000000000UL | low; case 3: return 0xffffffff00000000UL | low; case 4: return 0xffffffffffffff00UL | RAND_BYTE(); case 5: return 0xffffffffffffffffUL - page_size; case 6: return PAGE_OFFSET | (low << 4); case 7: return KERNEL_ADDR | (low & 0xffffff); case 8: return MODULE_ADDR | (low & 0xffffff); case 9: return per_arch_interesting_addr(low); case 10: return (low << 32); } } #endif /* __WORDSIZE */ return low; }