c++ - 用结构体数据减去指针

标签 c++ c address-sanitizer

我发现了一些遗留代码,并认为它在减去指针方面具有 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的地址之后,因此您的减法将导致负偏移,这可能是也可能不是你正在寻找。要获取 dataport 的字节偏移量,您需要以相反的顺序减去地址:

int offset = ((unsigned char*) &data.port) - ((unsigned char*) &data);

关于c++ - 用结构体数据减去指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61964643/

相关文章:

c++ - Rapidjson 根本不编码 utf8 序列

c++ - 为什么移动语义与动态内存分配中的浅拷贝具有相同的行为?

c++ - 如何在 C++ 中从 Windows 检索总系统 CPU 使用率?

c++ - QtConcurrent::blockingMapped() 和 std::vector<> 错误

c++ - UNIX sockets::recv、std::byte 和严格别名

address-sanitizer - AddressSanitizer : SEGV in _dl_get_tls_static_info

c - getpgid 未使用 valgrind 实现

if 语句中的 C 字符串比较不起作用

C-Fortran 混合编程

ios - Xcode 使用 `UIImage imageNamed:@"解决 sanitizer 问题“`