模板函数调用错误503

False positive Error 503 for call to template function

本文关键字:错误 函数调用      更新时间:2023-10-16

我有一些代码,PC-Lint给我错误503:布尔参数关系。它是对模板函数的调用,定义如下:

template <typename ITypeToUse>
void ShowWindowEx(
    HWND hWnd,
    int nCmdShow,
    ITypeToUse *pControl);

调用本身看起来像这样:

ShowWindowEx<IActualType>(this->GetWndHandle(), SW_SHOW, m_spControl);

表面上,部分ShowWindowEx<IActualType>(...)被解释为Identifier1 < Identifier2 > Expression…PC-Lint似乎没有意识到ShowWindowEx是一个模板函数,它需要尖括号中的类型,并尽力将其解释为布尔表达式。

我知道我可以简单地告诉lint忽略这一行的错误(尽管实际上它大约有30行),但我想防止这种情况再次发生。此外,据我所知,PC-Lint应该能够处理模板函数调用,你知道为什么这里不是这种情况吗?

声明在头文件中的类内部,调用在该类的另一个成员函数中,该成员函数在ShowWindowEx之前声明。这两个成员函数的实现以相同的顺序发生在.cpp文件中,因此对showwindowwex的调用发生在其实现之前。是否有可能PC-Lint只是忽略了头?

编辑:现在我将函数原型改为:

template <typename IPointerToUse>
void ShowWindowEx(
    HWND hWnd,
    int nCmdShow,
    IPointerToUse pControl);

因此模板将处理指针类型。谢谢DeadMG的建议。问题仍然存在,因为我看不出上面不应该工作的理由,但它也是这样工作的。

503通常是C警告,而不是c++。它可以是你的c++文件包含模板函数调用被Lint认为是一个C文件,也许是通过在Windows机器上使用*.C(大写字母)?或者使用非标准扩展?

我在Windows PC Lint安装中使用Samba来Lint Unix c++程序时看到过这种情况。如果这仍然是一个问题,请查看指示模块名称(如--- Module: ...)的输出行,并查看括号之间的文件类型。如果关闭,您可能需要使用-vm(默认)。

如果是这种情况,我希望围绕调用有更多的警告,但是将模板<...>解释为两个比较操作符会合理地引发此警告。

除此之外,您所呈现的这一行—没有上下文—没有给出503在这里适用的任何理由。

原因可能是在Windows头文件中已经有了ShowWindowEx的定义(一个没有模板定义的定义)。也许你应该试着重命名你的函数