首页 > 解决方案 > 是否有任何工具可以发现 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不发出警告。

有什么工具可以找出这种错误吗?

标签: cgccgcc-warning

解决方案


除了糟糕的变量名之外,该代码实际上几乎没有错误:-)

副本作为s传递给函数p,您更改p然后返回它,最后将其分配给s2。在任何时候s(或ps2)都不会以会导致未定义行为的方式使用,除非malloc失败,这是您应该考虑的:

p = malloc(32);
if (p != NULL) memcpy(p, "hello", 6); // why not str[n]cpy ?

但是,就可以用来发现问题的工具而言,有很多。例如,linter、具有良好诊断方法的编译器、内存跟踪valgrind器(如gdb.


到目前为止,最重要的工具是您头骨内的湿器,尤其是您添加了:

假设程序员的意图是给 s 分配内存。

在这种情况下,我想不出其他工具可以抓住程序员的意图。当代码状态时,弄清楚意图是将两个添加到变量中没有什么不同:

i++;

推荐阅读