【问题标题】:Resources listing known compiler bugs in VC++ 6.0列出 VC++ 6.0 中已知编译器错误的资源
【发布时间】:2016-01-07 10:49:01
【问题描述】:

是否有资源列出了 VC6.0 和 Visual Studio 2010 之间的 CString 修复。我们遇到了似乎是 VC6.0 sp6 中在 2010 年有效的编译器错误。
我正在努力将它提炼成一个小测试用例,但基本上在引用约 300 个字符串的情况下,两个几乎相同的字符串解析,这样一个在汇编级别丢失。似乎是 vc6.0 内部可能存在的内部哈希表冲突。

我需要为 vc6.0 解决方案证明这一点。 (我们的遗留代码是 vc6.0)。一旦可以/(如果可以)将其提炼成可以发布的内容,我将尝试发布代码 sn-p。

【问题讨论】:

  • CString 是 MFC 的一部分,而不是本机类型。 IOW,不是编译器错误。此外,我不知道“两个几乎相同的字符串 resolve 使得一个 在程序集级别丢失”甚至意味着什么。此外,“内部哈希表冲突”——VC++6 没有内部哈希表。当然有CMap,但这与CString无关。
  • 我知道 CString 是在 VS6 之间重写的,后来又从 MFC 中分离出来。这就是我的 CString 引用的来源。我自己还没有进入这段代码。在 VS 2010 中,两个不同的调用将两个不同的字符串在程序集级别解析为代码工作的两个唯一指针。在 vc6 中,两个不同的字符串解析为同一个指针。一个字符串丢失了。
  • 仍然不清楚“字符串解析为指针”是什么意思。 CString 包含一个指针,但我现在在玩猜谜游戏..
  • 我们的 QA/ 开发人员已确认字符串错误与 /ZI 标志的使用有关。 (使用编辑进行调试并继续)。切换到 /Zi(不调试并继续)修复了 VC++ 6.0 中的问题。
    。我们的 QA 工程师找到了这个链接computer-programming-forum.com/80-microsoft-visual-c-vc/…。关于字符串池。该错误似乎在编译器的字符串池中。当我知道更多时,我会发布更多。
  • 对,不是CString,而是编译器本身。当您升级到较新的编译器时,您会大吃一惊。 “错误”不在编译器中,而是在修改字符串文字的代码中。这一直都是非法的。在 C++11 中,负责任的转换(从 const char* 中删除 const)已被消除。

标签: visual-studio visual-c++


【解决方案1】:

Visual C++ 使用 COMDAT naming 支持 /GF 字符串池标志(由 /ZI 隐含)但是,在 VC++6.0 下,符号名称长度被截断为 256 个字符。

我怀疑您的字符串在第 256 个字符之前具有相同的前缀。

【讨论】:

  • 我们实际上有两个字符串池导致问题的情况。第一次我们有一个客户的字符串很长,所以我怀疑这可能是一个问题。在第二种情况下,字符串长度为 8 个字符。
猜你喜欢
  • 2010-12-26
  • 2012-06-05
  • 1970-01-01
  • 1970-01-01
  • 2014-01-29
  • 1970-01-01
  • 2010-11-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多