c++ - 如何生成始终触发信号 SIGFPE(div by zero) 的代码?

标签 c++ unit-testing optimization divide-by-zero sigfpe

我需要编写一个单元测试,它应该总是触发除以零信号(SIGFPE),所以我可以测试和比较有/没有我的信号捕获模块会发生什么。
我的 Linux 信号捕捉/恢复模块已经开发完成,并按预期工作。
当我为模块编写单元测试时,我遇到了一个小麻烦。
这些是 UT 代码(通过 GTest):

int do_div_by_0() {
    int j = 0;
    return 123 / j; /* During release-buidling, this div-op would be optimized out,
                       although it would be not when debug-building! */
};

TEST_F( SignalsHandling_F, divByZeroDying ) {
   ASSERT_EXIT( {
      do_div_by_0();
      
      // never should go here!
      exit( EXIT_SUCCESS );

   }, KilledBySignal( SIGFPE ), "" );
};
如果所有代码都在 Debug模式下构建,则没有问题。但是除法操作会在 Release 模式下被优化,因此 SIGFPE 信号永远不会被触发!
为了保持产品代码和测试代码之间的一致性,我必须在发布产品时将它们全部构建为 Release模式。
如何编写一段总是触发信号 SIGFPE 的代码?
如果存在更“实际”的方法,我不想使用 raise() 函数,因为我想实际触发 SIGFPE 信号。
谢谢!请原谅我糟糕的英语!

最佳答案

int do_div_by_0() {
   int j = 0;
   FILE *f = fopen("/tmp/foobar",  "r");
   if (f) {
     fscanf(f, "%d", &j);
     fclose(f);
   };
   return 123 / j; /* During release-buidling, this div-op would be optimized out,
                   although it would be not when debug-building! */
};
可能是一个解决方案。当前GCC编译器(所以 GCC 10 在 2020 年 9 月)无法找出文件 /tmp/foobar 的内容在运行时(即使使用例如 gcc -O3 -Wall 进行强烈优化)。
当然,一个严肃的测试用例会涉及一些 shell 脚本填充 /tmp/foobar并使用一些 environ(7)文件名的变量。另见 mktemp(1)在您的测试 shell 脚本中使用。

关于c++ - 如何生成始终触发信号 SIGFPE(div by zero) 的代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64033464/

相关文章:

c++ - 编写一个循环以更改具有不同名称的 int 数组中的值

c++ - 如何将双指针分配给数组? C/C++

Python 单元测试模拟

unit-testing - 模拟类(class)还是真实类(class)?

python - 在 RK4 算法中使用 lambda 函数

mysql - 需要帮助优化 mysql 的纬度/经度地理搜索

c++ - 如果延迟很重要,我应该在繁忙的循环中使用 std::this_thread::yield 吗?

c++ - Static Cast 访问静态 const 类成员

optimization - 如何识别WEKA中的相关特征?

Android 单元测试 - 如何在与应用程序相同的项目中运行测试?