PVS-Studio:即使检查了COM方法结果,也会生成警告V595

时间:2017-04-27 17:09:31

标签: pvs-studio

(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();
}

1 个答案:

答案 0 :(得分:1)

这是我们的功能注释系统的错误。 PVS-Studio分析仪目前有来自最受欢迎的图书馆的6000多种功能的注释。 These annotations允许该工具执行大量诊断。但是,我们还没有注释函数BindToObject和QueryInterface。但即使我们拥有,它也无济于事。目前没有注释指定返回的poitner如何与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之一或使用suppression base