【问题标题】:Bad C code to test a error handler用于测试错误处理程序的错误 C 代码
【发布时间】:2011-04-13 20:14:51
【问题描述】:

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

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

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

/谢谢


我将从几个例子开始。

写入空指针

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

向无效的指针写入值

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

跳转到一个无效的函数指针

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

那么你还有一些更糟糕的事情可以扔给错误处理程序吗?

【问题讨论】:

  • 错误处理程序是否没有附带描述它可以处理哪些类型的错误的文档?
  • Make C++ crash without casting? 的可能重复项
  • @Oli 这是供以后参考,我想我会为特定的系统写一个。因为我现在是一个 TTD 人。我收集的东西可以用来测试这个错误处理程序。所以这是明天的,但看到所有讨厌的答案也很有趣。

标签: c unit-testing error-handling


【解决方案1】:

除以零(以及简单的数学运算,以防编译器试图优化它):

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

尝试访问高内存地址和低内存地址:

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

如果您有堆管理库,请尝试释放两次:

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); }

【讨论】:

    【解决方案2】:
    int f() { return f() + f(); }
    int g() { return g(); }
    int h() { while(1); }
    

    【讨论】:

    • @oli - 你是对的,但 OP 的要求有些模糊。 “bad/brokenC 代码”涵盖的范围相当广泛。
    • 但是 f() 和 g() 是很好的测试 :)
    • 像 while(1) 这样的永恒循环必须由看门狗而不是错误处理程序来处理。但是 f() 和 g() 破坏了堆栈。
    • @Johan - 也许您可以描述一下“错误处理程序”是什么意思?
    • 对于更高级的 mcu:s,我们可以使用硬件来捕获这种错误,这个硬件与一些软件结合成为一个“错误处理程序”,大多数时候只是重新启动系统因为您无法以任何其他方式修复它。但是很高兴知道它可以处理和不处理什么。如果有任何调试数据我可以提取以使将来的错误搜索更容易。 (希望我不需要你)。
    【解决方案3】:

    通过相互递归耗尽堆栈(可能更难检测):

    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
    

    【讨论】:

      【解决方案4】:

      写到缓冲区的末尾:

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

       dest[5]='\0';
      

      【讨论】:

      • 好吧,如果你向后退(或在拱上前进)只需几个步骤,你就可以破坏堆栈指针之类的东西,然后当我们尝试从这个函数返回时,我们会遇到另一个有趣的错误.. .
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-18
      • 1970-01-01
      • 2017-08-27
      相关资源
      最近更新 更多