11

gcc または clang (またはその他のコンパイラ) に、構造体に穴 (メモリ配置に関する) があるかどうかに関する情報を吐き出す方法はありますか?

ありがとうございました。

ps: 他に方法があれば教えてください。

4

7 に答える 7

6

を使用paholeして、構造内の穴に関する情報を出力し、必要に応じて穴のパッキングを試みることができます。

詳細については、「Poke-a-hole and friends」pahole のお知らせをお読みください。

于 2011-10-06T13:17:06.633 に答える
1

自動ツールはわかりませんが、これは役立つ例です:

#include <stddef.h>

struct test {
  typea a;
  typeb b;
  typec c;
};

int gapB = offsetof(struct test, b) - (offsetof(struct test, a) + sizeof(typea));
int gapC = offsetof(struct test, c) - (offsetof(struct test, b) + sizeof(typeb));

printf("Gap of b:%d/n", gapB);
printf("Gap of c:%d/n", gapC);

*注: スタック内の 2 人のメンバーごとにこれを行う必要があります。

于 2011-10-06T13:02:11.883 に答える
0

structとを使用sizeofして特定のプローブコードを作成することで、この質問を調べることができ&ます。n番目sizeofのメンバーが、次のメンバーのアドレスからそのメンバーのアドレスを引いたものと等しくない場合は、穴があります。

于 2011-10-06T12:20:59.907 に答える
0

このような「穴」は、offsetofマクロを介して検出できます。

#include <stddef.h>

struct test {
  char a;
  int b;
};
...
printf("%zu", offsetof(struct test, b));

これが以上を出力する場合1b明らかにアライメント要件があり、コンパイラはその間にギャップを生成します。

明らかに、これはコンパイル時ではなく実行時に発生しますが、同様のソースファイルを生成し、プロジェクトの残りの部分の前にコンパイルして実行するスクリプトを記述し、出力に基づいて、次の方法についてさらに決定することができます。プロジェクトをビルドします。

そのことを通知する機能を備えたコンパイラはないと思います。

于 2011-10-06T12:22:38.323 に答える
0

ソース コードを分析せずに (offsetof() などを使用して) チェックを追加せずにそのような穴を見つける方法の 1 つは、何らかのツールを使用してオブジェクト/実行可能ファイル/シンボル ファイルからシンボル/デバッグ情報を抽出し、それらの定義済みの構造体とメンバー、それらのオフセットとサイズ、およびすべてが合計されるかどうかを確認します。ただし、組合は物事を複雑にします。

于 2011-10-06T12:26:49.210 に答える