回答
可以在結構使用pahole
輸出信息有關孔和可選試圖包裝它們。
您可能需要閱讀"Poke-a-hole and friends"和the pahole announcement更多信息
謝謝。我想這是我正在尋找的。 – John
您可以通過使用sizeof
和&
編寫特定struct
的探針代碼來探索此問題;如果sizeof
的第n個成員不等於下一成員減去成員的地址的地址,有一個洞。
可以檢測這樣的經由offsetof
宏「洞」:
#include <stddef.h>
struct test {
char a;
int b;
};
...
printf("%zu", offsetof(struct test, b));
如果這個打印多於1
,b
顯然有對準要求,編譯器在生成之間的間隙。
很明顯,這發生在運行時,而不是編譯時,但您可以編寫一個腳本生成類似的源文件,在您的項目其餘部分之前編譯並運行它,然後根據輸出結果決定如何建立你的項目。
我不認爲任何編譯器提供了一種機制來通知你有關。
在不分析源代碼的情況下找到這種漏洞的一種方法是,使用offsetof()等)來從對象/可執行文件/符號文件中提取符號/調試信息看看它們中定義的結構和成員,它們的偏移量和大小,看看是否所有東西都加起來了。不過,工會會讓事情變得複雜。
所以我想沒有編譯器開關:)。然而,這對我來說很有意思(至少對我而言)。如果我想分析目標文件,我會從哪裏開始? – John
@John:首先看看是否有任何工具可以讀取符號/調試信息並以某種人類可讀形式轉儲它。如果沒有,請查看哪些工具(您擁有源代碼)會使用這些數據並基於此開發您自己的數據。和往常一樣,請參閱有關文件格式的文檔。 –
這就是'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);
*注意:您必須在您的卡每兩個成員這樣做。
金培爾的FlexeLint/PClint可以做到這一點。
$ cat tst.c
int main (void)
{
struct {
char c;
double d;
short s;
} f = { 1, 2.0, 3 };
return f.c;
}
它會報告
$ flexelint -w1 +e95? tst.c
FlexeLint for C/C++ (Unix) Vers. 9.00L, Copyright Gimpel Software 1985-2014
--- Module: tst.c (C)
_
double d;
tst.c 5 Note 958: Padding of 7 byte(s) is required to align member on 8 byte
boundary
_
} f = { 1, 2.0, 3 };
tst.c 7 Note 959: Nominal struct size (18 bytes) is not an even multiple of
the maximum member alignment (8 bytes)
tst.c 7 Note 958: Padding of 6 byte(s) is required to align end of struct on
8 byte boundary
你需要一個解析器理解C/C++結構和包括必要包括文件。
至於說通過@ roee-gavirel,我覺得更容易解決方案是創建一個測試程序,打印出的偏移
#include <stdio.h>
#include <stddef.h>
typedef struct tData {
long id; /* 8 bytes */
char name[8]; /* 8 bytes */
float salary; /* 4 bytes */
} tData;
tData d;
int main()
{
size_t s_tData = sizeof(tData);
size_t s_id = sizeof(d.id);
size_t s_name = sizeof(d.name);
size_t s_salary = sizeof(d.salary);
printf("sizeof(tData) = %zu\n\n", sizeof(d));
printf("'id' is at = %3zu occupies %zu bytes\n",
offsetof(tData, id), s_id);
printf("'name' is at = %3zu occupies %zu bytes\n",
offsetof(tData, name), s_name);
printf("'salary' is at = %3zu occupies %zu bytes\n",
offsetof(tData, salary), s_salary);
printf("\n");
if (s_tData != s_id + s_name + s_salary)
printf("There is/are holes\n");
return 0;
}
- 1. 結構對準C/C++
- 2. C++ stl :: map查找結構
- 3. C++快速查找結構
- 4. C#結構/查找表
- 5. 是它在C++標準對準這樣的結構
- 6. C - 如何查找結構的大小?
- 7. C中的標準數據結構庫?
- 8. C++中的結構比對
- 9. 對象值對的標準結構
- 10. C如何基於結構的結構
- 11. 性能C結構對C++結構/
- 12. 查找結構集
- 13. C結構由偏移
- 14. 轉印C結構的至C#結構由SOKET API
- 15. 在C++中的結構向量中查找函數的問題
- 16. 用於確定C/C++結構中元素對齊的算法
- 17. 查找表中對於給定的標準
- 18. 查找的sizeof結構
- 19. fmt.Sscanf對於結構
- 20. 用於在多維數組中查找相鄰值的C++數據結構
- 21. 查找C中的對象++
- 22. C++對齊結構
- 23. C結構對齊
- 24. C結構對齊
- 25. 用於在嵌套intervalls中查找的數據結構?
- 26. 結合查找和有序數據的C++數據結構
- 27. 查找導航結構中的級別?
- 28. 查找結構數組中的值
- 29. 查找結構數組中的值
- 30. 查找向量中的結構
存在已知的技術來寫的結構,所以你可以幾乎肯定的是他們做的不包含填充。如果這有幫助,請告訴我,我會填寫你的詳細信息。 – Lindydancer
出於好奇,爲什麼? – detly