2

我正在研究安全编码。

在下一页的第二个代码示例中,建议将 (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;
}

http://ideone.com/b5kmS4

在我看来,以下两个都返回了错误的地址。

1) getAdrs(s + 跳过); // 原始不合规代码

2) getAdrs((char *)s + 跳过); // 推荐

在这种情况下,我认为应该获得 ((struct big 的头地址) + 0x08),因为 ul1_2 位于从 struct big 的头部算起的第 8 个字节处。这样对吗?但是,上面的情况 2 似乎返回(struct big + 0x02 的头地址)。

我是正确的,还是我对地址的理解不正确?

4

1 回答 1

5

你是绝对正确的!你的代码也是如此!唯一错误的是......你的十六进制数学。:)

getAdrs(s               ); // 0x9a38008 
getAdrs(s + skip        ); // 0x9a38108 (+256)
getAdrs((char *)s + skip); // 0x9a38010 (+2)


>>> print 0x9a38010 - 0x9a38008
8

(老实说,不要难过。在我看到它之前,我花了五分钟盯着它和链接的文档。我以前犯过很多次这个错误。)

于 2013-10-21T01:24:29.603 回答