【发布时间】:2012-10-01 15:29:07
【问题描述】:
在 Windows 8 上,我们遇到了 FreeConsole 问题。它似乎关闭了 stdio 句柄,而不关闭文件流。
这可能是 Windows 8 的问题,也可能是我根本不理解 Windows 控制台/GUI 应用子系统的工作方式(完全荒谬)。
发生了什么事?
下面的最小示例。使用编译器测试:VS2005、VS2013、VS2017,使用静态链接 CRT。
#include <windows.h>
#include <io.h>
#include <stdio.h>
static void testHandle(FILE* file) {
HANDLE h = (HANDLE)_get_osfhandle(fileno(file));
DWORD flags;
if (!GetHandleInformation(h, &flags)) {
MessageBoxA(0, "Bogus handle!!", "TITLE", MB_OK);
}
}
int main(int argc, char** argv)
{
freopen("NUL", "wb", stdout); // Demonstrate the issue with NUL
// Leave stderr as it is, to demonstrate the issue with handles
// to the console device.
FreeConsole();
testHandle(stdout);
testHandle(stderr);
}
【问题讨论】:
-
注意:如果您在 Windows 7 上运行此代码,则没有 MessageBox。在 Windows 8 上运行它,有一个消息框。
-
我 reported this to Microsoft 考虑到它的安全隐患。它几乎在我们的应用程序中造成了一个极其危险的错误。我仍然想知道是否有任何解释或评论。
-
您向 Microsoft 报告此问题的链接现在已损坏 - 您收到 Microsoft 的任何回复了吗?
-
好问题,我现在在他们网站上的任何地方都找不到。不仅链接被破坏,而且它不再列在我的 Microsoft Connect 仪表板中的“您提交的反馈”下。他们只是删除了我的错误报告吗!?我认为他们的反馈是“无效的,您依赖于未定义/未记录的行为”。我的回答是,“你在开玩笑,怎么可能没有记录 FreeConsole 和 stdout 之间的交互”。
标签: visual-studio-2005 windows-8 msvcrt