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

问题描述 投票:-1回答:1

我有a legacy code,其中有未初始化的数字

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

或可能未初始化:

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

变量,稍后可能导致未定义的行为。有什么方法可以告诉编译器将所有未初始化的变量设置为更可调试的内容,例如NULL。可能使用任何一个选项

  • 预处理宏
  • 编译器选项
  • CMake选项

例如,考虑此伪代码:

#include <stdio.h>

int main() {

   int a;

   printf("%d\n",a);

   return 0;
}

我想使用以上任一选项将a设置为NULL的所有情况,或者在这种情况下,如果无法使用0,则将NULL设置为所有情况。

P.S。在这里,我正在使用MSVC来捕获可能的问题,但最后,我希望我的解决方案与跨平台和编译器无关。因此,无论如何,编译器特定的解决方案(例如GCC,Clang ...)都受到高度赞赏。

c cmake c-preprocessor safety-critical
1个回答
0
投票

这是我的主要评论开头。

我已经克隆了您的开发仓库。

最终,我能够进行make -i。输出约为[错误] 500行。

因此,没有足够的错误来证明自动化脚本的合理性(即,当您将脚本提高到生产质量时,您可以在更少的时间内进行手动检查和修复)。

并且,应该检查某些错误的逻辑错误,尤其是-Wmaybe-unitialized,这是您所关心的。现在可能是确定是否只是更改的好时机:int foobar;变为int foobar = 0;是可以的。如果是这样,那就是我要做的。 (即)如果基于if层次结构的代码在未初始化时从不actually从未使用该值,则添加int foobar = 0;仅会告诉STFU编译器一个非问题。

但是,它可能实际上是一个错误。 If警告所抱怨的代码路径is。也许实际上没有显示代码路径,但是在[将来]使用不同的输入数据时,将执行代码[[is。这将是一个[潜在的]错误。

至少,仅使用= 0;进行初始化会将

unpredictable

随机副作用转变为predictable副作用。如果该函数失败,则它将以一致/可预测的方式失败(与之相对的是,它依赖于它在[未初始化]堆栈帧中获得的随机值)。但是,这将是检查[潜在]错误的代码的好时机。您将获得更多的男孩(-)

许多错误为-Wunused-parameter。通常,如果代码

已知

可以正常工作,我会将-Wno-unused-parameter添加到CFLAGS。 IMO,在大多数情况下,这实际上甚至不是错误([真实的,虚构的或理论的]),这不是error使用not使用参数,只是对新手编写新代码的警告。如果您具有一个函数签名,该签名具有一个向后兼容性必须保留的额外参数,但替换函数不需要它,则此处将出现误报。对于-Wunused-but-set-variable,我将删除声明

对其的赋值。对int result = important_function_that_changes_globals();进行分类。在那里,keep函数调用。替换为:important_function_that_changes_globals();。或者,如果您必须[而且就个人而言,我从不这样做]:(void) important_function_that_changes_globals();但是,还有其他错误指示​​(例如)-Wstringop-truncation,它指示[可能]缓冲区溢出。

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

根据我的经验,这些错误可能会在1-3天(最多1周)内进行分类。

但是,正如

jarmod

指出的那样,可能存在更严重的错误[在运行时调试中出现[[only]。
© www.soinside.com 2019 - 2024. All rights reserved.