发现了微软 UCRT 的一个BUG

@UCRT 的一个 BUG

发现了微软 UCRT 的一个BUG

_wsetlocale 会接收形如 zh-Hans-CN.abc-8 的参数,其中 abc-8 会被解析成 utf-8,其原因在于 C:\Program Files (x86)\Windows Kits\10\Source\10.0.22621.0\ucrt\locale\wsetlocale.cpp 文件的函数_expandlocale 中,第 1268、1269 行 的判断语句中少了一对括号。函数的代码片段如下:

// Allow .utf8/.utf-8 for BCP-47 tags.
                if (   __ascii_towlower(cp[0]) == L'u'
                    && __ascii_towlower(cp[1]) == L't'
                    && __ascii_towlower(cp[2]) == L'f'
                    &&     (cp[3] == L'8' && cp[4] == L'\0')
                        || (cp[3] == L'-' && cp[4] == L'8' && cp[5] == L'\0'))
                {
                    iCodePage = CP_UTF8;
                }

后面的 || 应该用括号括起来,改成下面这样:

// Allow .utf8/.utf-8 for BCP-47 tags.
                if (   __ascii_towlower(cp[0]) == L'u'
                    && __ascii_towlower(cp[1]) == L't'
                    && __ascii_towlower(cp[2]) == L'f'
                    &&    ( (cp[3] == L'8' && cp[4] == L'\0')
                        || (cp[3] == L'-' && cp[4] == L'8' && cp[5] == L'\0')) )
                {
                    iCodePage = CP_UTF8;
                }

在改动之前,代码页只要是以 -8 结尾的长度为 5 的字符串,就会被识别成 CP_UTF8。

MinGW(Minimalist GNU for Windows)是一个用于Windows平台的GNU工具链,它允许你在Windows上使用GNU编译器集合(GCC)和其他开发工具。MinGW提供了多种运行时库选择,其中之一是UCRT(Universal C Runtime)。 选择UCRT作为MinGW的运行时库有以下几个优点: 1. **兼容性**:UCRT微软提供的一个现代C运行时库,它与Windows操作系统紧密集成,确保了更好的兼容性和稳定性。 2. **性能**:UCRT经过优化,提供了一些性能改进,使得编译后的程序在运行时更高效。 3. **安全性**:UCRT包含了一些安全增强功能,如缓冲区溢出检测等,有助于提高程序的安全性。 4. **维护性**:由于UCRT是由微软维护的,开发者可以享受到微软提供的长期支持和更新。 在MinGW中选择UCRT作为运行时库,可以通过以下步骤进行: 1. **下载MinGW-w64**:访问MinGW-w64的官方网站或使用包管理器(如MSYS2)下载安装包。 2. **安装MinGW-w64**:按照安装向导的指示完成安装过程。 3. **配置编译环境**:在安装过程中,选择使用UCRT的版本。通常,包管理器会自动处理这些依赖关系。 4. **编译程序**:使用GCC编译器编译你的程序。编译器会自动链接到UCRT。 例如,使用命令行编译一个简单的C程序: ```sh gcc -o myprogram myprogram.c ``` 通过以上步骤,你可以选择UCRT作为MinGW的运行时库,从而获得更好的兼容性和性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dowhileprogramming

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值