Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为所有未初始化的变量设置默认值_C_Cmake_C Preprocessor_Safety Critical - Fatal编程技术网

C 为所有未初始化的变量设置默认值

C 为所有未初始化的变量设置默认值,c,cmake,c-preprocessor,safety-critical,C,Cmake,C Preprocessor,Safety Critical,我有一大堆未初始化的东西 警告C4100::未引用的形式参数 或可能未初始化: 警告C4701:使用了可能未初始化的局部变量 变量,这可能会导致以后出现未定义的行为。有没有办法告诉编译器将所有未初始化的变量设置为更易于调试的值,比如NULL。可能使用其中一个选项 预处理宏 编译器选项 CMake选项 例如,考虑这个伪代码: 包括 int main{ INTA; printf%d\n,a; 返回0; } 我想使用上面的任一选项将所有情况(如a)设置为NULL,或者在本例中,如果不可能设置NULL,

我有一大堆未初始化的东西

警告C4100::未引用的形式参数

或可能未初始化:

警告C4701:使用了可能未初始化的局部变量

变量,这可能会导致以后出现未定义的行为。有没有办法告诉编译器将所有未初始化的变量设置为更易于调试的值,比如NULL。可能使用其中一个选项

预处理宏 编译器选项 CMake选项 例如,考虑这个伪代码:

包括 int main{ INTA; printf%d\n,a; 返回0; } 我想使用上面的任一选项将所有情况(如a)设置为NULL,或者在本例中,如果不可能设置NULL,则设置为0


这里我使用MSVC来捕捉可能的问题,但最终我希望我的解决方案是跨平台和编译器无关的。所以编译器特定的解决方案,例如GCC、Clang。。。无论如何,我们都非常感激

这是我最重要的评论

我已经克隆了你的开发报告

最后,我终于可以做一个I型。输出大约有500行[错误]

因此,没有足够的错误来证明自动化脚本的合理性,也就是说,当脚本达到生产质量时,您可以在更短的时间内进行手动检查和修复

并且,应该检查一些错误的逻辑错误,特别是-Wmaybe unitialized,这正是您所关心的。现在可能是确定是否只是更改的好时机:intfoobar;转换为int foobar=0;没关系。如果是的话,我会这么做。i、 e.如果基于If层次结构的代码在未初始化时从未实际使用该值,则添加int-foobar=0;只是告诉编译器STFU一个非问题

但是,它实际上可能是一个bug。如果采用了警告所抱怨的代码路径。也许代码路径在实践中还没有出现,但是,在[将来]使用不同的输入数据时,代码会被执行。这将是一个[潜在的]错误

至少,仅使用=0初始化;将不可预测的随机副作用转变为可预测的副作用。如果函数失败,它现在将以一致/可预测的方式失败,而不是依赖于它在[uninitialized]堆栈帧中获得的随机值

但是,这将是一个很好的时间来桌面检查代码是否存在[潜在的]bug。你会得到更多的好手-

参数中使用了许多错误。通常,如果已知代码正在工作,我会向CFLAGS添加-Wno unused参数。在我看来,这甚至不是一个bug(真实的、想象的或理论的),大多数时候,不使用参数并不是一个错误,只是对编写新代码的新手的一个警告。如果你有一个函数签名,它有一个额外的参数,为了向后兼容,你必须保留这个参数,但是替换函数不需要它,你会得到一个误报

对于-Wunused但set变量,我将删除声明和对它的赋值。根据int result=important\u function\u更改\u globals;进行分类;。在这里,保留函数调用。替换为:重要的\u函数\u更改\u全局;。或者,如果你必须[而且,就我个人而言,我从来没有这样做过]:取消改变全局的重要功能

但是,还有其他一些表示错误的错误,例如-Wstringop截断,它表示[可能]缓冲区溢出

src子目录中的代码库[仅]30000行。同样,只有大约500行错误消息

根据我的经验,可以在1-3天内[最多一周]对错误进行分类


但是,正如jarmod所指出的,可能会有更严重的错误[只在运行时调试时出现]。

不,没有。那又如何使它更易于调试呢?如果编译器向您指出错误,那么最好的做法是进入并修复它们。盲目地将值设置为某些默认值可能弊大于利,因为它可能会隐藏问题,直到在最不方便的时候不可避免地出现运行时错误。不,没有办法告诉编译器这样做。我要做的[过去也做过类似的事情]是编写一个perl/python脚本,解析编译器警告,并在目标源文件中的声明中添加一个初始值设定项,例如char*ptr;转到char*ptr=NULL;。您甚至可以对某些文件进行交互,并让脚本询问是否应该进行更改。告诉编译器-您正在与哪个编译器对话?跨平台是局部变量具有不确定值,如果您希望初始化它们,则应指定初始值设定项。当我正在研究GCC的答案时,你应该修改你的问题,因为答案将是非常依赖于编译器的。你的问题与cmake有什么关系。不,这在没有自定义的gcc中是不可能的。