gcc または clang (またはその他のコンパイラ) に、構造体に穴 (メモリ配置に関する) があるかどうかに関する情報を吐き出す方法はありますか?
ありがとうございました。
ps: 他に方法があれば教えてください。
gcc または clang (またはその他のコンパイラ) に、構造体に穴 (メモリ配置に関する) があるかどうかに関する情報を吐き出す方法はありますか?
ありがとうございました。
ps: 他に方法があれば教えてください。
を使用pahole
して、構造内の穴に関する情報を出力し、必要に応じて穴のパッキングを試みることができます。
自動ツールはわかりませんが、これは役立つ例です:
#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 人のメンバーごとにこれを行う必要があります。
struct
とを使用sizeof
して特定のプローブコードを作成することで、この質問を調べることができ&
ます。n番目sizeof
のメンバーが、次のメンバーのアドレスからそのメンバーのアドレスを引いたものと等しくない場合は、穴があります。
このような「穴」は、offsetof
マクロを介して検出できます。
#include <stddef.h>
struct test {
char a;
int b;
};
...
printf("%zu", offsetof(struct test, b));
これが以上を出力する場合1
、b
明らかにアライメント要件があり、コンパイラはその間にギャップを生成します。
明らかに、これはコンパイル時ではなく実行時に発生しますが、同様のソースファイルを生成し、プロジェクトの残りの部分の前にコンパイルして実行するスクリプトを記述し、出力に基づいて、次の方法についてさらに決定することができます。プロジェクトをビルドします。
そのことを通知する機能を備えたコンパイラはないと思います。
ソース コードを分析せずに (offsetof() などを使用して) チェックを追加せずにそのような穴を見つける方法の 1 つは、何らかのツールを使用してオブジェクト/実行可能ファイル/シンボル ファイルからシンボル/デバッグ情報を抽出し、それらの定義済みの構造体とメンバー、それらのオフセットとサイズ、およびすべてが合計されるかどうかを確認します。ただし、組合は物事を複雑にします。