您好,登錄后才能下訂單哦!
本篇內容主要講解“C++捕捉執行時錯誤怎么解決”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“C++捕捉執行時錯誤怎么解決”吧!
Avoid "mysterious" crashes. Avoid errors leading to (possibly unrecognized) wrong results.
避免“原因不明的”崩潰。避免導致(可能是沒有被認識的)錯誤結果的問題。
Example(示例)
void increment1(int* p, int n) // bad: error-prone
{
for (int i = 0; i < n; ++i) ++p[i];
}
void use1(int m)
{
const int n = 10;
int a[n] = {};
// ...
increment1(a, m); // maybe typo, maybe m <= n is supposed
// but assume that m == 20
// ...
}
這里我們在use1中混入了一個將會引起數據破壞或者崩潰的小錯誤。指針/數量風格的接口導致increment1()沒有辦法保護自己免受越界訪問的危害。如果我們檢查越界訪問的下標,那么錯誤直到訪問p[10]時才可能被檢出。我們可以修改代碼從而更早地進行檢查。
void increment2(span<int> p)
{
for (int& x : p) ++x;
}
void use2(int m)
{
const int n = 10;
int a[n] = {};
// ...
increment2({a, m}); // maybe typo, maybe m <= n is supposed
// ...
}
Now, m <= n
can be checked at the point of call (early) rather than later. If all we had was a typo so that we meant to use n
as the bound, the code could be further simplified (eliminating the possibility of an error):
現在,m<=n可以在調用時更早的檢查。如果只是一個打字錯誤,我們本來是想用n作為邊界,代碼可以更簡單(排除錯誤的可能性):
void use3(int m){ const int n = 10; int a[n] = {}; // ... increment2(a); // the number of elements of a need not be repeated // ...}
Don't repeatedly check the same value. Don't pass structured data as strings:
不要重復檢查同一個值,不要將結構化數據作為字符串傳遞。
Date read_date(istream& is); // read date from istream
Date extract_date(const string& s); // extract date from string
void user1(const string& date) // manipulate date
{
auto d = extract_date(date);
// ...
}
void user2()
{
Date d = read_date(cin);
// ...
user1(d.to_string());
// ...
}
The date is validated twice (by the Date
constructor) and passed as a character string (unstructured data).
date數據被兩次檢查(被Data類的構造函數)并且作為字符串傳遞(非構造化數據)
Example(示例)
過度檢查代價高昂。有些時候提早檢查會顯得很愚蠢:你可能永遠都用不到那個值或者你可能只會用到數據的一部分,而這一部分又比全體更容易檢查。類似地,也不要增加可能改變接口的時間復雜度特性的有效性檢查(例如不要向一個時間復雜度為O(1)的接口給增加時間復雜度為O(n)的檢查)
class Jet { // Physics says: e * e < x * x + y * y + z * z
float x;
float y;
float z;
float e;
public:
Jet(float x, float y, float z, float e)
:x(x), y(y), z(z), e(e)
{
// Should I check here that the values are physically meaningful?
}
float m() const
{
// Should I handle the degenerate case here?
return sqrt(x * x + y * y + z * z - e * e);
}
???
};
由于測量誤差的存在,關于jet的物理定律(e * e < x * x + y * y + z * z
)不是恒定成立的。
示例代碼的情況中是否在構造函數中增加檢查就是一個令人糾結的問題。
Enforcement(實施建議)
Look at pointers and arrays: Do range-checking early and not repeatedly 找到指針和數組,盡早進行范圍檢查但不要重復檢查
Look at conversions: Eliminate or mark narrowing conversions 找到類型檢查,排除或確定進行窄化轉換
Look for unchecked values coming from input 找到來此(外部)輸入的沒有經過檢查的數據
Look for structured data (objects of classes with invariants) being converted into strings 找到被轉換為字符串的結構化數據(包換約束條件的對象或類)
到此,相信大家對“C++捕捉執行時錯誤怎么解決”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。