根据标题,我计划移动一些十年前为 AIX 开发的遗留代码。问题是代码库很大。开发人员没有在原始代码中初始化他们的指针。现在,在将代码迁移到最新服务器时,我发现它存在一些问题。
我知道最好的解决方案是遍历所有代码并在需要时初始化所有变量。但是,我只是想知道是否有任何其他解决方案可以解决这个问题。我尝试了谷歌,但找不到合适的答案。
最具预防性的长期方法是在声明它们的位置初始化所有指针,更改代码以使用适当的智能指针来管理生命周期。如果您有任何类型的单元测试,那么这种重构可能会相对轻松。
在较短的时间内,如果您要移植到 Linux,您可以使用 valgrind 并很好地跟踪一两个困扰您的实际问题,让您有时间以更悠闲的速度进行重构。
仅仅初始化所有变量可能不是一个好主意。
可靠的行为通常取决于具有已知正确值的变量(“由构造保证”是正确的)。未初始化变量的问题不仅仅是它们具有未知值。显然,未知是一个问题,但所需的状态再次是具有已知和正确的值。将变量初始化为不正确的已知值不会产生可靠的行为。
如果更复杂的初始化失败,则经常会发生没有“默认”值可以正确用作后备的情况。如果在使用变量之前必须覆盖该值,则程序可以选择不使用该值初始化变量。
在这种情况下,将变量初始化为默认值可能会出现一些问题。通常,“默认”值是无害的,因为如果使用它们,后果不会立即明显。这通常是不可取的,因为作为开发人员,您希望在出现问题时注意到这一点。您可以通过选择会产生明显后果的默认值来避免此问题,但这并不能解决第二个问题;静态分析器通常可以检测并报告何时使用了未初始化的变量。如果某些复杂的初始化逻辑存在问题,例如没有设置任何值,您希望它可以被检测到。设置默认值可防止静态分析检测到此类情况。所以有些情况下你不想初始化变量。
对于指针,默认值通常是nullptr
,这在一定程度上避免了上面讨论的第一个问题,因为取消引用空指针通常会立即导致崩溃(有利于调试)。然而,代码也可能检测到空指针并报告错误(有利于调试),或者可能会退回到其他方法(不利于调试)。您最好使用静态分析来检测未初始化指针的使用情况,而不是初始化它们。尽管静态分析可以检测到空指针的取消引用,但它不会检测空指针何时导致使用错误报告或回退例程。
回应您的评论:
我看到的主要问题是
- 从函数返回指向局部变量的指针。
- 几乎所有的指针变量都没有初始化。我确信 AIX 确实为早期平台中的客户提供了这种舒适感,但是我真的怀疑代码在进行实际测试(生产)时能否在 Linux 中完美运行。
- 我无法提供可能有效的部分解决方案。我更愿意把最好的给付钱给我的客户。所以不会更喜欢使用解决方法。
- 质量不能妥协。