【问题标题】:Why uninitialized pointers cause mem access violations close to 0?为什么未初始化的指针会导致接近 0 的 mem 访问冲突?
【发布时间】:2019-07-01 09:22:33
【问题描述】:

据说经常(但不总是)当您在接近零的内存位置(例如 $89)获得一个 AV 时,您有一个未初始化的指针。
但是我在 Delphi 的书中也看到过这个……嗯……或者它们都是由同一个作者写的???


更新:
引自 Bob Swart 等人的“C++ builder 6 开发人员指南”,第 71 页:

当内存地址ZZZZZZZZZ接近零时,原因往往是 一个已被访问的未初始化指针。

为什么会这样?为什么未初始化的指针包含低数字?为什么不是像 $FFFFFFF 这样的大数字或普通随机数?这是都市神话吗?

【问题讨论】:

  • “据说”有点笼统。你能链接到一些说明这一点的资源吗?
  • 未初始化意味着变量包含一个未确定值。时期。未定就是未定,可以是任何东西。
  • 全局变量区域初始化为零,因此全局指针的初始值为零。局部变量可能有任何值。
  • @GPhilo - Bob swart 等人的 C++ builder 6 开发人员指南,第 71 页
  • @GPhilo - 还有很多很多其他地方。到现在我已经听了30遍了。你现在还没有听到它真是个奇迹。即使这被证明是都市传说。

标签: c++ delphi access-violation


【解决方案1】:

为什么未初始化的指针包含低数字?

他们没有。它们可以包含任何值。

为什么不用像 $FFFFFFF 这样的大数字?

它们可以完美地包含像 $FFFFFFF 这样的值。

还是普通的随机数?

未初始化的变量往往不是真正随机的。它们通常包含上次使用时碰巧写入该内存位置的任何内容。例如,每次调用函数时,未初始化的局部变量都包含相同的值是很常见的,因为堆栈使用的历史恰好是可重复的。

还值得指出的是,随机是一个经常被误用的词。人们通常说随机,实际上是指随机分布且均匀分布。我希望这就是您使用“随机”一词时的意思。

【讨论】:

  • 未初始化的是UB,不是随机的。在优化方面尤其重要。
  • @PasserBy 我明确表示不是随机的
  • 我显然用错了词。我的意思是他们不持有 any 价值。它们是未定义的。
  • @PasserBy 这不是 undefined 的意思。他们肯定有一个价值,只是无法保证该价值是什么。
  • @PasserBy:未初始化的指针或整数肯定会包含一个值。只是不一定是有效或有用的。
【解决方案2】:

这会将“未初始化的指针”与空引用或空指针混淆。对对象字段或指针索引的访问将表示为相对于基指针的偏移量。如果该引用为空,则偏移量通常是接近零的地址(对于正偏移量)或接近本机指针大小最大值的地址(对于负偏移量)。

具有这些特征性小(或大)值的地址的访问冲突是一个很好的线索,表明您有 空引用空指针,特别是,而不仅仅是一个未初始化的指针。未初始化的引用可以有一个空值,但也可以有任何其他值,具体取决于它的分配方式。

【讨论】:

  • 您可以添加一些编译器将初始化“未初始化”内存,以帮助进行这种事后分析
  • @Caleth 我认为,delphi 和 C++ 的所有可能编译器的所有模式和平台的内存分配实现细节的完整分解不适合这个答案。
  • 我最诚挚的道歉 - 我误读了这个答案并否决了它。现在转换为赞成票。对我来说,这似乎是一个非常合理的解释。
  • cmets 中引用的书中的引用特别提到了未初始化的指针,而不是从零指针偏移。
  • @DavidHeffernan 我有时会竭尽全力安抚你的强迫症,我发誓,哈哈。不客气;)
【解决方案3】:

您关于 AV 接近于零的说法对于取消引用空指针是正确的。它为零或接近于零,因为您要么取消引用空指针:

int* p{};
const auto v = *p; // <-- AV at memory location = 0

或访问数组项:

char* p{};
const auto v = p[100]; // <--AV at memory location = 100

或结构字段:

struct Data
{
  int field1;
  int field2;
};

Data* p{};
const auto v = p->field2; // AV at memory location = 4

【讨论】:

    猜你喜欢
    • 2012-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多