【问题标题】:How to ban the usage of some specific functions, classes and header files in C++ project如何在C++项目中禁止使用某些特定的函数、类和头文件
【发布时间】:2023-02-07 11:17:37
【问题描述】:

我正在尝试找到一种方法来禁止在我的 C++ 项目中使用某些函数、类和头文件。

更准确地说,在我的工作项目中,我们尽量避免使用 C++iostream库,因为它极大地增加了我们服务的二进制大小。相反,我们尝试使用标准输入输出图书馆。

我想添加一个自动验证,我们不使用某些头文件(iostream...)、类(std::istream、std::ostream...)和函数(std::getline...)到我们的 CI/CD 管道。

还必须有一种方法可以忽略某些目录(例如 3d 方库、测试和模拟)的这种验证,或者,如果可能的话,忽略一些单独的行。

【问题讨论】:

  • 只要有一个脚本就可以在签入时解析“禁止”包含的文件,如果它在文件中找到其中一个包含,则拒绝签入(合并请求或类似的东西)。我不会让它太难(例如,每个组件都有一个禁止文件列表)
  • 与其禁止包含,不如在 CI 环境中分析可执行文件/库的大小并寻找大小的突然跳跃?不仅仅是 #include 可以做到这一点。
  • @PepijnKramer 和@user17732522 我认为这两个极端都是可以处理的,这取决于您愿意付出多少努力。编写一个脚本应该相当简单,greps 用于(例如)预提交挂钩中的禁止关键字或 CI 工作。或者,您可以使用像 libclang 这样的工具来系统地检查传递包含或函数调用。无论哪种方式,请确保规则透明且简单。维护软件是一件很痛苦的事情,贡献它一点也不好玩。
  • 如果您真的很投入,您甚至可以编写自己的 clang tidy 检查器来自动修复(部分)您的违规代码 sn-ps,但这绝对不是一项简单的任务……
  • @joergbrech 是的,当然,libclang 可以。这是一个更好的建议。

标签: c++ continuous-integration embedded-linux iostream


【解决方案1】:

您可以使用静态代码分析工具在 CI/CD 管道中强制执行此约束。 cpplint 就是这样一种工具,它是一种基于 Python 的 linter,专门为 C++ 设计。

使用 cpplint,您可以使用命令行标志指定不允许的头文件、函数和类的列表。您还可以使用 --filter 标志从分析中排除特定目录。

此外,您可以在代码中以 NOLINT 或 NOLINTNEXTLINE 的形式添加特定的排除 cmet,以忽略某些代码行或代码块。 以下是如何使用 cpplint 强制执行约束的示例:

$ cpplint --filter=-legal/copyright,-readability/streams --exclude=test_*,mocks_* --linelength=100 <your_source_files>

此命令在指定的源文件上运行 cpplint,忽略法律/版权和可读性/流检查,排除以 test_ 或 mocks_ 开头的目录,并将最大行长度设置为 100 个字符。

您可以将此命令添加为 CI/CD 管道中的一个步骤,以自动强制执行约束。如果 cpplint 发现任何违规,它将打印错误消息并返回非零退出代码,这将使构建失败。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-08
    • 2023-02-02
    • 2021-01-30
    • 2012-11-15
    相关资源
    最近更新 更多