【问题标题】:Secure MultiByteToWideChar Usage安全的 MultiByteToWideChar 使用
【发布时间】:2016-05-12 17:09:07
【问题描述】:

我有这样使用 MultiByteToWideChar 的代码:

wchar_t * bufferW = malloc(mbBufferLen * 2);
MultiByteToWideChar(CP_ACP, 0, mbBuffer, mbBufferLen, bufferW, mbBufferLen);

请注意,该代码不使用之前对 MultiByteToWideChar 的调用来检查新的 unicode 缓冲区需要多大,并假定它将是多字节缓冲区的两倍。

我的问题是这种用法是否安全? 是否存在将字符映射为 3 字节或更大的 unicode 字符并导致溢出的默认代码页?虽然我知道用法并不完全正确,但我想评估风险影响。

【问题讨论】:

  • 您正确指定了缓冲区大小,因此不会出错。转换后的字符串是否真正适合是次要的,与编码或代码点值无关,如果不适合,您将获得 ERROR_INSUFFICIENT_BUFFER。明智的做法是不要冒这种失败模式的风险,但这个决定完全取决于您。
  • @Olaf 这里不需要 MCVE。它是 Win32 并且已提供所有相关信息。
  • 抱歉没有包含正确的标签,感谢@HansPassant 的回答。
  • 没有字符,其UTF-16编码长度为3字节。除非您正在处理一个字节是八位字节的偶数倍的平台。 Windows 不是。

标签: c winapi unicode


【解决方案1】:

是否有默认代码页将字符映射为 3 字节或更大的 [wchar_t UTF-16 代码单元序列]

目前没有将单个字节映射到 BMP 之外的字符的 ANSI 代码页(即在 UTF-16 中需要多个 2 字节代码单元的代码页)。

在 UTF-16 中,不能将单个多字节 ANSI 字符编码为两个以上的 2 字节代码单元。因此,更糟,您永远不会得到一个长度超过输入 ANSI 字符串 2 倍的 UTF-16 字符串(不包括在这种情况下不适用的空终止符)因为您要传递明确的长度),并且在 best 时,您最终会得到一个 UTF-16 字符串,该字符串的 wchar_t 字符少于输入字符串的 char 字符。

对于它的价值,微软endeavouring 不会进一步开发 ANSI 代码页,而且我怀疑 NLS 文件格式需要更改以允许它,所以这不太可能在未来发生变化。但是没有任何 API 保证这一定会永远成立。

【讨论】:

    猜你喜欢
    • 2011-10-05
    • 1970-01-01
    • 1970-01-01
    • 2013-08-22
    • 1970-01-01
    • 1970-01-01
    • 2011-08-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多