如何安全地從一種整數型別轉換為另一種整數型別,并在編譯器和靜態分析工具中敲響警鐘?
不同的編譯器會針對以下內容發出警告:
int i = get_int();
size_t s = i;
簽名丟失或
size_t s = get_size();
int i = s;
用于縮小。
鑄造可以消除警告但不能解決安全問題。
有沒有正確的方法來做到這一點?
uj5u.com熱心網友回復:
您可以嘗試boost::numeric_cast<>。
boost numeric_cast 回傳將 Source 型別的值轉換為 Target 型別的值的結果。如果檢測到超出范圍,則會引發例外(請參閱 bad_numeric_cast、negative_overflow 和 positive_overflow )。
uj5u.com熱心網友回復:
正確的方法是使用{}. 如果情況不安全,它不會讓您編譯代碼。如果你想編譯,盡管如此,你可以使用靜態轉換。
int i1 { 42 }; // compiles fine
char ch1 { 42 }; // still compiles fine, even though 42 is int
char ch2 { 256 }; // won't compile
char ch3 { i }; // won't compile
char ch4 { static_cast<char>(i) }; // will compile
int i2 { ch4 }; // Works
uj5u.com熱心網友回復:
如何安全地從一種整數型別轉換為另一種整數型別,并在編譯器和靜態分析工具中敲響警鐘?
控制何時需要轉換。盡可能,僅在沒有值變化時轉換。有時,人們必須退后一步,在更高的層次上編碼。IOW,是否需要有損轉換,或者可以重新撰寫代碼以避免轉換損失?
添加一個if(). 測驗只需要仔細形成。
示例在哪里需要比較size_t n。int len請注意,正值int可能超過size_t- 或反之亦然或相同。請注意,在這種情況下,to 的轉換int只unsigned發生在非負值的情況下 - 因此沒有值變化。
int len = snprintf(buf, n, ...);
if (len < 0 || (unsigned)len >= n) {
// Handle_error();
}
unsigned例如,int當已知該unsigned代碼點的值小于或等于時INT_MAX。
unsigned n = ...
int i = n & INT_MAX;
好的分析工具看到n & INT_MAX總是轉換成int無損失的。
uj5u.com熱心網友回復:
c 和 STL 中的 int 型別之間沒有內置的安全縮小轉換。您可以使用Microsoft GSL作為示例自己實作它。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/508310.html
上一篇:將模板類宣告為朋友
