在 macOS 下安装和使用 Clang Static Analyzer

在这里插入图片描述

在 macOS 下安装和使用 Clang Static Analyzer 相对简单,因为 macOS 自带 Clang 编译器,并且工具链已经包含了静态分析器的功能。以下是详细步骤:

1. 检查系统自带的 Clang

macOS 自带 Clang 编译器,安装在 Xcode 或 Xcode Command Line Tools 中。

1.1 安装 Xcode Command Line Tools

如果尚未安装:

xcode-select --install

1.2 检查 Clang 版本

验证系统是否已经安装 Clang:

clang --version

输出类似以下内容:

Apple clang version 14.0.0 (clang-1400.0.29.202)
Target: arm64-apple-darwin21.4.0
Thread model: posix
InstalledDir: /usr/bin

2. 使用 Clang Static Analyzer

2.1 基本用法

分析单个文件
假设有一个文件 example.c

#include <stdio.h>

void test(int *ptr) {
    if (*ptr > 0) {  // 潜在问题:ptr 可能为 NULL
        printf("Valid pointer.\n");
    }
}

int main() {
    test(NULL);
    return 0;
}

运行静态分析:

scan-build clang -o example example.c

输出示例:

example.c:4:6: warning: Dereference of null pointer (loaded from variable 'ptr')

2.2 分析整个项目

  • 分析基于 Make 的项目
    Clang Static Analyzer 可以拦截构建过程。假设项目使用 make 构建:
scan-build make
  • 分析基于 CMake 的项目
    如果项目使用 CMake,可以先生成构建文件,再使用 scan-build
scan-build cmake -B build
scan-build cmake --build build

2.3 查看分析结果

  • 生成分析报告
    Clang Static Analyzer 会生成 HTML 格式的报告,默认存放在临时目录中。分析完成后,终端会提示报告位置:
scan-build: 1 bug found.
scan-build: Run 'scan-view /tmp/scan-build-XXXX' to examine bug reports.
  • 查看 HTML 报告
    启动报告查看工具 scan-view
scan-view /path/to/report

scan-view 会启动一个本地 Web 服务器,并在浏览器中打开分析结果。

3. 常用选项

3.1 scan-build 常用选项

  • -o <directory>:指定存放报告的目录。
scan-build -o./reports make
  • --status-bugs:如果发现问题,返回非零退出码,适合在 CI/CD 中使用。
scan-build --status-bugs make
  • --analyze-headers:启用头文件的分析。
scan-build --analyze-headers make
  • --keep-ccc:保留中间文件,用于调试。
scan-build --keep-ccc make

4. 示例场景

示例 1: 检查空指针问题

代码 null_pointer.c

#include <stdio.h>

void print_if_not_null(char *str) {
    if (str == NULL) {
        printf("%s\n", str);  // 潜在问题:NULL 指针解引用
    }
}

int main() {
    print_if_not_null(NULL);
    return 0;
}

运行分析:

scan-build clang -o null_pointer null_pointer.c

输出:

null_pointer.c:5: warning: Dereference of null pointer

示例 2: 检查内存泄漏

代码 memory_leak.c

#include <stdlib.h>

void memory_leak() {
    int *ptr = malloc(sizeof(int));
    *ptr = 42;
    // 未释放内存
}

int main() {
    memory_leak();
    return 0;
}

运行分析:

scan-build clang -o memory_leak memory_leak.c

输出:

memory_leak.c:5: warning: Potential memory leak

5. 与 CI/CD 集成

在 CI/CD 工具中(如 Jenkins、GitHub Actions),可以使用 scan-build 作为静态分析工具。

示例: 在 GitHub Actions 中使用

  • .github/workflows/clang-analyze.yml 中添加以下内容:
name: Clang Static Analysis

on:
  push:
    branches:
      - main

jobs:
  analysis:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v3

      - name: Install Clang
        run: sudo apt-get install clang clang-tools

      - name: Run Static Analysis
        run: scan-build make

      - name: Upload Analysis Report
        uses: actions/upload-artifact@v3
        with:
          name: analysis-report
          path: /tmp/scan-build-*
  • 每次代码提交后,GitHub Actions 会自动运行静态分析并生成报告。

6. 优化和注意事项

  • 依赖构建系统
    • Clang Static Analyzer 拦截编译过程,因此需要支持项目的构建系统。
    • 如果项目不是基于 Make 或 CMake 构建,可以手动指定 clang 的编译命令。
  • 减少误报
    • 对于不可避免的误报,可以通过代码注释告知工具忽略某些问题。
  • 性能优化
    • 对大型项目,可以指定分析的目录或文件以缩小范围:
scan-build clang -o output -Iinclude src/main.c src/util.c
  • 保持工具更新
    • macOS 上的 Clang 随 Xcode 更新。如果需要最新功能,可以单独编译 Clang 和 LLVM。

总结

在 macOS 上,Clang Static Analyzer 借助自带的工具链易于安装和使用。结合 scan-buildscan-view,可以快速发现 C/C++ 项目中的潜在问题。如果配合 CI/CD,可以进一步提升代码质量的自动化保障能力。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/937102.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

docker简单私有仓库的创建

1&#xff1a;下载Registry镜像 导入镜像到本地中 [rootlocalhost ~]# docker load -i registry.tag.gz 进行检查 2&#xff1a;开启Registry registry开启的端口号为5000 [rootlocalhost ~]# docker run -d -p 5000:5000 --restartalways registry [rootlocalhost ~]# dock…

搭建mqtt服务端并在Spring Boot项目中集成mqtt

文章目录 一、MQTT1.MQTT 的特点2.MQTT 的工作原理3.MQTT 的应用场景 二、EMQX(服务端)1.EMQX 的特点2.安装 三、客户端1.MQTTX2.EMQX后台建客户端3.H5页面客户端4.Spring Boot集成mqtt做客户端 一、MQTT MQTT&#xff08;Message Queuing Telemetry Transport&#xff0c;消息…

Easysearch Java SDK 2.0.x 使用指南(一)

各位 Easysearch 的小伙伴们&#xff0c;我们前一阵刚把 easysearch-client 更新到了 2.0.2 版本&#xff01;借此详细介绍下新版客户端的使用。 新版客户端和 1.0 版本相比&#xff0c;完全重构&#xff0c;抛弃了旧版客户端的一些历史包袱&#xff0c;从里到外都焕然一新&am…

《计算机视觉证书:开启职业发展新航道》

一、引言 在当今科技飞速发展的时代&#xff0c;计算机视觉技术正以惊人的速度改变着我们的生活和工作方式。从智能手机的人脸识别解锁到自动驾驶汽车的环境感知&#xff0c;计算机视觉技术的应用无处不在。而计算机视觉证书作为这一领域的专业认证&#xff0c;其作用愈发凸显…

ubuntu 用 ss-tproxy的最终网络结构

1、包含了AD广告域名筛选 2、Ss-tproxy 国内国外地址分类 3、chinadns-ng解析 4、透明网关 更多细节看之前博客 ubuntu 用ss-TPROXY实现透明代理&#xff0c;基于TPROXY的透明TCP/UDP代理,在 Linux 2.6.28 后进入官方内核。ubuntu 用 ss-tproxy的内置 DNS 前挂上 AdGuardHome…

OpenCV相关函数

一、二值化函数&#xff08;threshold&#xff09; 功能&#xff1a;将灰度图像转换为二值图像&#xff0c;通常用于图像分割。通过设置阈值&#xff0c;把图像中低于阈值的像素设为0&#xff0c;高于阈值的像素设为1。 参数&#xff1a; src&#xff1a;输入图像。 thresh&a…

前端html,vue使用第三方地图详细教程,以百度地图为例,实现地图标注,导航,定位,路线规划,坐标转换

目录 示例&#xff1a; 准备&#xff1a; ?编辑 开始&#xff1a; 1、新建页面&#xff0c;在script标签中引入百度地图的api数据&#xff0c;把自己在控制台创建的应用的ak替换上去 2、创建一个dom对象&#xff0c;设置宽高 3、在js中初始化地图 进阶&#xff1a; 1…

【经验分享】容器云搭建的知识点

最近忙于备考没关注&#xff0c;有次点进某小黄鱼发现首页出现了我的笔记还被人收费了 虽然我也卖了一些资源&#xff0c;但我以交流、交换为主&#xff0c;笔记都是免费给别人看的 由于当时刚刚接触写的并不成熟&#xff0c;为了避免更多人花没必要的钱&#xff0c;所以决定公…

【Liunx篇】基础开发工具 - vim

文章目录 一.vim的基本概念1.正常/命令模式2.插入模式3.底行模式/末行模式4.视图模式5.替换模式 二.vim的基本操作1.进入vim&#xff1a;2.退出vim: 三.vim正常模式命令集1.光标定位&#xff1a;2.复制/粘贴3.撤销4.剪切/删除5. 更改 四.vim底行模式命令集1.保存/退出2.调出行号…

数据结构---树(Tree)

1. 简介 在数据结构中&#xff0c;树是一种层次结构的数据结构&#xff0c;由节点&#xff08;node&#xff09;组成&#xff0c;其中每个节点通过边&#xff08;edge&#xff09;与其他节点连接。树是一种非线性的数据结构&#xff0c;广泛用于表示具有层级关系的数据。常见的…

【unity】从零开始制作平台跳跃游戏--界面的认识,添加第一个角色!

在上一篇文章中&#xff0c;我们已经完成了unity的环境配置与安装⬇️ 【Unity】环境配置与安装-CSDN博客 接下来&#xff0c;让我们开始新建一个项目吧&#xff01; 新建项目 首先进入unityHub的项目页面&#xff0c;点击“新项目”&#xff1a; 我们这个系列将会以2D平台…

Ubuntu K8s

https://serious-lose.notion.site/Ubuntu-K8s-d8d6a978ad784c1baa2fc8c531fbce68?pvs74 2 核 2G Ubuntu 20.4 IP 172.24.53.10 kubeadmkubeletkubectl版本1.23.01.23.01.23.0 kubeadm、kubelet 和 kubectl 是 Kubernetes 生态系统中的三个重要组件 kubeadm&#xff1a; 主…

【ARM】ARM架构麒麟V10安装jdk1.8

ARM架构麒麟V10安装jdk1.8&#xff0c;就一句话安装 yum install java-1.8.0-openjdk java-1.8.0-openjdk-devel 关注我&#xff0c;继续【ARM】安装mysql 简单快捷。

Redis--高并发分布式结构

目录 一、引言 二、redis 1.什么是redis&#xff1f; 三、基础概念 1.什么是分布式&#xff1f; 2.应用服务和数据库服务分离 3.负载均衡 4.分库分表 5.微服务架构 四、总结 一、引言 本篇文章就简单介绍一下什么是redis&#xff0c;以及一些关于高并发和分布式结构的…

Repo管理

文章目录 前言Repo介绍清单仓库清单仓库的组成 初始化Repo同步远程仓库Repo实际应用 前言 我们知道&#xff0c;Git是用来管理某一个仓库&#xff0c;那当一个项目用到了多个仓库时&#xff0c;怎么来同步管理这些仓库呢&#xff1f;这个时候就可以引入Repo管理。 Repo介绍 …

python 数据分析之地图数据绘制

python 数据分析之地图数据绘制 1、根据历史的2023年GDP数据做地图分析 import numpy as np import matplotlib import matplotlib.pyplot as plt matplotlib.rcParams[font.family] SimHei import pandas as pd import folium from folium import Map import geopandas as…

分治算法(单选题)

2-1 分数 2 下列多少种排序算法用了分治法&#xff1f; 堆排序插入排序归并排序快速排序选择排序希尔排序 A.2 B.3 C.4 D.5 正确答案 A 2-2 分数 2 分治法的设计思想是将一个难以直接解决的大问题分割成规模较小的子问题&#xff0c;分别解决问题&#xff0c;最后将子…

探索 HTTP 请求头中的 “Host” 字段及其安全风险

探索 HTTP 请求头中的 “Host” 字段及其安全风险 大家好&#xff0c;今天我们来聊聊 HTTP 请求头中的“Host”字段&#xff0c;以及它的使用方法和安全风险。 什么是Host字段 在 HTTP 请求头中&#xff0c;“Host”字段是一个至关重要的部分。它告诉服务器&#xff0c;我们…

将 Ubuntu 22.04 LTS 升级到 24.04 LTS

Ubuntu 24.04 LTS 将支持 Ubuntu 桌面、Ubuntu 服务器和 Ubuntu Core 5 年&#xff0c;直到 2029 年 4 月。 本文将介绍如何将当前 Ubuntu 22.04 系统升级到最新 Ubuntu 24.04 LTS版本。 备份个人数据 以防万一&#xff0c;把系统中的重要数据自己备份一下~ 安装配置SSH访问…

渗透测试-前端验签绕过之SHA256

本文是高级前端加解密与验签实战的第1篇文章&#xff0c;本系列文章实验靶场为Yakit里自带的Vulinbox靶场&#xff0c;本文讲述的是绕过SHA256签名来爆破登录。 绕过 通过查看源代码可以看到key为 1234123412341234通过查看源代码可以看到是通过SHA256来进行签名的&#xff0…