PVS-Studio:即使检查 COM 方法结果也会生成警告 V595
PVS-Studio: warning V595 is generated even if COM methods results are checked
(1) 如果IMoniker::BindToObject
的结果是S_OK
那么返回的指针是有效的。但 PVS-Studio 将其标记为 V595。为什么?
(2) 如果QueryInterface
成功则返回指针有效。但 PVS-Studio 将其标记为 V595。为什么?
HRESULT sc;
if (featureValidateSource)
{
sc = lpmk->BindToObject(lpbc, NULL, IID_IOleObject, (void**)&lpObject);
if (FAILED(sc))
{
lpbc->Release();
lpmk->Release();
if (lpObject) lpObject->Release();
return sc;
}
lpObject->GetUserClassID(&clsid); // (1) <<< V595
}
LPOLELINK lpOleLink;
if (SUCCEEDED(m_pObject->QueryInterface(IID_IOleLink,(void**)&lpOleLink)))
{
sc = lpOleLink->SetSourceMoniker(lpmk, clsid); // (2) <<< V595
}
...
if (lpObject != NULL) // (1) <<< V595
{
lpObject->Update();
lpObject->Release();
}
if (lpOleLink) // (2) <<< V595
{
lpOleLink->Release();
}
这是我们函数注释系统的错误。 PVS-Studio 分析器目前具有来自最流行库的 6000 多个函数的注释。 These annotations 允许该工具执行大量诊断。但是,我们还没有注释函数 BindToObject 和 QueryInterface。但即使我们有,也无济于事。当前没有注释指定返回的指针如何与 HRESULT 类型的状态相关。一定有联系:如果某些函数执行成功,则返回非空指针。现在还没有,但是我们会逐步实现这个算法。然后误报就会消失。
由于现在没有这个连接,分析器查看代码如下:
if (X)
{
GetPtr(&ptr1);
if (Y)
return;
ptr1->foo(); // (1) <<< V595
}
if (GetPtr(&ptr2))
{
ptr2->foo(); // (2) <<< V595
}
if (ptr1 != NULL) // (1) <<< V595
;
if (ptr2 != NULL) // (1) <<< V595
;
指针以某种方式初始化。之后,它们被取消引用,然后检查是否为 NULL。它看起来很可疑,因此分析器发出警告。
所以,是的,我们有错。我们会及时改进对此类结构的分析。感谢您指出此代码。
至于目前,我们建议使用false positive suppression or use suppression base中的一种方法。
(1) 如果IMoniker::BindToObject
的结果是S_OK
那么返回的指针是有效的。但 PVS-Studio 将其标记为 V595。为什么?
(2) 如果QueryInterface
成功则返回指针有效。但 PVS-Studio 将其标记为 V595。为什么?
HRESULT sc;
if (featureValidateSource)
{
sc = lpmk->BindToObject(lpbc, NULL, IID_IOleObject, (void**)&lpObject);
if (FAILED(sc))
{
lpbc->Release();
lpmk->Release();
if (lpObject) lpObject->Release();
return sc;
}
lpObject->GetUserClassID(&clsid); // (1) <<< V595
}
LPOLELINK lpOleLink;
if (SUCCEEDED(m_pObject->QueryInterface(IID_IOleLink,(void**)&lpOleLink)))
{
sc = lpOleLink->SetSourceMoniker(lpmk, clsid); // (2) <<< V595
}
...
if (lpObject != NULL) // (1) <<< V595
{
lpObject->Update();
lpObject->Release();
}
if (lpOleLink) // (2) <<< V595
{
lpOleLink->Release();
}
这是我们函数注释系统的错误。 PVS-Studio 分析器目前具有来自最流行库的 6000 多个函数的注释。 These annotations 允许该工具执行大量诊断。但是,我们还没有注释函数 BindToObject 和 QueryInterface。但即使我们有,也无济于事。当前没有注释指定返回的指针如何与 HRESULT 类型的状态相关。一定有联系:如果某些函数执行成功,则返回非空指针。现在还没有,但是我们会逐步实现这个算法。然后误报就会消失。
由于现在没有这个连接,分析器查看代码如下:
if (X)
{
GetPtr(&ptr1);
if (Y)
return;
ptr1->foo(); // (1) <<< V595
}
if (GetPtr(&ptr2))
{
ptr2->foo(); // (2) <<< V595
}
if (ptr1 != NULL) // (1) <<< V595
;
if (ptr2 != NULL) // (1) <<< V595
;
指针以某种方式初始化。之后,它们被取消引用,然后检查是否为 NULL。它看起来很可疑,因此分析器发出警告。 所以,是的,我们有错。我们会及时改进对此类结构的分析。感谢您指出此代码。
至于目前,我们建议使用false positive suppression or use suppression base中的一种方法。