我正在研究安全编码。
在下一页的第二个代码示例中,建议将 (char *) 用于“skip”变量。 https://www.securecoding.cert.org/confluence/display/seccode/EXP08-C.+Ensure+pointer+arithmetic+is+used+correctly
我不太确定这个例子中的地址计算。所以我做了以下代码。
#include <stddef.h>
#include <iostream>
using namespace std;
// https://www.securecoding.cert.org/confluence/display/seccode/EXP08-C.+Ensure+pointer+arithmetic+is+used+correctly
struct big {
unsigned long long ul1_1; // 8
unsigned long long ul1_2; // 8
unsigned long long ul1_3; // 8
int si_4; // 4
int si_5; // 4
};
void getAdrs(void *p) {
cout << p << endl;
}
int main() {
size_t skip = offsetof(struct big, ul1_2);
struct big *s = (struct big *)malloc(sizeof(struct big));
cout << skip << endl; // 8
getAdrs(s ); // 0x9a38008
getAdrs(s + skip ); // 0x9a38108 (+256)
getAdrs((char *)s + skip); // 0x9a38010 (+2)
unsigned long long val[4];
getAdrs(&val[0]); // 0xbfacc0f0
getAdrs(&val[1]); // 0xbfacc0f8 (+8)
getAdrs(&val[2]); // 0xbfacc100 (+16)
free(s);
s = NULL;
return 0;
}
在我看来,以下两个都返回了错误的地址。
1) getAdrs(s + 跳过); // 原始不合规代码
2) getAdrs((char *)s + 跳过); // 推荐
在这种情况下,我认为应该获得 ((struct big 的头地址) + 0x08),因为 ul1_2 位于从 struct big 的头部算起的第 8 个字节处。这样对吗?但是,上面的情况 2 似乎返回(struct big + 0x02 的头地址)。
我是正确的,还是我对地址的理解不正确?