2011-04-13 135 views
1

我正在寻找“坏/破”的C代码,我可以使用测试基于单片机的系统上的错误处理程序。不良C代码来测试错误处理程序

我正在寻找在运行时会中断的代码。

因此,发疯了,你的背包里有哪些小代码可以用来破坏系统。并且应该由错误处理程序处理以避免不受控制的行为。

/感谢


我将与一对夫妇的例子开始。

写一个空指针

int* pointer = 0x0; 
*pointer = 0xBAADC0DE; 

值写入指针是unvalid

int* pointer = 0xCAFEBABE; 
*pointer = 0xDEADBEEF; 

跳转到一个unvalid函数指针

int (*fpBabe)() = 0xDEADBABE; 
fpBabe(); 

那么你有一些更糟糕的事情,你可以抛出一个错误处理程序?

+0

是否错误处理程序不来与排序文件的那描述了它可以处理哪些类型的错误? – 2011-04-13 20:18:52

+1

可能的重复[使C++崩溃而不投射?](http://stackoverflow.com/questions/5556183/make-c-crash-without-casting) – MByD 2011-04-13 20:19:50

+1

@Oli这是供将来参考,我想我会写一个为一个特定的系统。因为我现在是一个TTD家伙。我收集的东西,我可以测试这个错误处理程序。所以这是明天,但看到所有令人讨厌的答案也很有趣。 – Johan 2011-04-13 20:38:05

回答

2

除以零(和简单的数学在它获得的情况下,编译器试图优化它拿走):

int i = argc; 
return 34/(argc-i); 

尝试访问一个高的内存地址,以及较低的一个:

char *v = ~0; 
*v = '\0'; 

如果你有一个堆MGMT库,尝试释放两次:

char *ptr = malloc(4096); 
free(ptr); free(ptr); 

尝试不ABA分配内存NDON:

for(;;) 
    malloc(4096); 

尝试以排出堆:

int foo(int arg) { return foo(arg+1); } 
int main(int a, char *v[]) { return foo(1); } 
+0

div by zero,classic :) – Johan 2011-04-13 20:17:42

1

写过去一个缓冲区的末尾:

char dest[5]; 
const char* src = "a bigger source"; 
strcpy(dest,src); 

dest[5]='\0'; 
+0

这相当于写入无效指针。 – 2011-04-13 20:19:33

+1

好吧,如果你倒退(或前进在拱门上)只需几步就可以摧毁像堆栈指针这样的东西,然后当我们试图从这个函数返回时,我们有另一个有趣的bug ... – Johan 2011-04-13 20:57:00

2
int f() { return f() + f(); } 
int g() { return g(); } 
int h() { while(1); } 
+0

最后一个isn'不一定是错误。 – 2011-04-13 20:22:58

+0

@oli - 你是对的,但是OP的要求有些模糊。 “坏/坏C代码”涵盖了相当广泛的范围。 – 2011-04-13 20:29:08

+0

但f()和g()是很好的测试:) – Johan 2011-04-13 20:32:09

2

通过相互递归排出栈(可能难以检测):

int f(void) { return g(); } 
int g(void) { return f(); } 
int main(void) { return f(); } 

...或者通过有趣的信号处理:

void handler(int n) { raise(n); raise(n); } 
int main(void) { signal(SIGINT, &handler); raise(SIGINT); return 0; } 

摧毁堆:

for (char *x = malloc(1); *x++ = 42;); 

摧毁堆和怪免费():

char *x = malloc(1); 
for (int i = 0; i < 100; x[i++] = 42); 
free(x); // free() will probably segfault