[英]How do I get more details from VisualStudio to track down the source of a warning
我升級到最新版本的 VisualStudio 2017 (15.9.5) 來編譯我們的原生 C++ 應用程序。 但是現在在 Release 模式下(並且僅在 Release 中)我收到以下警告(我們將警告視為錯誤):
...nothing useful...
6>qrc_IceApplication.cpp
6> Creating library C:/tkbt/Prose/Build/Release/lib/Prose.lib and object C:/tkbt/Prose/Build/Release/lib/Prose.exp
6>Generating code
6>c:\program files (x86)\microsoft visual studio\2017\community\vc\tools\msvc\14.16.27023\include\functional(1195): error C2220: warning treated as error - no 'executable' file generated
6>c:\program files (x86)\microsoft visual studio\2017\community\vc\tools\msvc\14.16.27023\include\functional(1195): warning C4789: buffer '_Temp' of size 64 bytes will be overrun; 72 bytes will be written starting at offset 8
6>c:\program files (x86)\microsoft visual studio\2017\community\vc\tools\msvc\14.16.27023\include\functional(1195): warning C4789: buffer '_Temp' of size 64 bytes will be overrun; 72 bytes will be written starting at offset 8
6>c:\program files (x86)\microsoft visual studio\2017\community\vc\tools\msvc\14.16.27023\include\functional(1195): warning C4789: buffer '_Temp' of size 64 bytes will be overrun; 72 bytes will be written starting at offset 8
6>c:\program files (x86)\microsoft visual studio\2017\community\vc\tools\msvc\14.16.27023\include\functional(1195): warning C4789: buffer 'DetectPossibilities' of size 64 bytes will be overrun; 72 bytes will be written starting at offset 8
6>c:\program files (x86)\microsoft visual studio\2017\community\vc\tools\msvc\14.16.27023\include\functional(1195): warning C4789: buffer '_Temp' of size 64 bytes will be overrun; 72 bytes will be written starting at offset 8
DetectPossibilities 是唯一與我們的代碼有任何關系的東西(_Temp 沒有),我能看到的唯一奇怪的是它是自我捕獲的
std::function<bool(int)> DetectPossibilities;
DetectPossibilities = [&](int startPos) -> bool {
... lots of code
bool nestedAnyFound = DetectPossibilities(startPos + ofMatch.capturedLength());
... lots of code
};
更新:我找到了一個解決方法和一個合理的解釋,所以我將發布 Q 和 A,這樣下一個人就不會像我一樣花半天時間來弄清楚發生了什么。
這是我們關於引擎蓋下可能發生的事情的理論:
std::function<bool(int)> DetectPossibilities;
編譯(在發布模式下)相當於內存中的 64 字節分配。
DetectPossibilities = [&](int startPos) -> bool {
為它分配一個新的 lambda,這個有一個捕獲,它編譯(在釋放模式下)72 字節的內存,但不適合內存中的同一位置,因此發出警告。 唯一的區別是捕獲。 因此,如果我們確保原始也有捕獲,那么我們應該能夠解決這個奇怪的問題。
std::function<bool(int)> DetectPossibilities = [&](bool){return 0;};
DetectPossibilities = [&](int startPos) -> bool {
事實上,這在發布模式下鏈接,避免了那些奇怪的錯誤。
對我來說,這似乎是 Visual Studio 中的一個錯誤,因為它不會在調試編譯中發生,並且編譯器應該具有能夠處理該特定模式並正確分配內存的智能。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.