簡體   English   中英

如何從 VisualStudio 獲取更多詳細信息以追蹤警告來源

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM