繁体   English   中英

我如何找出正在改变C ++中函数的返回地址的内容

[英]How can I find out what's changing the return address of a function in c++

我有一个程序,行为异常,并且可能具有未定义的行为。 有时,函数的返回地址似乎已更改,但我不知道是什么原因引起的。

返回地址始终更改为相同的地址,而该控件内部的断言不应该到达。 我已经能够使用调试器停止该程序,以查看应该执行return语句时,它直接跳到带有断言的行。

此代码近似于我的函数的工作方式。

int foo(Vector t)
   double sum = 0;
   for(unsgined int i=0; i<t.size();++i){
        sum += t[i]; 
   }
   double limit = bar(); // bar returns a value between 0 and 1
   double a=0;
   for(double i=0; i<10; i++){
       a += f(i)/sum; // f(1)/sum + ... + f(10)/sum = 1.0f
       if(a>3)return a;
   }
   //shoudn'get here
   assert(false); // ... then this line is executed
}

到目前为止,这是我尝试过的:

  • 使用.at切换所有std :: vector []运算符,以防止意外写入内存
  • 确保所有按值返回的值都是const。
  • 在gcc中打开-Wall-Werror以及-pedantic-errors
  • 用valgrind跑程序

我收到了一些invalid read of size 8invalid read of size 8 ,但它们似乎源自qt,所以我不确定该怎么做。 这可能是问题吗?

仅当我运行程序一段时间并为其提供某些输入值时,才会偶尔发生该错误,并且在发行版本中而不是在调试版本中更常见。

编辑:因此,我设法在控制台应用程序(未加载qt)中重现该问题,然后设法模拟导致该问题的事件。

就像你们中的一些建议一样,事实证明我错误地判断了导致它到达断言的真正原因,这可能是由于我对qt调试器缺乏经验所致。 实际的问题是用作循环条件的double中的浮点错误。

我正在实现softmax,但是使用特定的输入将exp(x)舍入为零。

现在,当我解决了问题时,我可以改写一下。 有没有一种方法可以自动检查诸如舍入错误之类的问题。 即打破0/0例如?

简短的答案是:

确定是否发生浮点异常情况的最可移植方法是使用fenv.h中C提供的浮点异常功能。

尽管不幸的是,这远非完美。

我建议您同时阅读https://www.securecoding.cert.org/confluence/display/seccode/FLP04-C.+Check+floating-point+inputs+for+exception+valueshttps://www.securecoding .cert.org / confluence / display / seccode / FLP03-C。+ Detect + and + handle + floating-point +错误可以简明地解决您所提出的确切问题:

有没有一种方法可以自动检查诸如舍入错误之类的问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM