Ctrl+S and Visual Studio Output Window
One of PVS-Studio users forwarded a bug report to us.
Exception message: The system cannot find the file specified. Exception from HRESULT: 0x80070002) Stack: EnvDTE.TextPoint get_StartPoint() at (0). Void BuildEvents_OnBuildDone(EnvDTE.vsBuildScope, EnvDTE.vsBuildAction) at C:\Users\evg\Documents\SVN\CCnetBuild\ Local PVS-Studio Setup\WorkDir\PVS-Studio\ PVS-Studio\VsPkg.cs(939).
The review of the code revealed that the crash occurs the moment we try to obtain the text from Visual Studio Output Window (it happens just after the build is done and before incremental analysis is launched, so we can be assured that there are no linking errors present). But at the same time the pointer to the output window itself was correctly obtained, the error revealed itself in the fragment which is used to get the pointer for the first character of this text.
In the situation described the error message "The system cannot find the file specified" itself looks quite odd, as neither we, nor the Output Window itself, are in any ways interact or associate with any files, and all the operations with this window a carried out using Visual Studio API from within seemingly safe C# code. And indeed the stack indicates that the exception is generated inside unmanaged Visual Studio interiors. And of course this bug had not repeated itself nor had it been caught by any of our internal tests.
Summing up all of aforesaid, it becomes clear that to replicate this error we have to determine the relationship between Output Window and some external file, if any. After several hours of digging in Visual Studio settings while trying to disable the saving of build logs to html, disable this output window altogether or to find the connection between output text and system temp files (not a thing from this list was able to replicate this bug, on the contrary our code operated flawlessly), by accident one of not so well known Output Window features had been discovered: the ability to save outputted text into the file with Ctrl+S. It should be noted however that this action is in not synchronizing the output with this file, but simply stores the entire output into it without updating it afterwards. Neither the less by exactly this action we were able to replicate the exception of our interest.
Thereby we can clearly see the bug in the Visual Studio API extensibility model — the single saving of the output into a file leads to the inoperability of methods intended for interaction with Output Window. PVS-Studio 3.45 will include a workaround for such situations.