
flint的36条C Lint规则全解完整规则清单与实例演示【免费下载链接】flintAn open-source lint program for C developed by, and formerly used at Facebook.项目地址: https://gitcode.com/gh_mirrors/fli/flintflint 是 Facebook 开源的 C Lint 检查工具本文带你一次读懂它内置的36 条 C Lint 规则每条规则查什么、报什么级别、如何实例演示以及如何快速上手运行与关闭特定规则。 适合人群刚接触代码检查Lint的 C 开发者、想引入团队规范的普通用户。无需任何 D 语言基础。一、flint 是什么Facebook 的 C Lint 工具flintflint: Facebooks C Linter最初在 Facebook 内部使用后开源。它的工作方式很直接词法分析Tokenizer.d把 C/C 源码切分成 token 流逐条规则扫描Checks.d中的每个checkXxx函数就是一个 lint 规则输出报告按文件:行号: 消息的格式打印问题。因为它基于 token 流而非完整编译所以不需要先编译项目拿来就能查。三个严重级别别被报警淹没flint 把检查结果分成三级定义见 Checks.d 开头注释级别标记含义错误无前缀无条件报告最严格警告Warning:只在本次改动涉及该行时才需要处理建议Advice:最弱提示可忽略项目文件结构速览文件作用Main.d程序入口注册全部 36 条规则、解析命令行参数Checks.d规则实现主体约 3500 行每条规则一个check函数Tokenizer.dC/C 分词器FileCategories.d判断文件类型头文件/源文件/inlIgnored.d%flint: pause块跳过逻辑CxxTokenize.d、CxxReplace.d早期 C 版本的组件保留作参考test_files/Test1.cpp、test_files/Test1.h官方测试样例TARGETS、Makefile.am、configure.ac构建配置 36 条规则 通用规则 20 条C/C 都跑C 专属规则 16 条--c_mode下不跑另附 2 条可选扩展规则。二、36 条规则完整清单按 7 大类速查1️⃣ 文件与头文件约定7 条规则函数检查内容级别checkIncludeGuard头文件必须有 include guard或#pragma onceguard 名要一致且覆盖整个文件错误checkIncludeAssociatedHeader.cpp必须第一个包含自己的同名.h可暴露头文件缺失的依赖错误checkMultipleIncludes同一文件不允许重复#include错误checkQuestionableIncludes禁止包含已废弃头文件头文件中包含昂贵头文件建议前向声明警告checkInlHeaderInclusionsFoo-inl.h是实现细节只应由Foo.h包含错误checkOSSIncludes开源项目folly/thrift 等不得用#include ...引入未开源的内部代码错误checkIfEndifBalance#if/#ifdef/#ifndef与#endif必须配对错误实例演示——checkMemset同类的参数顺序检查是 flint 的招牌能力而头文件场景最典型的输出如下// foo.h缺少 include guard inline int add(int a, int b) { return a b; } // 输出Missing include guard. If you are ABSOLUTELY sure that you // dont want an include guard, then include a comment // containing override-include-guard in lieu of an include guard.2️⃣ 命名与宏约定3 条规则函数检查内容级别checkDefinedNames#define的名字不得以下划线大写字母开头、不得含双下划线C 标准保留标识符警告checkAttributeArgumentUnderscores__attribute__((...))的参数应写成__KEYWORD__双下划线形式避免污染命名空间警告checkUpcaseNull新 C 代码优先用nullptr而非NULL建议#define _MAX_SIZE 10 // 警告Symbol _MAX_SIZE invalid. A symbol may not start with an // underscore followed by a capital letter.3️⃣ 命名空间规范3 条规则函数检查内容级别checkUsingDirectives头文件中禁止顶层using指令除非限定在 inline 函数作用域内错误checkUsingNamespaceDirectives禁止重复的using namespace且std与boost等互斥命名空间不得同时引入shared_ptr会产生歧义错误checkNamespaceScopedStatics头文件中避免命名空间级static每个翻译单元都会生成一份副本警告4️⃣ 异常处理规范4 条规则函数检查内容级别checkCatchByReference只能按const引用捕获异常且只能捕获用户自定义类型catch (...)除外错误checkThrowSpecification函数 throw 规格throw()已弃用析构函数因继承std::exception需要时可豁免警告checkThrowsHeapException禁止throw new Foo()——堆上抛异常几乎总是笔误错误checkExceptionInheritancestd::exception必须公有继承否则外部catch (const std::exception)抓不到警告实例演示try { riskyCall(); } catch (MyError e) { log(); } // 错误Symbol e of type MyError caught by value. // Use catch by (preferably const) reference throughout.5️⃣ 类设计6 条规则函数检查内容级别checkConstructors单参构造函数应标explicit防隐式转换拷贝构造应接收const参数移动构造应标noexcept注释/* implicit */可豁免错误checkVirtualDestructors有虚函数的基类必须有公有虚析构函数警告checkImplicitCast隐式转换操作符危险尤其operator bool()建议 C11 的explicit operator bool()或 safe-bool 惯用法错误/警告checkProtectedInheritance避免 protected 继承《Effective C》不推荐警告checkInitializeFromItself初始化列表里用成员自身初始化m_ : m_()直接报错错误checkMutexHolderHasNamelock_guard...(m)这类无名字的互斥持有者会当场释放锁必须命名错误6️⃣ 智能指针与内存2 条规则函数检查内容级别checkUniquePtrUsageunique_ptrT与new T[n]数组不匹配应为unique_ptrT[]反之亦然错误checkSmartPtrUsageshared_ptrFoo p(new Foo(w))应改为make_shared减少一次内存分配带自定义分配器时建议allocate_shared警告7️⃣ 高危 API 与函数误用11 条规则函数检查内容级别checkBlacklistedSequences黑名单 token 序列当前禁止volatile它不保证线程安全还会劣化代码asm volatile除外警告checkBlacklistedIdentifiers禁用strtok非线程安全、strncpy极易误用推荐folly::split等错误checkBannedIdentifiers禁用thread_specific_ptr已知 bug 与性能问题改用folly::ThreadLocal错误checkMemset识别memset(buf, sizeof(buf), 0)这类参数顺序写反的调用并直接给出正确写法错误checkExitStatusexit(-1)未定义请用exit(EXIT_FAILURE)警告checkSleepUsage慎用sleep/usleep/sleep_for会让测试 flaky建议条件变量或 future/* sleep override */可豁免警告checkRandomUsage禁用rand()锁竞争、random_device开销大、random_shuffle已废弃推荐folly::Random::rand32/64警告checkFollyDetailfolly::detail逻辑上是私有的外部代码不得使用错误checkFollyStringPieceByValuefolly::StringPiece应传值而非const引用警告checkBreakInSynchronized内部同步宏SYNCHRONIZED伪语句内禁止break/continue错误checkBogusComparisons无意义比较如a.b() a.b()左右表达式相同警告招牌规则checkMemset的实例演示注意它直接帮你翻译出正确调用char buf[64]; memset(buf, sizeof(buf), 0); // 参数 2、3 写反了 // 错误Did you mean memset(buf, 0, sizeof(buf))? 附加规则不在默认 36 条内规则函数说明checkDirectStdIncludeinclude-what-you-use用了std::vector却没直接#include vector。需用--include_what_you_use开关启用checkAngleBracketIncludes内部版本version(facebook)专用指定库必须用尖括号包含checkHPHPNamespace内部版本专用使用 HPHP 命名空间前必须调用f_require_module已在 Checks.d 实现默认未注册三、如何运行 flint从克隆到出报告一键安装步骤Ubuntu 验证过的流程git clone https://gitcode.com/gh_mirrors/fli/flint cd flint autoreconf --install ./configure make构建前需要安装D 编译器gdc、automake、autoconf、libtool、boost、folly 等依赖详见 README.md 的 Dependencies 一节老版本 C 实现还需 gtest。⚠️ 项目当前已不再积极维护README 明确提示 Proceed at your own risk构建只在 Ubuntu 上测试过其他系统需自行适配。最快使用方式./flint [选项] 文件或目录常用选项定义于 Main.d选项作用--recursive递归扫描目录默认开启--c_mode只做 C 兼容检查跳过 16 条 C 专属规则--include_what_you_use额外启用checkDirectStdInclude--excluderule,...按规则名排除如--excludecheckSleepUsage,checkRandomUsage示例./flint --excludecheckSleepUsage src/四、如何精准关闭误报nolint 与豁免开关flint 提供了从整目录到单行的四层豁免手段新手建议按粒度从小到大选单行注释行尾加// nolint例如strtok(line, ); // nolint块级跳过// %flint: pause与// %flint: resume成对使用跳过中间代码逻辑在 Ignored.d目录级跳过在目录下放置空的.nolint文件整个目录不再被检查Main.d 的dontLintPath规则级开关命令行--excluderule全局关闭某条规则个别规则还支持专门豁免注释/* implicit */隐式转换、/* may throw */移动构造、/* sleep override */、/* using override */、/* override-include-guard */五、总结flint 规则体系的 3 个记忆点两条轨道20 条通用规则管所有 C/C 文件16 条 C 规则在--c_mode下自动停摆三级报警错误必须处理警告看是否改动过该行建议可忽略——合理选择级别是 flint 规则设计的第一原则自带答案像checkMemset、checkSmartPtrUsage这类规则会直接输出修正后的代码照着改就行。把 flint 接入团队代码检查哪怕是只挑checkIncludeGuard、checkCatchByReference、checkMemset几条高频规则启用也能立刻提升 C 代码基线质量。【免费下载链接】flintAn open-source lint program for C developed by, and formerly used at Facebook.项目地址: https://gitcode.com/gh_mirrors/fli/flint创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考