用于测试错误处理程序的错误C代码

时间:2011-04-13 20:14:52

标签: c unit-testing error-handling

我正在搜索“坏/坏”的c代码,我可以在基于mcu的系统上测试错误处理程序。

我正在搜索在运行时会中断的代码。

所以发疯了,你的后袋里有什么小块代码可以用来打破系统。并且应该由错误处理程序处理以避免不受控制的行为。

/感谢


我将从几个例子开始。

写入空指针

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

将值写入无效的指针

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

跳转到无效的函数指针

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

那么你可以在错误处理程序中抛出一些更糟糕的东西吗?

4 个答案:

答案 0 :(得分:2)

除以零(以及简单的数学运算,以便在编译器尝试优化它时):

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

尝试访问高mem地址,以及低地址:

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

如果您有一个堆mgmt库,请尝试释放两次:

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

尝试分配内存而不放弃:

for(;;)
    malloc(4096);

尝试耗尽筹码:

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

答案 1 :(得分:2)

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

答案 2 :(得分: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;);

销毁堆并责备free():

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

答案 3 :(得分:1)

写过缓冲区的末尾:

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

 dest[5]='\0';