是否有任何方法可以在编译时找到内存错误

时间:2015-08-21 07:54:31

标签: c gcc memory

假设在我的代码中我使用类似这样的东西

OK

现在我没有给指针分配任何地址。所以在gcc中有任何选项可以显示这个错误。

我尝试过优化,但没有给出这个错误。

我尝试了-fsanitize = address但是它在运行时出错了

== 1982 ==错误:AddressSanitizer:SEGV在未知地址0x000000c38299(pc 0x7f78d7b685b0 sp 0x7ffd8918a0b0 bp 0x7f78d7d7a668 T0)

或者我有什么方法可以将这个o / p写入文件

2 个答案:

答案 0 :(得分:3)

打开编译器警告有很大帮助。良好的警告级别(恕我直言)是-Wall

我把你的示例代码放在一个程序中,k.c:

#include<stdio.h>
int main()
{
    int iLen = 0;
    char *sTmpStr;

    strcpy(sTmpStr, "abc");
    return 0;
}

编译给出了以下警告:

$ gcc -Wall k.c -o k
k.c: In function 'main':
k.c:11: warning: unused variable 'iLen'
k.c:14: warning: 'sTmpStr' is used uninitialized in this function
$

您可以通过添加标记-Werror

将警告变为错误

答案 1 :(得分:0)

仅使用编译器通常不足以查找运行时错误和指定不当的行为。 gcc -std=c11 -pedantic-errors -Wall是一个好的开始,但gcc仍然只是一个编译器,编译器的目的是检查代码是否按标准的要求编写。除此之外的任何事情都只是奖励。

专业选项是使用静态代码分析工具。这些将检查代码中的常见错误和问题。不幸的是,没有这样的工具作为开源存在:它们往往相当昂贵。