9

VS.NETとGCCのコード警告を無料にし、64ビットのコードを用意したいと思っています。

今日、私はメモリバッファを処理し、ファイルスタイルのインターフェイスを介してデータへのアクセスを提供する小さなモジュールを作成しました(たとえば、バイトの読み取り、バイトの書き込み、シークアラウンドなど)。

現在の読み取り位置とサイズのデータ​​型として、size_tを使用しました。これが最も自然な選択であると思われるためです。警告を回避し、64ビットでも動作するはずです。

念のため:私の構造は次のようになります:

typedef struct
{
  unsigned char * m_Data;
  size_t          m_CurrentReadPosition;
  size_t          m_DataSize;
} MyMemoryFile;

の符号はsize_t実際には定義されていないようです。グーグルのコード検索はそれを証明した。

今、私はジレンマに陥ってsize_tいます。ユーザーが提供したデータを処理する必要があり、サードパーティのライブラリが私のコードを使用するため、オーバーフローがないか追加をチェックしたいと思います。ただし、オーバーフローチェックでは、符号を知る必要があります。それは実装に大きな違いをもたらします。

では、プラットフォームやコンパイラに依存しない方法で、このようなコードをどのように書くべきでしょうか?

size_t実行時またはコンパイル時にの署名を確認できますか?それは私の問題を解決するでしょう。あるいはsize_t、そもそも最善のアイデアではなかったのかもしれません。

何か案は?

編集:私はC言語の解決策を探しています!

4

6 に答える 6

13

size_tが署名されているか署名されていないかとGCCについて(古いGCCマニュアルから-まだそこにあるかどうかはわかりません):

size_tリリース2.4より前のGCCのタイプとバージョンには潜在的な問題があり ます。ANSI Cでは、 size_t常に符号なしタイプである必要があります。既存のシステムのヘッダーファイルとの互換性のために、GCCはシステムが定義size_tする stddef.hタイプに関係sys/types.hなく定義します。size_tで定義するほとんどのUnixシステム はsys/types.h、それを符号付き型として定義します。ライブラリ内の一部のコードは、符号なしタイプであることに依存しsize_tており、符号付きの場合は正しく機能しません。

署名されていないことを期待するGNUCライブラリコード size_tは正しいです。size_t符号付きタイプとしての定義が正しくありません。バージョン2.4では、GCCは常にsize_t符号なしタイプとして定義され、「fixincludes」スクリプトはsys/types.hこれと競合しないようにシステムをマッサージする予定です。

size_tそれまでの間、 GNCライブラリをコンパイルするときに符号なし型を使用するようにGCCに明示的に指示することで、この問題を回避します。size_t'configure'は、必要に応じてGCCがそれをオーバーライドするために使用するタイプを自動的に検出します。

署名されたバージョンのsize_t使用が必要な場合ptrdiff_t、または一部のシステムでは、のtypedefがありますssize_t

于 2008-10-15T21:31:52.337 に答える
5

size_t署名されていない必要があります。

通常、unsigned long として定義されます。

それ以外に定義されているのを見たことがありません。ssize_t署名された対応物です。

編集:GCCは、状況によっては署名済みと定義しています。ASNI C モードまたは std-99 でコンパイルすると、強制的に無署名になります。

于 2008-10-15T20:51:15.727 に答える
5

size_tC++ C 標準によると、符号なし整数型です。署名済みの実装はどれsize_tも深刻な不適合であり、おそらく他の移植性の問題も抱えています。オーバーフロー時にラップアラウンドすることが保証されているif (a + b < a)ため、オーバーフローを見つけるようなテストを書くことができます。

size_tメモリに関係するものには優れたタイプです。あなたはそれを正しくやっています。

于 2008-10-15T21:09:12.990 に答える
2

C 言語の場合はIntSafeを使用します。Microsoft からもリリースされています (C++ ライブラリ SafeInt と混同しないでください)。IntSafe は、数学を実行して安全に変換できる C 言語関数呼び出しのセットです。 intsafe 関数の更新された URL

于 2008-10-15T21:07:39.233 に答える
0

safeintを使用します。これは、Michael Howard によって設計され、Microsoft からオープン ソースとしてリリースされたクラスです。オーバーフローがリスクとして識別される整数を操作できるように設計されています。すべてのオーバーフローは例外に変換され、処理されます。このクラスは、正しく使用しやすいように設計されています。

例えば ​​:

char CouldBlowUp(char a, char b, char c)
{
   SafeInt<char> sa(a), sb(b), sc(c);

   try
   {
     return (sa * sb + sc).Value();
   }
   catch(SafeIntException err)
   {
      ComplainLoudly(err.m_code);
   }

   return 0;
}

また、office などの製品で Microsoft の内部で safeint が多く使用されています。

参照: リンク テキスト

于 2008-10-15T20:54:48.090 に答える
-1

質問を正確に理解しているかどうかはわかりませんが、次のようなことができるかもしれません:

temp = value_to_be_added_to;

value_to_be_added_to += value_to_add;

if (temp > value_to_be_added_to)
{
  overflow...
}

低い値に戻るため、オーバーフローしたかどうかを簡単に確認できます。

于 2008-10-15T20:58:11.717 に答える