c言語算術演算子の越境問題解決策


大量のセキュリティ・ホールは、計算機の算術演算の微妙な詳細によるものであり、具体的なC言語は、符号数と符号数の間の変換など、算術演算の境界が予測不可能なエラーとセキュリティ・ホールを引き起こし、具体的な判例は数え切れないほどである。システム・プログラマーとして、これらの詳細を深く知る必要がある。本編ではcsappを参照してください。算術演算の限界をどう判断するかを紹介します。あまり難しくないです。主に肝心な定理を使ってコードを書きます。Go~問題一:符号なしの加算越境問題[定理]
[理解]この定理は比較的に簡単で、同じく比較的に人に納得させることができます。説明しません。
 
/* Determine whether arguments can be added without overflow */
int uadd_ok(unsigned int x, unsigned int y)
{
return !(x+y < x);
}
問題2:符号なしの減算越境問題[定理]


[理解]1.コンピュータには減算がありません。x-y=x+(-y)ここでの-yは上記のyの加算の逆元です。符号があるかどうかは別として、加算の逆元の定義だけが違います。 3.C言語保証-x=~x+1;この方法は上の式と等価であることを確認できます。4.s=x-y=x+(-y)ではオーバーフローはyが0でないか、または同じです。uddok(x,-y)
 
/* Determine whether argumnts can be substracted without overflow */
int usub_ok(unsigned int x, unsigned int y)
{
return !y || !uadd_ok(x, -y);
}
問題三:符号なしの乗法越境問題[定理]
[理解]等価条件は相互に導出すればよい。
 
/* Determine whether arguments can be multiplied without overflow */
int umul_ok(unsigned int x, unsigned int y)
{
unsigned int p = x * y;
return !x || p/x==y;
}
問題四:符号数のある加算境界問題[定理]は、2つの符号数x,y.境界を越える等価条件はx,yは正またはx,yは正の数,x+yは正の数,x+yは負の数.この定理が比較的容易である。

[理解]符号なしの減算と同様に、加算逆元の定義だけが違っていますが、ビットパターンは同じです。C言語は-x=~x+1を保証できます。同様に、2つのケースに分けて議論します。コードを参照してください。
 
/* Determine whether arguments can be added without overflow */
int tadd_ok(int x, int y)
{
return !(x<0&&y<0&&x+y>0 || x>0&&y>0&&x+y<0);
}
問題6:符号数のある乗算境界問題[定理]は完全に符号なしの乗算と同じです。
 
/* Determine whether arguments can be subtracted without overflow */
int tsub_ok(int x, int y)
{
  #if 0
  if (y == INT_MIN)
  return x<0;
  else
  return tadd_ok(x, -y);
  #endif
  return y==INT_MIN&&x<0 || y!=INT_MIN&&tadd_ok(x, -y);
}