[英]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 []
運算符,以防止意外寫入內存 -Wall
和-Werror
以及-pedantic-errors
我收到了一些invalid read of size 8
的invalid 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+values和https://www.securecoding .cert.org / confluence / display / seccode / FLP03-C。+ Detect + and + handle + floating-point +錯誤可以簡明地解決您所提出的確切問題:
有沒有一種方法可以自動檢查諸如舍入錯誤之類的問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.