11

レガシーコードからgcc警告を削除しています。

型キャストによって「異なるサイズの整数からポインタへのキャスト」という警告を抑制することは可能ですか?

example:

some_struct *ptr = func()  // func() returns an integer.

誰かがそのようなgcc警告を解決する方法を教えてもらえますか?

4

3 に答える 3

21

まず、修正できるfunc(ソースの変更が許可されている)場合は、修正します。その計算がポインターを使用して実行できる場合は、ポインターを使用して計算を実行し、ポインターを返します。アドレスを整数として処理する正当な理由がある場合があります(たとえば、特別なコードでの配置の問題の処理)。その場合は、タイプ(で定義)funcを使用するように変更してください。必要に応じてポインタを整数として扱うように設計されています。(何らかの理由で符号付き演算の方が優れている場合もありますが、一般的に符号なしの方が面倒ではないと思います。)できれば、を返すときにポインタに変換する必要があるため、の戻り型はポインタ(何かへのポインタ)になります。おそらくまたは)。uintptr_tstdint.hintptr_tuintptr_tfuncuintptr_tfuncsome_structvoid

修正できない場合はfunc、キャストを使用して、実行中の変換を実行する予定であることをコンパイラーに通知できます。ただし、この特定のエラーメッセージは、整数をポインタに変換しているだけでなく、あるサイズ(4バイトなど)の整数を別のサイズ(8バイトなど)のポインタに変換していることを示しています。このコードは元々、によって返される整数型funcがポインター型と同じサイズであるシステム用に作成された可能性がありますが、現在、ポインター型がその整数サイズよりも大きいまたは小さいシステムでコンパイルしています。

その場合、によって実行される計算がfunc新しいアーキテクチャで機能することを確認する必要があります。32ビット値のみを返す場合、それは常に正しい値を保持しますか?つまり、上位32ビットが欠落しても何も失われませんか?計算する必要のあるアドレスがfunc、使用する整数型の最大値を超えることはありませんか?符号付き整数型を使用している場合funcは、符号ビットも考慮してください。

によって返される値funcが正しいことを確認した場合は、次のような明示的なキャストを使用できますsome_struct *ptr = (some_struct *) (intptr_t) func();

于 2012-08-03T13:51:20.707 に答える
6

私のgccはあなたが引用した警告を出しません。コードにキャストがないので、それも奇妙でしょう。

警告が表示されます

assignment makes pointer from integer without a cast

「キャストなし」の部分に注意してください。したがって、(動作を変更せずに)キャストすることでgccをサイレントにすることができます。

some_struct *ptr = (void*)func();

func次に、の戻り型がアドレスに適合しない場合は、警告(「異なるサイズの整数からポインタへのキャスト」)が表示されます。func()これは、適切な整数型に追加でキャストすることで消音できます。例intptr_t

some_struct *ptr = (void*)(intptr_t)func();

これはすべて、間違ったサイズの整数をポインタに変換したいという前提の下で行われます。おそらく、コードを作り直すことはより良い考えです。

于 2012-08-03T13:45:19.070 に答える
3

ここには2つの可能性があります。

  1. func整数への実際のポインタをキャストしています。後でポインタとして使用されます。
  2. funcポインタに格納されている整数を返しています。ptr後で整数にキャストされ、整数として使用されます。

最初のケースでは、からの戻り値は情報func失い、ほとんどの64ビットメモリモデル(WindowsおよびLinuxを含む)intにあるデータポインタのサイズよりも小さい場合、クラッシュまたは悪化する可能性があります。その場合、のリターンタイプを;に変更する必要があります。void *の代わりにintptr_tを使用するを参照してください?なぜ/いつCで型キャストに`intptr_t`を使用するのですか?funcintptr_t

2番目のケースでは、それほど問題にはなりませんが、エンディアンの問題に対処するには、intptr_tsome_struct *ptr = (some_struct *)(intptr_t)func();以降をキャストする必要がありますint value = (int)(intptr_t)ptr;。 この問題の説明については、GLib型変換マクロを参照してください。

于 2012-08-03T13:47:57.477 に答える