c - 是否有任何工具可以发现 C 源代码中的潜在错误?
问题描述
例如,我有一些这样的代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char *func(char *p) {
p = malloc(32);
memcpy(p, "hello", 6);
return p;
}
int main() {
char *s = NULL;
char *s2 = NULL;
s2 = func(s);
printf("%s\n", s2);
free(s2);
return 1;
}
代码可以工作,但有一个s
不会指向的潜在错误*p
(假设程序员的意图是为 s 分配内存)。可以很快找到错误,因为它非常简单。但是在一个包含很多很多代码的大型项目中,有时很难找到这样的错误。gcc -Wall -Wextra
不发出警告。
有什么工具可以找出这种错误吗?
解决方案
除了糟糕的变量名之外,该代码实际上几乎没有错误:-)
的副本作为s
传递给函数p
,您更改p
然后返回它,最后将其分配给s2
。在任何时候s
(或p
或s2
)都不会以会导致未定义行为的方式使用,除非malloc
失败,这是您应该考虑的:
p = malloc(32);
if (p != NULL) memcpy(p, "hello", 6); // why not str[n]cpy ?
但是,就可以用来发现问题的工具而言,有很多。例如,linter、具有良好诊断方法的编译器、内存跟踪valgrind
器(如gdb
.
到目前为止,最重要的工具是您头骨内的湿器,尤其是您添加了:
假设程序员的意图是给 s 分配内存。
在这种情况下,我想不出其他工具可以抓住程序员的意图。当代码状态时,弄清楚意图是将两个添加到变量中没有什么不同:
i++;
推荐阅读
- javascript - CSS 未应用于使用 JQuery 动态添加的元素
- python - Pandas/Numpy 组值变化和衍生值变化高于/低于 0
- python - 在Python中将文件夹中的多个pdf文件转换为jpgs
- python - 气流 dag 失败......但所有任务都成功了
- sql - 使用基于字段值的日期
- c# - 在 Windows 上构建时 __IOS__ 上的 Visual Studio 编译器错误
- node.js - 你可以从 Heroku 应用程序发出网络请求吗?
- css - 如何使固定列标题位于标题行的底部
- matlab - dlmread 中的过时语法警告
- unix - 按特定顺序计算单词的次数(Unix)