将Cppcheck和VCL结合在一起

问题描述

Cppcheck现在可以进行检查,以检测对涉及VCL类(C ++ Builder6)的代码的假阳性(danglingTemporaryLifetime)的引用。

这里是test.cpp

//---------------------------------------------------------------------------
#include <vcl.h>
#include <string>
//---------------------------------------------------------------------------

class TForm1 : public TForm
{
__published:
    TButton *Button1;
public:
    explicit __fastcall TForm1(TComponent* Owner);
};

//---------------------------------------------------------------------------

class TTest
{
public:
    std::string GetText() const;
    void Init()
    {
        m_form->Caption = GetText().c_str();
        m_form->Button1->Caption = "Text";
    }
    TForm1* m_form;

    // Forbidden:
    TTest(const TTest&);
    TTest& operator=(const TTest&);

};

//---------------------------------------------------------------------------

一个在BCB6中编译的示例,如果这样调用

"C:\Program Files\Cppcheck\cppcheck.exe" --enable=style --inconclusive test.cpp

再现错误:

Checking test.cpp ...
test.cpp:23:9: error: Using pointer to temporary. [danglingTemporaryLifetime]
        m_form->Button1->Caption = "Text";
        ^
test.cpp:22:34: note: Pointer to container is created here.
        m_form->Caption = GetText().c_str();
                                 ^
test.cpp:23:9: note: Using pointer to temporary.
        m_form->Button1->Caption = "Text";
        ^

learned that one should not provide the include path to the standard library也从未尝试过为VCL做它。但是,现在Cppcheck无法解决未知类的Caption属性。对于下一个成员访问(已知的Button1),将给出错误,并且分配有临时成员的未知成员在这里仍然有效。

我还试图通过添加来告诉VCL Cppcheck的包含路径

 -I "C:\Program Files (x86)\Borland\CBuilder6\Include\Vcl"

但这导致

C:\Program Files (x86)\Borland\CBuilder6\Include\Vcl\sysvari.h:3365:0: error: No pair for character ("). Can't process file. File is either invalid or unicode,which
is currently not supported. [preprocessorErrorDirective]
#pragma message "ERROR: sizeof(TVarData) < sizeof(VARIANT)'
^

如何解决这个问题?

解决方法

Cppcheck对此类属性有一些处理。我不希望Cppcheck为您的代码写垃圾。

您能告诉我如何复制吗?我已将您的代码放在文件1.cpp中,并使用命令cppcheck --enable=style --inconclusive 1.cpp没有收到警告。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...