C ++代码迁移:处理未初始化的指针

根据标题,我计划移动一些为AIX而开发的遗留代码。 问题是代码库非常庞大。 开发者没有在原始代码中初始化他们的指针。 现在将代码迁移到最新的服务器时,我发现它存在一些问题。

我知道最好的解决方案是运行所有代码并初始化所有变量。 但是,我只是想知道是否有任何其他解决方案可用于解决此问题。 我试过谷歌,但无法找到合适的答案。


最具预防性的长期方法是在宣称的位置初始化所有指针,更改代码以使用适当的智能指针来管理生命周期。 如果你有任何种类的单元测试,这个重构可以是相对无痛的。

从短期来看,如果你正在移植到Linux上,你可以使用valgrind并在追踪一两个真正的问题时找到一个好机会,让你有时间以更悠闲的方式重构。


只是初始化所有的变量可能不是一个好主意。

可靠的行为通常取决于具有已知值正确的变量(“由结构保证”是正确的)。 未初始化变量的问题不仅仅是它们具有未知值。 显然未知是一个问题,但所期望的状态又具有已知和正确的值。 将变量初始化为不正确的已知值不会产生可靠的行为。

如果更复杂的初始化失败,很少发生这种情况,即没有“默认”值可用作后备。 如果在变量可以被使用之前必须覆盖该值,程序可以选择不使用值初始化变量。

在这种情况下将变量初始化为默认值可能会遇到一些问题。 通常'默认'值是无害的,因为如果使用这些值,后果并不明显。 这通常是不可取的,因为作为开发者,当事情出错时你要注意。 您可以通过选择具有明显后果的默认值来避免此问题,但这并不能解决第二个问题; 静态分析器通常可以检测并报告何时使用未初始化的变量。 如果某些复杂的初始化逻辑存在问题,例如未设置任何值,则希望可以检测到该值。 设置默认值可以防止静态分析检测到这种情况。 所以有些情况下你不想初始化变量。


使用指针时,默认值通常是nullptr ,这在一定程度上避免了上面讨论的第一个问题,因为解引用空指针通常会导致立即崩溃(对于调试很有用)。 但是,代码也可能检测到空指针并报告错误(适用于调试)或可能回退到其他某种方法(对调试不利)。 使用静态分析来检测未初始化指针的使用情况,而不是初始化它们可能会更好。 尽管静态分析可能会检测到空指针的解引用,但它不会检测空指针何时导致错误报告或使用回退例程。


回应你的评论:

我看到的主要问题是

  • 指向局部变量的指针从函数返回。
  • 几乎所有的指针变量都没有被初始化。 我确信AIX在早期的平台中确实为客户提供了这种舒适性,但是我真的怀疑,当代码在真正的测试(生产)中运行时,代码能够在Linux中完美地运行。
  • 我无法提供可行的部分解决方案。 我更愿意把我最好的东西交给我的工作客户。 所以不会更喜欢使用解决方法。
  • 质量不能妥协。
  • 修复它们(并特别注意正确清理)
  • 正如我上面所说的,仅仅缺乏初始化程序本身并不是一个缺陷。 如果未初始化的值实际以非法方式使用,则只有一个缺陷。 我不确定你对AIX提供的舒适性意味着什么。
  • 正如我在上面论述的那样,“部分解决方案”和“解决方法”将是盲目初始化所有内容。
  • 再一次,盲目地初始化所有内容不仅会导致无用的工作,而且还会带走一些检测错误的工具,从而影响质量。
  • 链接地址: http://www.djcxy.com/p/68645.html

    上一篇: C++ code migration: handling uninitialized pointers

    下一篇: Can I disable AutoMapper reference cache?