Scan-build 静态代码分析器以及代码修复

这篇博客介绍了如何使用ClangStaticAnalyzer和scan-build工具进行C++代码的静态检查。通过安装clang并运行scan-build命令,可以检测出代码中的内存泄漏等问题。示例代码展示了在检测到问题后如何进行修复,并强调了即使工具未报告错误,也可能存在逻辑漏洞。文章还提醒开发者在输入限制和内存管理方面要格外注意。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

part 1: 介绍

Clang Static Analyzer 和 cppcheck 一样,都是代码静态检查工具。 它是 clang 编译器的一部分,在编译 clang后才能使用。 scan-build 和 scan-view 是用 Perl 写的脚本程序,皆在简化对 Static Analysis 功能 的使用。scan-build 会将结果生保存到 html 中,scan-view 类似一个简单的网页服务器, 可以在浏览器上方便的查看结果。

Part 2: 安装

sudo apt-get install clang

Part 3: 使用

scan-build gcc -c xxx.c

如果测试的代码有bug的话,会生成一个html网页,方便查看,例如:

 

第一张图提示的Bug类型是“Memory leak”。点击“View Report”可以看到更为细致的出错的地方。以这段代码为例,原因是“square”使用后未能及时分配内存。修改的方式也很简单:

    for (int i = 0; i < matrix_size; i++) {
        printf("\n");
        for (int j = 0; j < matrix_size; j++) {
            square[i][j] = i + j;
            printf("  %d  |", i + j);
        }
    }
    free (square); //free memory after using
}

修改完成后,在使用scan-build可以发现该工具没有提示任何bug。但是这并不代表没有任何逻辑上的漏洞。

#include <stdio.h>
#include <stdlib.h>

#define MAX_LEN 10

void buildMatrix(unsigned int matrix_size) {
    char **square = calloc(matrix_size, sizeof(char *));
    for (int i = 0; i < matrix_size; ++i) {
        square[i] = calloc(matrix_size, sizeof(char));
    }
    system("cls");
    printf("\tMatrix\n");

    for (int i = 0; i < matrix_size; i++) {
        printf("\n");
        for (int j = 0; j < matrix_size; j++) {
            square[i][j] = i + j;
            printf("  %d  |", i + j);
        }
    }
}

int main() {
    int matrix_size = 3;
    printf("Enter size of n x n matrix");
    scanf("%d", &matrix_size);
    if (matrix_size > MAX_LEN) {
        printf("Exceeded max length!");
    }
    buildMatrix(matrix_size);
    return 0;

}

为了能够更好的对这段代码进行,我们需要使用 gcc 对该文件输出的a.out文件进行测试:

可以发现,当输入的数值为13时,该代码依然能够执行。但是该代码的限制条件是输入的数字不能大于10。所以修改后的代码如下:

#include <stdio.h>
#include <stdlib.h>

#define MAX_LEN 10

void buildMatrix(unsigned int matrix_size) {
    char **square = calloc(matrix_size, sizeof(char *));
    for (int i = 0; i < matrix_size; ++i) {
        square[i] = calloc(matrix_size, sizeof(char));
    }
    system("cls");
    printf("\tMatrix\n");

    for (int i = 0; i < matrix_size; i++) {
        printf("\n");
        for (int j = 0; j < matrix_size; j++) {
            square[i][j] = i + j;
            printf("  %d  |", i + j);
        }
    }
    free (square);
}

int main() {
    int matrix_size = 3;
    printf("Enter size of n x n matrix");
    scanf("%d", &matrix_size);
    if (matrix_size > MAX_LEN) {
        printf("Exceeded max length!");
    }
    else  //确保if判定条件生效。
    buildMatrix(matrix_size);
    return 0;
    
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我真的是在认真摸鱼啊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值