使用 CPPCHECK 在 Red Hat Enterprise Linux (RHEL) 上出现 C++ 宏问题

Posted

技术标签:

【中文标题】使用 CPPCHECK 在 Red Hat Enterprise Linux (RHEL) 上出现 C++ 宏问题【英文标题】:Issue with C++ macros on Red Hat Enterprise Linux (RHEL) using CPPCHECK 【发布时间】:2020-09-24 13:18:49 【问题描述】:

在我的工作中,我们正在开发一个基于 Red Hat Enterprise Linux (RHEL) 6 的大型 C++ 项目,很快就会成为 RHEL 8。使用 Bash shell。我们有时使用 Netbeans 来编辑源代码,但我更喜欢使用 vim。我们正在用两周的 sprint 进行 DevOps 和敏捷,并使用 Jenkins 构建引擎和 AccuRev 进行源代码控制。每次在 AccuRev 中促进代码更改时,Jenkins 都会自动启动代码库的新构建。作为该构建的一部分,CPPCHECK 用于对 C++ 源代码进行静态代码分析。

在我们系统的一部分中,我们使用 C++ 宏来定义单元测试脚本。宏没有完全定义,因为我们允许单元测试脚本开发人员自定义它们以进行单元测试。本系统运行良好,使用g++编译器编译时无错误,运行时也无错误。

但是,当 Jenkins 进行构建并使用 CPPCHECK 分析代码时,它正在生成

错误 ID:未知宏

text: 这里有一个未知的宏。需要进行配置。如果 SCRIPT 是宏,请配置它。

这是我们用来完成部分定义的 C++ 宏的 C++ 代码示例:

SCRIPT(SampleScript)

BODY()

    cout << "SampleScript running." << endl;

 
END_SCRIPT()

SCRIPT、BODY 和 END_SCRIPT 是包含文件中列出的 C++ 宏,但未完全定义。在 CPPCHECK 的 Github 站点上,有一个使用 -I 选项的假设解决方案,但我尝试了,并且仍然出现缺少的宏 CPPCHECK 错误。

这是列出的 CPPCHECK 命令及其参数,包括 -I 选项,但到目前为止,此命令仍在生成“unknownMacro”错误。

cppcheck \
   -I ./* \
    -j 4 \
    --xml-version=2 \

【问题讨论】:

我不理解您所说的“未完全定义”或“完成 C++ 宏”的意思。预处理器定义要么已定义,要么未定义。 -Ucppcheck 取消定义宏,如果你这样做,你的代码将不再有效,它的当前编写方式。 好的,感谢您的回复,无论是否使用 -U 选项都会发生 unknownMacro 错误 【参考方案1】:

好的,我有多年的 Unix 和 Linux 经验,但不知道以下修复。解决方法是在 CPPCHECK 中使用 -I 选项,我正在这样做,但我在 Makefile 中使用星号执行以下操作:

cppcheck \
-I ./* \
-j 4 \
--xml-version=2 \

我刚刚从另一个人那里发现星号 * 在 Unix 和 Linux Makefiles 中不被识别,但在命令行中被识别为 Bash 和其他 shell,就像我早就知道的那样。所以我从 CPPCHECK 调用中删除了星号,现在 Jenkins 构建中的 C++ 代码不再有 CPPCHECK 错误。

cppcheck \
-I ./ \
-j 4 \
--xml-version=2 \

【讨论】:

以上是关于使用 CPPCHECK 在 Red Hat Enterprise Linux (RHEL) 上出现 C++ 宏问题的主要内容,如果未能解决你的问题,请参考以下文章

基于RHEL(centos/red hat)的8个YUM/DNF第三方库

red hat 基本操作

Red Hat Enterprise Linux 使用方法

Red Hat Linux终端里怎么注释

在Red Hat和Centos上安装MongoDB

Red Hat设置使用CentOS的yum源