C++ “叮当声检查”是否未能遵守“-isystem”?

C++ “叮当声检查”是否未能遵守“-isystem”?,c++,qt,clang-static-analyzer,C++,Qt,Clang Static Analyzer,对于Clang和GCC而言,-isystem标志添加了一个“system”include路径,这会导致编译器不会发出与在这些头中找到的代码相关的警告 但是,在我的代码上运行clangcheck,我看到以下警告: In file included from <myfile>.cpp:1: In file included from <Qt-path>/gcc_64/include/QtCore/QCoreApplication:1: In file included fro

对于Clang和GCC而言,
-isystem
标志添加了一个“system”include路径,这会导致编译器不会发出与在这些头中找到的代码相关的警告

但是,在我的代码上运行
clangcheck
,我看到以下警告:

In file included from <myfile>.cpp:1:
In file included from <Qt-path>/gcc_64/include/QtCore/QCoreApplication:1:
In file included from <Qt-path>/gcc_64/include/QtCore/qcoreapplication.h:40:
<Qt-path>/gcc_64/include/QtCore/qobject.h:235:16: warning: Potential memory leak
        return connectImpl(sender, reinterpret_cast<void **>(&signal),
               ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1 warning generated.
.cpp:1中包含的文件中的
:
在/gcc_64/include/QtCore/QCoreApplication:1中包含的文件中:
在/gcc_64/include/QtCore/qcoreapplication.h:40中包含的文件中:
/gcc_64/include/QtCore/qobject.h:235:16:警告:潜在内存泄漏
返回连接MPL(发送方、重新解释和信号),
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
生成1个警告。

…因此,
clangcheck
似乎没有将
-isystem
包含路径与
-I
包含路径区别对待。我是否误用了工具或误解了输出(即,这实际上是我代码中的潜在错误)?在运行
clang check
时,是否有另一种方法可以显式忽略来自Qt头的错误?

这是因为除了基本Qt包含目录之外,还必须通过“isystem”包含“QtCore”目录。这是因为clang找到更具体的包含(Qt-也是模块)并使用它。请参阅for-isystem中有关Include如何工作的信息

实际上,您希望执行以下操作:

contains(QT,"core") {
QMAKE_CXXFLAGS *= $$join(QMAKE_INCDIR_QT, " -isystem", "-isystem", "/QtCore")
}

对所有标准Qt模块(设计器、Gui、帮助、网络等)重复此操作。

我遇到了这个问题,并通过搜索引擎找到了这个问题。因此,对于像我这样的任何人,答案是使用-extra arg两次

比如说

/MyTool-extra arg=“-issystem”-extra arg=“my/system/include/path”myfile.cpp


您不会收到所有这些警告。

在运行
叮当检查
时,是否有另一种方法可以显式忽略来自Qt头的错误?因此您有理由认为应该忽略来自
QObject
的潜在内存泄漏?您能分享这些吗?@FrédéricHamidi我希望系统
的所有潜在问题包括s被忽略,因为一般来说,此类
#include
s来自无法修改的第三方代码,因此这些警告会分散
叮当检查
用户可以解决的任何问题的注意力。@FrédéricHamidi如果在我的代码中如何使用
QObject
存在问题,那么应该有一些问题在
clangcheck
输出中指出了这一点,但是上面的输出是我从
clangcheck
@FrédéricHamidi获得的唯一输出。我的意思是,如果我是一名Qt开发人员,显然我希望看到这个警告,但在这种情况下,我将使用
-I
而不是
-issystem
。你做得一切都很好,警告是我的显然,clang check是假的。这似乎特定于您用来调用clang check的任何工具;什么是
MyTool
?不,额外的arg处理程序是由
clang::tooling::CommonOptionsParser
处理的,您的工具将使用它来设置llvm-这对于所有clang::tooling实现都是通用的。啊,所以我包括直接运行
clang check
,因为它是一个clang工具?我在写问题时的理解是
clang check
直接接受与
clang
相同的参数。