7

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

我知道最好的解决方案是遍历所有代码并在需要时初始化所有变量。但是,我只是想知道是否有任何其他解决方案可以解决这个问题。我尝试了谷歌,但找不到合适的答案。

4

2 回答 2

2

最具预防性的长期方法是在声明它们的位置初始化所有指针,更改代码以使用适当的智能指针来管理生命周期。如果您有任何类型的单元测试,那么这种重构可能会相对轻松。

在较短的时间内,如果您要移植到 Linux,您可以使用 valgrind 并很好地跟踪一两个困扰您的实际问题,让您有时间以更悠闲的速度进行重构。

于 2013-01-22T16:26:57.473 回答
2

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

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

如果更复杂的初始化失败,则经常会发生没有“默认”值可以正确用作后备的情况。如果在使用变量之前必须覆盖该值,则程序可以选择不使用该值初始化变量。

在这种情况下,将变量初始化为默认值可能会出现一些问题。通常,“默认”值是无害的,因为如果使用它们,后果不会立即明显。这通常是不可取的,因为作为开发人员,您希望在出现问题时注意到这一点。您可以通过选择会产生明显后果的默认值来避免此问题,但这并不能解决第二个问题;静态分析器通常可以检测并报告何时使用了未初始化的变量。如果某些复杂的初始化逻辑存在问题,例如没有设置任何值,您希望它可以被检测到。设置默认值可防止静态分析检测到此类情况。所以有些情况下你不想初始化变量。


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


回应您的评论:

我看到的主要问题是

  • 从函数返回指向局部变量的指针。
  • 几乎所有的指针变量都没有初始化。我确信 AIX 确实为早期平台中的客户提供了这种舒适感,但是我真的怀疑代码在进行实际测试(生产)时能否在 Linux 中完美运行。
  • 我无法提供可能有效的部分解决方案。我更愿意把最好的给付钱给我的客户。所以不会更喜欢使用解决方法。
  • 质量不能妥协。
  • 修复它们(并特别注意正确清理)
  • 正如我在上面所说的,仅仅缺少初始化器本身并不是缺陷。如果未初始化的值实际上以非法方式使用,则只有缺陷。我不确定您所说的 AIX 提供舒适性是什么意思。
  • 正如我在上面所说的“部分解决方案”和“解决方法”将盲目地初始化所有内容。
  • 同样,盲目地初始化所有内容不仅会导致无用的工作,而且实际上会通过取消一些用于检测错误的工具来降低质量。
于 2013-01-22T17:23:53.350 回答