静态检查工具:提升代码质量的利器
创作时间:
作者:
@小白创作中心
静态检查工具:提升代码质量的利器
引用
CSDN
1.
https://blog.csdn.net/lovely_yoshino/article/details/137224676
静态检查是软件开发过程中的一个重要环节,它在代码执行之前分析源代码或编译后的代码,以识别潜在的错误、代码规范违规、安全漏洞等问题。静态检查的好处包括提高代码质量、减少bug、增强安全性、提升开发效率等。它能够帮助开发者在早期发现问题,减少后期调试的工作量,以及降低维护成本。我们很多常见的编译器无法识别的问题都可以通过静态检查识别可能存在的问题。
1. 静态检查工具的重要性
通过静态分析可以发现的错误类型包括:
- 未定义的行为
- 使用危险的代码模式
- 编码风格
静态分析应作为质量保证的补充。它不能取代任何精心设计、测试、动态分析或模糊测试。
2. cppcheck使用指南
Cppcheck 是 C/C++ 代码的静态分析工具。它提供独特的代码分析来检测错误,并专注于检测未定义的行为和危险的编码结构,即使它具有非标准语法(在嵌入式项目中很常见)。使用起来还是比较轻松地,即在vscode中安装这个扩展即可。最新的版本自带了一个 cpp checker 的库,因此无需额外下载,可以直接使用。
在VSCode中配置cppcheck
在用户设置中追加下面的代码:
"cpp-check-lint.cpplint.--enable": false, //google C++ 代码风格检查
"cpp-check-lint.cppcheck.--language=": "c", //使用c语言进行检查
"cpp-check-lint.cppcheck.--inline-suppr": false, //取消内联
"cpp-check-lint.cppcheck.--onsave": true, //在文件保存时立刻检查该文件
"cpp-check-lint.cppcheck.--enable=": "style", //输出信息等级,可选为all, warning, style, performance, portability, information, unusedFunction, missingInclide
在需要检查一个文件时,可以右键可以进行检查,然后就可以在终端中看到对应的报错和警告了。
3. 代码格式规范化
这里可以用clang-format来规范化,首先需要安装版本
sudo apt install clang-format
然后可以查看clang的版本号,确保安装成功
clang-format --version
然后新建一个.clang-format文件,并放在对应repo的根目录下
Language: Cpp
BasedOnStyle: Google
AccessModifierOffset: -4
AlignAfterOpenBracket: Align
AlignConsecutiveMacros: false
AlignConsecutiveAssignments: false
AlignConsecutiveDeclarations: false
AlignEscapedNewlines: Left
AlignOperands: true
AlignTrailingComments: true
AllowAllArgumentsOnNextLine: false
AllowAllConstructorInitializersOnNextLine: true
AllowAllParametersOfDeclarationOnNextLine: false
AllowShortBlocksOnASingleLine: Never
AllowShortCaseLabelsOnASingleLine: false
AllowShortFunctionsOnASingleLine: All
AllowShortLambdasOnASingleLine: All
AllowShortIfStatementsOnASingleLine: WithoutElse
AllowShortLoopsOnASingleLine: true
AlwaysBreakAfterDefinitionReturnType: None
AlwaysBreakAfterReturnType: None
AlwaysBreakBeforeMultilineStrings: true
AlwaysBreakTemplateDeclarations: Yes
BinPackArguments: false
BinPackParameters: false
BraceWrapping:
AfterCaseLabel: false
AfterClass: false
AfterControlStatement: false
AfterEnum: false
AfterFunction: false
AfterNamespace: false
AfterObjCDeclaration: false
AfterStruct: false
AfterUnion: false
AfterExternBlock: false
BeforeCatch: false
BeforeElse: false
IndentBraces: false
SplitEmptyFunction: true
SplitEmptyRecord: true
SplitEmptyNamespace: true
BreakBeforeBinaryOperators: None
BreakBeforeBraces: Attach
BreakBeforeInheritanceComma: false
BreakInheritanceList: BeforeColon
BreakBeforeTernaryOperators: true
BreakConstructorInitializersBeforeComma: false
BreakConstructorInitializers: BeforeColon
BreakAfterJavaFieldAnnotations: false
BreakStringLiterals: true
ColumnLimit: 80
CommentPragmas: '^ IWYU pragma:'
CompactNamespaces: false
ConstructorInitializerAllOnOneLineOrOnePerLine: true
ConstructorInitializerIndentWidth: 4
ContinuationIndentWidth: 4
Cpp11BracedListStyle: true
DeriveLineEnding: true
DerivePointerAlignment: false
DisableFormat: false
ExperimentalAutoDetectBinPacking: false
FixNamespaceComments: true
ForEachMacros:
- foreach
- Q_FOREACH
- BOOST_FOREACH
IncludeBlocks: Regroup
IncludeCategories:
- Regex: '^<ext/.*\.h>'
Priority: 2
SortPriority: 0
- Regex: '^<.*\.h>'
Priority: 1
SortPriority: 0
- Regex: '^<.*'
Priority: 2
SortPriority: 0
- Regex: '.*'
Priority: 3
SortPriority: 0
IncludeIsMainRegex: '([-_](test|unittest))?$'
IncludeIsMainSourceRegex: ''
IndentCaseLabels: true
IndentGotoLabels: true
IndentPPDirectives: None
IndentWidth: 4
IndentWrappedFunctionNames: false
JavaScriptQuotes: Leave
JavaScriptWrapImports: true
KeepEmptyLinesAtTheStartOfBlocks: false
MacroBlockBegin: ''
MacroBlockEnd: ''
MaxEmptyLinesToKeep: 1
NamespaceIndentation: None
ObjCBinPackProtocolList: Never
ObjCBlockIndentWidth: 2
ObjCSpaceAfterProperty: false
ObjCSpaceBeforeProtocolList: true
PenaltyBreakAssignment: 2
PenaltyBreakBeforeFirstCallParameter: 1
PenaltyBreakComment: 300
PenaltyBreakFirstLessLess: 120
PenaltyBreakString: 1000
PenaltyBreakTemplateDeclaration: 10
PenaltyExcessCharacter: 1000000
PenaltyReturnTypeOnItsOwnLine: 200
PointerAlignment: Right
RawStringFormats:
- Language: Cpp
Delimiters:
- cc
- CC
- cpp
- Cpp
- CPP
- 'c++'
- 'C++'
CanonicalDelimiter: ''
BasedOnStyle: google
- Language: TextProto
Delimiters:
- pb
- PB
- proto
- PROTO
EnclosingFunctions:
- EqualsProto
- EquivToProto
- PARSE_PARTIAL_TEXT_PROTO
- PARSE_TEST_PROTO
- PARSE_TEXT_PROTO
- ParseTextOrDie
- ParseTextProtoOrDie
CanonicalDelimiter: ''
BasedOnStyle: google
ReflowComments: true
SortIncludes: true
SortUsingDeclarations: true
SpaceAfterCStyleCast: false
SpaceAfterLogicalNot: false
SpaceAfterTemplateKeyword: true
SpaceBeforeAssignmentOperators: true
SpaceBeforeCpp11BracedList: false
SpaceBeforeCtorInitializerColon: true
SpaceBeforeInheritanceColon: true
SpaceBeforeParens: ControlStatements
SpaceBeforeRangeBasedForLoopColon: true
SpaceInEmptyBlock: false
SpaceInEmptyParentheses: false
SpacesBeforeTrailingComments: 2
SpacesInAngles: false
SpacesInConditionalStatement: false
SpacesInContainerLiterals: true
SpacesInCStyleCastParentheses: false
SpacesInParentheses: false
SpacesInSquareBrackets: false
SpaceBeforeSquareBrackets: false
Standard: Auto
StatementMacros:
- Q_UNUSED
- QT_REQUIRE_VERSION
TabWidth: 4
UseCRLF: false
UseTab: Never
然后可以在VScode中安装对应的插件
在VSCode中配置clang-format
在setting.json中输入下面的代码,以指定格式
"C_Cpp.clang_format_fallbackStyle": "{ BasedOnStyle: Google, IndentWidth: 4, TabWidth: 4, AccessModifierOffset: -4, BinPackArguments: false, BinPackParameters: false, AllowAllArgumentsOnNextLine: false, AllowAllParametersOfDeclarationOnNextLine: false, ColumnLimit: 100 }",
"C_Cpp.clang_format_style": "{ BasedOnStyle: Google, IndentWidth: 4, TabWidth: 4, AccessModifierOffset: -4, BinPackArguments: false, BinPackParameters: false, AllowAllArgumentsOnNextLine: false, AllowAllParametersOfDeclarationOnNextLine: false, ColumnLimit: 100 }",
4. 其他静态检查工具
除了cppcheck,还可以使用C/C++ Advanced Lint插件。安装步骤如下:
sudo apt-get install llvm
sudo apt-get install clang
sudo apt-get install cppcheck
然后安装C/C++ Advanced Lint插件,就可以看到有问题的地方了。
参考链接
热门推荐
乌龟摆放指南:家中风水大揭秘!
中国古代养龟:长寿的秘密
养龟避邪化煞,财运滚滚来!
爱情会在大脑留下化学印记,而分开太久会导致这种印记消失
《奥特曼传奇英雄2》萌新必看!快速通关秘籍
江西十二座名山:从石钟山到庐山,每一座都是自然与人文的完美融合
股票短线选股技巧全攻略
高手短线6个操作技巧:高位看错必须止损,低位看错敢于补仓
白切鸡:广东人餐桌上的文化传承
怀乡三黄鸡:广东白切鸡的完美诠释
7000系铝合金:现代战机的秘密武器
铝合金助力航天梦,未来无限可能!
比亚迪创新:铝合金电池包壳体设计解析
科技巨头引领突破:中国铝合金材料产业的创新之路
白马寺摄影攻略:四国风情尽收镜中
红军城:乌克兰东部的战略要冲
人口增量全国第二,郑州剑指北方前三
不到4天,5位名人缅甸失踪,各个经历出奇一致,让人细思极恐
十首精选音乐,助你高效工作
门诊CT医保能报销吗?
金鹰节上的跨界主持:刘涛罗晋引发的行业新趋势
人类智能和目前的机器智能在本质上是不同的
《使命召唤手游》:用这些配件让Locus狙击枪成为战场利器!
《使命召唤手游》Locus狙击枪最佳配件攻略
使命召唤手游:Locus狙击枪配件实战评测
"断亲"泪奔回出租屋,年轻人反骨从何来?
大城市孤独的年轻人,在合租中寻找安全感
菜蓟:餐桌上的欧式贵族,一道需要耐心与仪式感的美味
新苏伊士运河:85亿美元打造的经济引擎,还是生态灾难的导火索?
苏伊士运河拓宽计划:全球经济新变局?