在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
$