是视觉C++优化器错误还是我的代码中有错误?
Is it a Visual C++ optimizer bug or do I have a bug in my code?
我们正在从VS2013迁移到VS2017。
下面是一个可能不是那么简单的代码示例,但这是我能做的最好的。 它的要点是将特定的浮点值发送到函数,但该函数收到错误的值 - 这是因为调用函数中的寄存器不匹配。
此代码在VC141 (VS 2017( 和 VC140 (VS 2015( 上无法正常运行,但在 VC120 (VS 2013( 和 VS 2017 内置的 clang 版本(带有 Microsoft CodeGen (v141_clang_c2( 的 Clang - 无论它是什么 clang 兼容版本(上都能正常运行。
在发布(通过优化(中针对 x64 平台进行编译时会出现此问题。删除优化时,代码工作正常,所以我的猜测是优化器。 调用test()
时badFunc()
错误的行为。
代码:
#include <iostream>
#include <vector>
struct FloatWrapper
{
FloatWrapper() : m_value(0) {}
explicit FloatWrapper(float value) : m_value(value) {}
float getValue() const { return m_value; }
private:
float m_value;
};
class Tester
{
public:
virtual bool test(FloatWrapper elevation) const
{
std::cout << "Expected=" << m_expected.getValue() << ", received=" << elevation.getValue() << 'n';
return elevation.getValue() == m_expected.getValue();
}
Tester(FloatWrapper expected) : m_expected(expected)
{
}
FloatWrapper m_expected;
};
struct DataBlock
{
FloatWrapper a, b;
};
bool badFunc(const Tester& query, std::vector<DataBlock> blocks)
{
auto block = blocks[0];
if (!query.test(block.b))
{
std::cout << "Tried to send " << block.b.getValue() << 'n';
return false;
}
return true;
}
int main(int argc, const char** argv)
{
DataBlock block;
block.b = FloatWrapper(0.2f);
Tester tester(block.b);
return badFunc(tester, { block }) ? 0 : 1;
}
编译器命令行:
/GS /GL /W3 /Gy /Zc:wchar_t /Zi /Gm- /O2 /Fd"x64Releasevc141.pdb" /Zc:inline /fp:precise /D "NDEBUG" /D "_CONSOLE" /D "_UNICODE" /D "UNICODE" /errorReport:prompt /WX- /Zc:forScope /Gd /Oi /MD /Fa"x64Release" /EHsc /nologo /Fo"x64Release" /Fp"x64Releasecompiler_bug_vc14.pch" /diagnostics:classic
链接器命令行:
/OUT:"x64Releasecompiler_bug_vc14.exe" /MANIFEST /LTCG:incremental /NXCOMPAT /PDB:"x64Releasecompiler_bug_vc14.pdb" /DYNAMICBASE "kernel32.lib" "user32.lib" "gdi32.lib" "winspool.lib" "comdlg32.lib" "advapi32.lib" "shell32.lib" "ole32.lib" "oleaut32.lib" "uuid.lib" "odbc32.lib" "odbccp32.lib" /DEBUG:FULL /MACHINE:X64 /OPT:REF /INCREMENTAL:NO /PGD:"x64Releasecompiler_bug_vc14.pgd" /SUBSYSTEM:CONSOLE /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /ManifestFile:"x64Releasecompiler_bug_vc14.exe.intermediate.manifest" /OPT:ICF /ERRORREPORT:PROMPT /NOLOGO /TLBID:1
答案是肯定的 - 这是一个优化器错误。 Microsoft说他们修复了它,目前(24 Sep '17(等待发布。
见 https://developercommunity.visualstudio.com/content/problem/84976/optimizer-bug-in-vc140141-passing-the-wrong-float.html
相关文章:
- 我的字符计数代码计算错误.为什么
- 我的代码中有错误吗?使用BGI图形的C++代码对我不起作用
- 如何修复sfml c++代码编译错误
- 需要以下代码的帮助,下面的代码有什么问题
- 我的代码中有错误,未声明的标识符
- 我关于函数"Assert"的C++代码有问题
- 为什么这两段使用 constexpr、__PRETTY_FUNCTION__ 和 char * 的代码有不同的结果?
- C++ LeetCode #377 的 DP 解决方案中,此代码是否有错误?
- 我如何在一个 if 语句中声明所有数字我尝试通过其他方式声明所有数字,如果一个接一个,但似乎代码有逻辑错误
- 我在这个 C++ 代码上有错误吗?
- 我在 c++ 中的 AES 代码有问题。明文正在更改,但加密邮件是相同的。我找不到我的错误
- 是视觉C++优化器错误还是我的代码中有错误?
- 我的 MergeSort 显示错误的输出,您认为我的代码有什么问题
- 这个C++代码有什么问题?编译错误:调用“测试::测试(测试)”没有匹配函数
- 我的链表代码有错误,有人能帮我检查哪里错了吗
- 下面的代码有哪些错误?
- 为什么此代码有 C2784 "could not deduce template argument"错误
- 是否有任何内置的CUDA函数允许CUDA内核向主机代码报告错误?
- 我的代码有问题,因为我无法弄清楚为什么会收到错误。这是代码:
- Cocos2d-X的testcpp代码是否有错误?