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;
}
Пример #2
0
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;
}