2017-07-25 67 views
10

我們正在從VS2013遷移到VS2017。它是一個Visual C++優化器錯誤還是我的代碼中有一個錯誤?

下面是一個可能不是最簡單的代碼示例,但它是我能做的最好的。 它的要點是一個特定的浮點值被髮送到一個函數,但函數接收到錯誤的值 - 這是因爲調用函數中的寄存器不匹配。

此代碼運行錯誤上VC141(VS 2017)和VC140(VS 2015年),但對VC120(VS 2013)正確運行和在其已內置在VS 2017年(鐺與微軟鐺版本CodeGen(v141_clang_c2) - 無論它是什麼鏗鏘兼容的版本)。

此問題在爲Release(針對優化)編譯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"x64\Release\vc141.pdb" /Zc:inline /fp:precise /D "NDEBUG" /D "_CONSOLE" /D "_UNICODE" /D "UNICODE" /errorReport:prompt /WX- /Zc:forScope /Gd /Oi /MD /Fa"x64\Release\" /EHsc /nologo /Fo"x64\Release\" /Fp"x64\Release\compiler_bug_vc14.pch" /diagnostics:classic 

器命令行:

/OUT:"x64\Release\compiler_bug_vc14.exe" /MANIFEST /LTCG:incremental /NXCOMPAT /PDB:"x64\Release\compiler_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:"x64\Release\compiler_bug_vc14.pgd" /SUBSYSTEM:CONSOLE /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /ManifestFile:"x64\Release\compiler_bug_vc14.exe.intermediate.manifest" /OPT:ICF /ERRORREPORT:PROMPT /NOLOGO /TLBID:1 
+1

這看起來像一個編譯器錯誤。我可以在我的電腦上重現這一點。您應該將其報告給Microsoft。 –

+0

看起來像是一個bug,報告[connect.microsoft.com](https://connect.microsoft.com/VisualStudio)上的錯誤。 –

+4

打開MS連接問題:https://connect.microsoft.com/VisualStudio/feedback/details/3138251/optimizer-bug-in-vc140-141-passing-the-wrong-float-value-to-a-function – Asaf

回答

相關問題