gpt4 book ai didi

Coverity静态分析代码缺陷

转载 作者:行者123 更新时间:2023-12-04 11:03:00 43 4
gpt4 key购买 nike

我们使用 Coverity 检测代码中的漏洞。基本上这是代码片段:

static int vendor_request(
const struct OFPHDR *oh,
size_t length,
const struct OFPUTIL_MT **typep
)
{
const struct OFPSM *osr;
ovs_be32 vendor;

osr = (const struct OFPSM *) oh;

memcpy(&vendor, ((char*)osr + sizeof(struct OFPSM)), sizeof( vendor ));
if (vendor == htonl(VENDOR_A))
return (functionA(oh, typep));
if (vendor == htonl(VENDOR_B))
return (functionB(oh, length, typep));
else
return 0;
}

这里,

sizeof(struct OFPSM) = 12 bytes.

sizeof(struct OFPHDR) = 8 bytes.

Coverity 说:

CID xxxxx (#1 of 2): Out-of-bounds access (OVERRUN)   
1. overrun-buffer-val: Overrunning struct type OFPHDR of 8 bytes by passing it to a function which accesses it at byte offset 12. Pointer osr indexed by constant 12U through dereference in call to memcpy.

基本上 struct OFPHDR 是 TCP 层顶部的 PDU,它的大小为 8 个字节,但它可以根据 OFP 消息的类型而有所不同。 Coverity 说我在字节偏移索引 12 处取消引用 *oh,这是出站访问索引。

但我不明白这个问题,因为我正在将 OFPHDR 类型转换为 12 字节的正确结构,然后取消引用它。那么,如何避免这个错误呢?

最佳答案

这个 Actor :

osr = (const struct OFPSM *) oh;

打破了严格的别名规则,因为它正在转换为不兼容的类型。很明显它们是不兼容的,因为你说:

sizeof(struct OFPSM) = 12 bytes.

sizeof(struct OFPHDR) = 8 bytes.

关于Coverity静态分析代码缺陷,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23478008/

43 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com