免费手机网站源码下载,苏州建设招聘信息网站,部队内网网站建设方案,我想克隆个网站 怎么做文章目录 0. 引言1. 完整检测脚本代码 clang-tidy-check.sh1.1 流程图1.2 脚本功能概述 2. 该脚本优缺点 0. 引言
clang-tidy 是基于 Clang 的工具#xff0c;提供了丰富的代码检查功能#xff0c;可以根据用户配置文件进行定制化的检查和规则定义。 之前的文章《使用 Clang… 文章目录 0. 引言1. 完整检测脚本代码 clang-tidy-check.sh1.1 流程图1.2 脚本功能概述 2. 该脚本优缺点 0. 引言
clang-tidy 是基于 Clang 的工具提供了丰富的代码检查功能可以根据用户配置文件进行定制化的检查和规则定义。 之前的文章《使用 Clang-Tidy 进行静态代码分析完整的配置与 CMake 集成实例》已经对clang-tidy的安装和配置做了基本介绍并指明了如何与CMake集成。 本文将介绍如何使用 shell脚本进行clang-tidy静态代码分析。
1. 完整检测脚本代码 clang-tidy-check.sh
#!/bin/bash
set -e# Default build directory
DEFAULT_BUILD_DIRbuild# Check if source dir path and optionally a build dir path are provided as arguments
if [ $# -lt 1 ] || [ $# -gt 2 ]; thenecho Usage: $0 source_dir_path [build_dir_path]echo Error: Exactly one or two arguments expected.exit 1
fi# Save the user-inputted source dir path to a variable
SOURCE_DIR$1# If a second argument (build directory) is provided, use it; otherwise, use the default
if [ $# -eq 2 ]; thenBUILD_DIR$2echo $2
elseBUILD_DIR$DEFAULT_BUILD_DIRecho No build directory specified, using default: ${BUILD_DIR}
fi# Check if the source path is an existing directory
if [ ! -d ${SOURCE_DIR} ]; thenecho Error: SOURCE_DIR ${SOURCE_DIR} does not exist.exit 1
elseecho SOURCE_DIR is ${SOURCE_DIR}
fi# Optionally, you can also check if the BUILD_DIR exists or handle its absence according to your needs
if [ ! -d ${BUILD_DIR} ]; thenecho Warning: BUILD_DIR ${BUILD_DIR} does not exist. Depending on your scripts logic, this may or may not be a problem.
fi
############## Set the source directory and build directory
ROOT_DIR$(pwd)
CLANG_TIDY_CONFIG${ROOT_DIR}/.clang-tidy
COMPILE_COMMANDS${BUILD_DIR}/compile_commands.json# Check if compile_commands.json exists
if [ ! -f ${COMPILE_COMMANDS} ]; thenecho Error: compile_commands.json not found in ${BUILD_DIR}.exit 1
fi# Find all .cc files in the source directory recursively
ALL_STATIC_CHECK_FILES$(find ${SOURCE_DIR} -type f -name *.cpp)filter_clang_tidy_output() {awk /^clang-diagnostic-unused-command-line-argument/ {next}/^[0-9] warnings generated/ {next}/^Suppressed [0-9] warnings/ {next}/^Use -header-filter.*$/ {next}/^Use -system-headers .*$/ {next}/\/usr\// ||/\/opt\// {skipping1} # Start skipping upon a match with any of the specified patternsskipping 1 $0 ~ /\| * *\^/ {skipping0; next} # Stop skipping when encountering the flexible patternskipping 0 {print} # Print lines when not skipping
}# Function to run clang-tidy
run_clang_tidy() {echo Running clang-tidy...for file in $ALL_STATIC_CHECK_FILES; doclang-tidy-18 ${file} -p ${BUILD_DIR} --warnings-as-errors* \-config-file${CLANG_TIDY_CONFIG} -extra-arg-stdc14 \21| filter_clang_tidy_output \|| touch ${BUILD_DIR}/clang_tidy_faileddone
}# Run clang-tidy
run_clang_tidy# Check the results
if [ -f ${BUILD_DIR}/clang_tidy_failed ]; thenecho Clang-tidy detected issues.exit 1
elseecho No Clang-tidy issues found.
fi
1.1 流程图 #mermaid-svg-xaef1VrxzRQC1ohF {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-xaef1VrxzRQC1ohF .error-icon{fill:#552222;}#mermaid-svg-xaef1VrxzRQC1ohF .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-xaef1VrxzRQC1ohF .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-xaef1VrxzRQC1ohF .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-xaef1VrxzRQC1ohF .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-xaef1VrxzRQC1ohF .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-xaef1VrxzRQC1ohF .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-xaef1VrxzRQC1ohF .marker{fill:#333333;stroke:#333333;}#mermaid-svg-xaef1VrxzRQC1ohF .marker.cross{stroke:#333333;}#mermaid-svg-xaef1VrxzRQC1ohF svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-xaef1VrxzRQC1ohF .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-xaef1VrxzRQC1ohF .cluster-label text{fill:#333;}#mermaid-svg-xaef1VrxzRQC1ohF .cluster-label span{color:#333;}#mermaid-svg-xaef1VrxzRQC1ohF .label text,#mermaid-svg-xaef1VrxzRQC1ohF span{fill:#333;color:#333;}#mermaid-svg-xaef1VrxzRQC1ohF .node rect,#mermaid-svg-xaef1VrxzRQC1ohF .node circle,#mermaid-svg-xaef1VrxzRQC1ohF .node ellipse,#mermaid-svg-xaef1VrxzRQC1ohF .node polygon,#mermaid-svg-xaef1VrxzRQC1ohF .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-xaef1VrxzRQC1ohF .node .label{text-align:center;}#mermaid-svg-xaef1VrxzRQC1ohF .node.clickable{cursor:pointer;}#mermaid-svg-xaef1VrxzRQC1ohF .arrowheadPath{fill:#333333;}#mermaid-svg-xaef1VrxzRQC1ohF .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-xaef1VrxzRQC1ohF .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-xaef1VrxzRQC1ohF .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-xaef1VrxzRQC1ohF .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-xaef1VrxzRQC1ohF .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-xaef1VrxzRQC1ohF .cluster text{fill:#333;}#mermaid-svg-xaef1VrxzRQC1ohF .cluster span{color:#333;}#mermaid-svg-xaef1VrxzRQC1ohF div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-xaef1VrxzRQC1ohF :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 合法 不合法 有指定构建目录 存在 不存在 存在 不存在 存在 不存在 有问题 无问题 开始 检查参数数量和合法性 保存源代码路径 显示错误并退出 设置默认构建目录 保存构建目录路径 显示默认构建目录 显示指定构建目录 检查源代码目录存在性 显示源代码目录路径 显示错误并退出 检查构建目录存在性 显示构建目录路径 显示警告 设置根目录和配置文件路径 检查compile_commands.json文件存在性 显示文件存在 显示错误并退出 查找所有.cpp文件 运行clang-tidy 检查clang-tidy结果 显示问题并退出 显示无问题 结束 1.2 脚本功能概述
这段脚本的主要功能包括
检查输入参数的合法性确保源代码目录路径正确并根据需要指定构建目录。检查是否存在编译命令文件 compile_commands.json该文件是 clang-tidy 进行分析所必需的。使用 find 命令递归查找源代码目录中的所有 .cpp 文件。运行 clang-tidy 对每个找到的 .cpp 文件进行静态代码分析输出详细的警告和建议。过滤和处理 clang-tidy 的输出以排除不必要的警告信息。根据分析结果判断是否有代码问题并相应地处理结果。
2. 该脚本优缺点
这段脚本的优点在于
自动化分析:有 compile_commands.json 文件即可进行分析不用依赖CMakeLists.txt。灵活处理: 可以根据分析结果灵活地处理代码中的问题或警告确保代码质量和稳定性。
然而该脚本也存在一些潜在的缺点
依赖性问题: 脚本依赖于正确配置的 clang-tidy 和 compile_commands.json 文件因为不像CMake每次可以实时更新 compile_commands.json 文件如果配置不正确可能导致分析失败。效率问题: 因为是依次遍历列表中的文件对大型代码库进行全面的静态分析可能会消耗较多的时间和计算资源影响效率。