簡體   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