【问题标题】:Are there any tools that can find potential errors in C source code? [closed]是否有任何工具可以发现 C 源代码中的潜在错误? [关闭]
【发布时间】:2018-11-21 01:06:00
【问题描述】:

例如,我有一些这样的代码:

#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 不发出警告。

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

【问题讨论】:

  • Valgrind、GDB 等
  • s 在调用func 后根本没有使用,所以这是一个奇怪的例子
  • s 不会指向*p 不是“潜在错误”。很明显s 总是NULL
  • @WeatherVane 我认为 OP 意识到了这一点。这是一个“错误”示例,它没有将指向指针的指针作为输出参数并让函数填充指针。
  • @TypeIA 因为从未使用过s,它的作用尚不清楚,但s2 似乎做得很好。

标签: c gcc gcc-warning


【解决方案1】:

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

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

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

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


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

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

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

i++;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-28
    • 2012-01-05
    • 2010-12-06
    • 1970-01-01
    • 2012-06-05
    • 2010-10-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多