C ++代码迁移:处理未初始化的指针
根据标题,我计划移动一些为AIX而开发的遗留代码。 问题是代码库非常庞大。 开发者没有在原始代码中初始化他们的指针。 现在将代码迁移到最新的服务器时,我发现它存在一些问题。
我知道最好的解决方案是运行所有代码并初始化所有变量。 但是,我只是想知道是否有任何其他解决方案可用于解决此问题。 我试过谷歌,但无法找到合适的答案。
最具预防性的长期方法是在宣称的位置初始化所有指针,更改代码以使用适当的智能指针来管理生命周期。 如果你有任何种类的单元测试,这个重构可以是相对无痛的。
从短期来看,如果你正在移植到Linux上,你可以使用valgrind并在追踪一两个真正的问题时找到一个好机会,让你有时间以更悠闲的方式重构。
只是初始化所有的变量可能不是一个好主意。
可靠的行为通常取决于具有已知值正确的变量(“由结构保证”是正确的)。 未初始化变量的问题不仅仅是它们具有未知值。 显然未知是一个问题,但所期望的状态又具有已知和正确的值。 将变量初始化为不正确的已知值不会产生可靠的行为。
如果更复杂的初始化失败,很少发生这种情况,即没有“默认”值可用作后备。 如果在变量可以被使用之前必须覆盖该值,程序可以选择不使用值初始化变量。
在这种情况下将变量初始化为默认值可能会遇到一些问题。 通常'默认'值是无害的,因为如果使用这些值,后果并不明显。 这通常是不可取的,因为作为开发者,当事情出错时你要注意。 您可以通过选择具有明显后果的默认值来避免此问题,但这并不能解决第二个问题; 静态分析器通常可以检测并报告何时使用未初始化的变量。 如果某些复杂的初始化逻辑存在问题,例如未设置任何值,则希望可以检测到该值。 设置默认值可以防止静态分析检测到这种情况。 所以有些情况下你不想初始化变量。
使用指针时,默认值通常是nullptr
,这在一定程度上避免了上面讨论的第一个问题,因为解引用空指针通常会导致立即崩溃(对于调试很有用)。 但是,代码也可能检测到空指针并报告错误(适用于调试)或可能回退到其他某种方法(对调试不利)。 使用静态分析来检测未初始化指针的使用情况,而不是初始化它们可能会更好。 尽管静态分析可能会检测到空指针的解引用,但它不会检测空指针何时导致错误报告或使用回退例程。
回应你的评论:
我看到的主要问题是