8

アプリケーションを に切り替えたいと思いますLARGEADDRESSAWARE。注意すべき問題の 1 つは、ポインタの差を符号付き 32b として表すことができなくなったため、ポインタ演算です。

大規模な C++ プロジェクトでポインター減算のすべてのインスタンスを自動的に見つける方法はありますか?

そうでない場合、これを達成するための「最小限の労力」の手動または半自動の方法はありますか?

4

5 に答える 5

3

PC-Lint は、この種の問題を見つけることができます。

http://gimpel-online.com/MsgRef.htmlを見てください。エラー コード 947:

ポインターに適用される減算演算子 - p と q の両方がポインターである p - q という形式の式が見つかりました。これは、最大ポインターがポインターの違いを保持する型をオーバーフローする可能性がある場合に特に重要です。たとえば、最大ポインタが 3 ギガバイト -1 であり、ポインタの違いが long で表され、最大 long が 2 ギガバイト -1 であるとします。これらの量の両方が 32 ビット ワード内に収まることに注意してください。次に、非常に大きなポインターから小さなポインターを減算すると、ポインターの違いを表す long に明らかな負の値が生成されます。逆に、小さなポインターから非常に大きなポインターを減算すると、正の量が生成される可能性があります。

于 2010-06-16T14:26:54.367 に答える
1

64 ビット コンパイラと Wp64 をオンにしてコードをコンパイルします。

ポインターは 64 ビット幅ですが、int、long、DWORD などは 32 ビット幅のままであるため、ptrdiff_t を int32_t にショートすると警告が表示されます。

于 2010-06-16T12:01:49.347 に答える
0

これは、20 億バイト (2GB) を超えて離れている 2 つのポインターがある場合にのみ問題になります。これは、次のことを意味します。

  • 非常に大きな配列 (> 2GB) のいずれか
  • または、まったく異なる構造を指すポインターを差し引いています

したがって、これらの特殊なケースを探してください。

ほとんどの場合、これは問題ではないと思います。

于 2010-06-16T09:28:21.557 に答える
0

私たちのコードはすでに GCC でコンパイルされているので、おそらく最速の方法は次のようになると思います。

  • GCC を構築する
  • ポインター減算が検出されるたびに警告 (またはエラー) を出力するように、GCC のカスタム変更を作成します。
  • プロジェクトをビルドし、ポインター減算に関するすべての警告を収集します

このために GCC に対して行う必要がある変更の概要を次に示します。

警告を次の場所に追加します。

  • c-typeck.c (pointer_diff関数)
  • cp/typeck.c (pointer_diff関数).

ポインターの減算を直接検出する以外に、最初にポインターを整数型に変換してから減算するケースを検出することもできます。これは、(. intptr_t)の正規表現検索の場合、コードの構造によってはより困難になる場合があります。-.*-(.*intptr_t) は非常にうまく機能しました。

于 2010-06-16T12:01:04.720 に答える