Cトラップと欠陥-整数のオーバーフロー
951 ワード
一C言語整数演算
C言語には2種類の整数演算が存在し,符号演算と無符号演算がある.
2シンボル整数演算におけるオーバーフロー
無記号算術演算では,いわゆる「オーバーフロー」という言い方はないが,すべての無記号演算は2のn次方をモードとし,ここでnは結果中のビット数である.
演算子のオペランドの1つが符号付き整数であり、もう1つが符号なし整数である場合、符号付き整数は符号なし整数に変換され、「オーバーフロー」も発生しません.
両方のオペランドがシンボル整数である場合、「オーバーフロー」が発生する可能性があり、「オーバーフロー」の結果は定義されていません.1つの演算の結果に「オーバーフロー」が発生した場合、いかなる仮定をしても安全ではありません.
3シンボル整数オーバーフロー検出スキーム
1案1
2案2
C言語には2種類の整数演算が存在し,符号演算と無符号演算がある.
2シンボル整数演算におけるオーバーフロー
無記号算術演算では,いわゆる「オーバーフロー」という言い方はないが,すべての無記号演算は2のn次方をモードとし,ここでnは結果中のビット数である.
演算子のオペランドの1つが符号付き整数であり、もう1つが符号なし整数である場合、符号付き整数は符号なし整数に変換され、「オーバーフロー」も発生しません.
両方のオペランドがシンボル整数である場合、「オーバーフロー」が発生する可能性があり、「オーバーフロー」の結果は定義されていません.1つの演算の結果に「オーバーフロー」が発生した場合、いかなる仮定をしても安全ではありません.
if (a + b < 0)
complain();
。 a+b ” “ , 。
, , : , , 。 ,C ,a b , ” “。 ” “ , , if 。
3シンボル整数オーバーフロー検出スキーム
1案1
a b
if ((unsigned)a + (unsigned)b > INT_MAX)
complain();
INT_MAX , 。INT_MAX , usigned(a) unsigned(b) , INT_MAX。
2案2
if (a > INT_MAX - b)
complain();