2017-07-25 18 views
10

Chúng tôi đang trong quá trình di chuyển từ VS2013 đến VS2017.Đây có phải là lỗi trình tối ưu hóa Visual C++ hay có lỗi trong mã của tôi không?

Dưới đây là mẫu mã có thể không quá tối thiểu, nhưng đó là cách tốt nhất tôi có thể làm. Ý chính của nó là một giá trị float cụ thể được gửi đến một hàm, nhưng hàm nhận giá trị sai - điều này là do sổ đăng ký không khớp trong hàm gọi.

Mã này chạy sai trên VC141 (VS 2017) và VC140 (VS 2015), nhưng chạy đúng trên VC120 (VS 2013) và trên phiên bản kêu vang mà đi kèm được xây dựng với VS 2017 (Clang với Microsoft CodeGen (v141_clang_c2) - bất kỳ phiên bản tương thích clang nào).

Sự cố hiển thị khi biên dịch cho nền tảng x64 trong Bản phát hành (có tối ưu hóa). Khi loại bỏ tối ưu hóa mã hoạt động tốt, vì vậy tôi đoán là trình tối ưu hóa. Hành vi sai là trong badFunc() khi gọi test().

Mã:

#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; 
} 

trình biên dịch dòng lệnh:

/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 

Linker dòng lệnh:

/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

Điều này giống như lỗi trình biên dịch. Tôi có thể tái tạo điều này trên máy tính của mình. Bạn nên báo cáo cho Microsoft. –

+0

Trông giống như một lỗi đối với tôi, báo cáo lỗi trên [connect.microsoft.com] (https://connect.microsoft.com/VisualStudio). –

+4

Đã mở một sự cố kết nối MS: https://connect.microsoft.com/VisualStudio/feedback/details/3138251/optimizer-bug-in-vc140-141-passing-the-wrong-float-value-to-a-function – Asaf

Trả lời

Các vấn đề liên quan