タグ

2018年11月3日のブックマーク (2件)

  • ラップアラウンドの処理はめんどう - Dive to the Software

    32ビット値でインデックスとオフセットを受け取って、対象のアドレスになんかの操作をするような関数があったとする。 とりあえず、インデックスは最大100までとすると、範囲が超えてないかチェックする必要がでてくるわけで。 bool test(unsigned int index, unsigned int offset) { //範囲チェック if(100 < index + offset) { //エラー return false; } //何かの処理 return true; } これだと、index + offsetが32ビット値を超えるときに範囲内に戻っちゃうのでエラーにならない。 じゃぁ、一回64ビット値に入れればいいじゃないかと。 bool test(unsigned int index, unsigned int offset) { //範囲チェック long long targ

    ラップアラウンドの処理はめんどう - Dive to the Software
  • INT30-C. 符号無し整数の演算結果がラップアラウンドしないようにする

    以降のセクションでは、符号無し整数のラップアラウンドが発生する可能性のある演算について詳しく見ていく。int より小さな整数型に対する演算には、整数拡張 (integer promotion) が適用される。算術演算が行われる前に通常の算術型変換 (usual arithmetic conversion) が適用され、オペランドの型を共通の型へ暗黙的に変換する場合もある。セキュアな算術演算を実装する前に、C言語の整数変換のルールを理解しておくべきである(「INT02-C. 整数変換のルールを理解する」を参照)。 整数値は、特に次のいずれかの目的で利用する場合には、ラップアラウンドさせてはならない。 ポインタ演算の整数オペランド (配列インデックスを含む) 可変長配列の宣言における代入式 [] に先立つ後置式 (postix expression) もしくは配列オブジェクトの要素を指し示す

    INT30-C. 符号無し整数の演算結果がラップアラウンドしないようにする