【发布时间】:2018-04-18 13:25:57
【问题描述】:
覆盖调用GetCommandLine 函数返回的命令行字符串是否安全(不会导致未定义的行为)?
*(GetCommandLineW() + 1) = L'x'; // should be fine, right?
我不确定是否将返回的字符串视为字符串文字,因为相应内存页面的分配保护属性似乎有所不同。
MEMORY_BASIC_INFORMATION mbiMemPage;
VirtualQuery(GetCommandLineW(), &mbiMemPage,
sizeof(MEMORY_BASIC_INFORMATION)); // mbiMemPage.Protect = PAGE_READWRITE
VirtualQuery(L"some string", &mbiMemPage,
sizeof(MEMORY_BASIC_INFORMATION)); // mbiMemPage.Protect = PAGE_EXECUTE_READ
【问题讨论】:
-
该文档没有理由让您相信可以安全地对其进行修改。你想解决什么问题?
-
没有任何建议需要修改内容。几乎可以肯定,您找到了错误的解决方案。
-
@DavidHeffernan 返回类型不是const,可想而知MS想要允许unix风格的“状态更新”。
-
那你为什么不打电话给CommandLineToArgvW呢?或者使用由 CRT 的启动代码预先填充的 __wargv 全局变量。
标签: c winapi command-line