未调用的 C++ 函数必须存在,否则代码会爆炸

标签 c++ debugging

所以我遇到了一个非常奇怪的问题,如果我的代码中不存在这个函数,它就无法工作。它可以是任何名称,它必须存在。我什至有一个exit(EXIT_FALURE)我的代码中的语句,如果存在,它将运行。 (请注意,这是在多台计算机上发生的)。

基本上我必须有如下所示的代码:

void dosomething()
{
  Camera dummyCamera;
  dummyCamera.refreshTransform(0,0);
}

但是我可以像这样重命名该函数,它仍然有效

void thisStillWorks()
{
  Camera dummyCamera;
  dummyCamera.refreshTransform(0,0);
}

无需更改代码中的任何其他内容。该函数从未被显式调用。但是,如果我注释掉方法主体,人们就会在运行时注意到差异。

这是这个奇怪的事情的视频......

http://youtu.be/PIyGOoMAa6Y

无效的解决方案: - 清理数据
- 注释掉代码
- 在代码库中查找#define
- 删除派生数据
- 在函数体中设置断点(只是跳过)

如果您真的很好奇,可以在此处克隆我们的存储库(您需要自己安装依赖项):

https://github.com/fnk0/MarcusGameEngine

最佳答案

我的一些猜测。

  • 我最好的猜测是你有内存损坏,并且你完全巧合地用这个函数指针覆盖了 vtable 值。或者采取某种无效跳转,由于不同的指令填充而变得可见。要进行调查,请使用 valgrind。

  • 如果不是这种情况,我猜你的编译器/链接器有点坏了。尝试从头开始重新编译所有内容(通过删除所有 .o 文件)。

  • 我可以想象这样一个场景:您的库动态链接,并且您通过索引或其他方式调用动态加载的方法。

  • 你做了:

    #define void void myDefaultFunctionNameIamATroll() \/\/
    

关于未调用的 C++ 函数必须存在,否则代码会爆炸,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27306923/

相关文章:

c# - 在 VS2013 中调试从 VFP9 执行的 C# DLL 时出现 "No native symbols in symbol file"

c - 在 Mac OS Catalina 中,所有当前文档均因无法找到进程 ID 的 Mach 任务端口而失败,有什么建议吗?

java - 在 Eclipse 调试器中启动后进程暂停

c++ - C++的类似Maven的依赖管理?

c++ - 空字符串的 back() 方法会返回什么?

python - 发现倍数时被行为所困扰

node.js - 调试 TypeScript VS Code 时的未绑定(bind)断点

c++ - QThread的复杂使用——

c++ - 什么是函数 __tcf_0? (在使用 gprof 和 g++ 时看到)

c - C 程序如何在不终止的情况下生成自身的核心转储?