在c语言中编译时有没有办法找到内存错误

在c语言中编译时有没有办法找到内存错误,c,gcc,memory,C,Gcc,Memory,假设在我的代码中我使用这样的东西 int iLen = 0; char *sTmpStr; strcpy(sTmpStr, "abc"); 现在我还没有给指针分配任何地址。那么gcc中是否有任何选项会显示此错误 我尝试过优化,但它没有给出这个错误 我尝试了-fsanize=address,但在运行时出现了类似这样的错误 ==1982==错误:地址消毒器:未知地址0x000000c38299上的SEGV(pc 0x7f78d7b685b0 sp 0x7ffd8918a0b0 bp 0x

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

int iLen = 0;
    char *sTmpStr;

strcpy(sTmpStr, "abc");
现在我还没有给指针分配任何地址。那么gcc中是否有任何选项会显示此错误

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

我尝试了-fsanize=address,但在运行时出现了类似这样的错误

==1982==错误:地址消毒器:未知地址0x000000c38299上的SEGV(pc 0x7f78d7b685b0 sp 0x7ffd8918a0b0 bp 0x7f78d7d7a668 T0)


或者是否有任何方法可以将此o/p写入文件

打开编译器警告会有很大帮助。良好警告级别(IMHO)为
-Wall

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

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

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

您可以通过添加标志
-Werror

将警告转化为错误。仅使用编译器通常不足以查找运行时错误和指定不当的行为
gcc-std=c11-pedanticerrors-Wall
是一个良好的开端,但gcc仍然只是一个编译器,编译器的目的是检查代码是否按照标准的要求编写。除此之外的任何东西都只是奖金


专业的选择是使用静态代码分析器工具。这些将检查代码中的常见错误和问题。不幸的是,没有开源工具:它们往往非常昂贵。

错误:不是直接的,警告:是的。把警告变成错误。希望可以。我应该在gcc中使用什么选项将其显示为警告?您可以使用
clang
--analyze
来获取
函数调用参数是一个未初始化的值
:编译器所能做的就是发出警告,因为您正在使用未初始化的变量
sTmpStr
。编译器标志-Wall应该完成这项工作-Wall没有将此显示为警告我不认为
-Wall
足够(例如,请参阅)。假设我是自由写的(sTmpStr)-Wall没有将此显示为warningAlso,
char*sTmpStr=NULL
将删除该警告,即使错误仍然存在-Wall并没有将此显示为警告,因为内存没有初始化,所以我们如何释放它?选项
-std=c11
在这方面并不重要,并且具有误导性。@Fuzzxl否,因为在C标准中,许多没有明确规定的行为在GNU C中被实现为语言扩展。除非您使用GNU C扩展,没有理由不使用
-std
,我想说的是,您不需要逐字地指定
-std=c11
;为了兼容性,许多项目都是针对C89或C99编写的,在不评估结果的情况下更改语言版本通常是个坏主意。始终假设人们会在不理解答案各部分含义的情况下复制(并鼓吹)你的答案。@FUZxxl根据C标签政策,所有问题都假设与当前的C标准有关,除非OP另有规定。但你的答案不需要将标准修订设置为C11。如果有人读了你的答案,但不知道答案如何,他可能会认为必须设置
-std=c11
,才能得到正确的错误报告。这是完全错误的。
$ 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
$