我发现了一些遗留代码,并认为它在减去指针方面具有 UB。 如果我猜对了并且 UB 在这里 - 我可以通过 ASAN 找到它吗? 我尝试选项 -fsanitize=address,pointer-subtract,但没有发现问题。
g++ -O0 -fsanitize=address,pointer-subtract main.c
ASAN_OPTIONS=detect_invalid_pointer_pairs=1 ./a.out
或者也许我弄错了,没有UB?
#define ATTRIBUTE_PACKED_1 __attribute__((aligned(1),packed))
typedef struct DAT
{
unsigned int IP;
unsigned short port;
} ATTRIBUTE_PACKED_1 Data;
int main(void)
{
static Data data;
int diff = ((unsigned char*) &data) - ((unsigned char*) &data.port);
return 0;
}
最佳答案
将指针强制转换为 unsigned char*
以访问原始字节,并将指针强制转换以在对象或对象数组中执行指针算术(在本例中,data
可以被视为包含 1 个 Data
对象的数组),是 C 和 C++ 标准中明确定义的行为。
但是,port
的地址位于内存中data
的地址之后,因此您的减法将导致负偏移,这可能是也可能不是你正在寻找。要获取 data
中 port
的字节偏移量,您需要以相反的顺序减去地址:
int offset = ((unsigned char*) &data.port) - ((unsigned char*) &data);
关于c++ - 用结构体数据减去指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61964643/