fix klibc format and string comparison semantics#11550
Conversation
|
👋 感谢您对 RT-Thread 的贡献!Thank you for your contribution to RT-Thread! 为确保代码符合 RT-Thread 的编码规范,请在你的仓库中执行以下步骤运行代码格式化工作流(如果格式化CI运行失败)。 🛠 操作步骤 | Steps
完成后,提交将自动更新至 如有问题欢迎联系我们,再次感谢您的贡献!💐 |
📌 Code Review Assignment🏷️ Tag: kernelReviewers: @GorrayLi @ReviewSun @hamburger-os @lianux-mm @wdfk-prog @xu18838022837 Changed Files (Click to expand)
📊 Current Review Status (Last Updated: 2026-07-03 20:37 CST)
📝 Review Instructions
|
|
该 PR 修复 klibc 中 rt_vsnprintf_tiny、rt_strcmp 和 rt_strncmp 的标准语义边界问题,已在本地完成 bsp/simulator 构建验证,结果为 scons_exit_code=0。请维护者方便时批准 CI 工作流运行,谢谢。 |
为什么提交这份PR (why to submit this PR)
本 PR 用于修复 RT-Thread
klibc中若干格式化输出与字符串比较行为不符合标准语义的问题。相关问题均属于纯软件逻辑缺陷,不依赖具体开发板、外设或硬件环境。当前实现中主要存在以下问题:
rt_vsnprintf_tiny在处理%s时错误地将字段宽度field width当作最大输出长度使用。例如使用%5s格式化字符串"abcdefgh"时,当前实现会错误输出"abcde"。按照标准printf语义,字段宽度只表示最小宽度,不能截断字符串;字符串截断只能由精度控制。rt_vsnprintf_tiny对字符串精度为 0 的情况处理不正确。%.0s和%.s应该输出空字符串,但当前实现仍会输出原字符串内容。rt_vsnprintf_tiny在处理整数零精度格式时错误抑制了非零整数输出。例如%.0d格式化数值5时应输出"5",只有数值为0且精度为0时才应输出空字符串。rt_strcmp和rt_strncmp当前使用有符号char参与字节比较。当字符串中包含0x80、0xC8、0xFF等高位字节时,比较结果的正负号可能与标准strcmp/strncmp语义不一致。标准字符串比较应按unsigned char进行字节比较。因此,本 PR 对上述边界情况进行修复,并补充对应回归测试,避免后续再次引入相同行为缺陷。
你的解决方案是什么 (what is your solution)
本 PR 主要进行了以下修改:
rt_vsnprintf_tiny中%s的字段宽度处理逻辑%.0s和%.s输出空字符串。rt_vsnprintf_tiny中整数零精度格式化逻辑%.0d格式化5、-5等非零数值时,仍正常输出对应数字。rt_strcmp和rt_strncmp的高位字节比较逻辑unsigned char;rt_strncmp使用int保存比较结果,避免signed char截断或符号反转;strcmp/strncmp语义一致。新增和补充了以下测试覆盖:
%5s不应截断字符串;%.0s和%.s应输出空字符串;%.0d对0应输出空字符串;%.0d对5、-5应正常输出数字;rt_strcmp/rt_strncmp应按unsigned char比较0x80、0xC8、0xFF等高位字节。请提供验证的bsp和config (provide the config and bsp)
bsp/simulator本次修改位于
klibc纯软件逻辑层,不依赖具体硬件外设,因此使用bsp/simulator进行构建验证。未修改
.config。验证时使用
bsp/simulator目录下已有的默认.config。额外进行了主机侧行为对比验证,将修复后的 RT-Thread 实现与本机 libc 行为进行对比,覆盖以下场景:
%5s格式化"abcdefgh";%.0s格式化"abc";%.s格式化"abc";%.0d格式化0;%.0d格式化5;%.0d格式化-5;rt_strcmp("\x80", "\x01");rt_strncmp("\xC8Z", "\x01Z", 2);rt_strncmp("\xFF", "\x7F", 1)。同时,对新增和修改的 utest 文件进行了本地语法检查:
src/klibc/utest/TC_rt_sprintf.csrc/klibc/utest/TC_rt_strcmp.c使用
bsp/simulator完成构建验证:构建结果:
Fork 分支:
https://github.com/yanhu7150-tech/rt-thread/tree/bugfix-klibc-format-string当前分支 action 页面:
https://github.com/yanhu7150-tech/rt-thread/actions?query=branch%3Abugfix-klibc-format-string如果 GitHub Action 尚未触发或尚未完成,我会在 action 成功后补充对应的成功链接。
当前拉取/合并请求的状态 Intent for your PR
必须选择一项 Choose one (Mandatory):
代码质量 Code Quality:
我在这个拉取/合并请求中已经考虑了 As part of this pull request, I've considered the following:
#if 0代码,不包含已经被注释了的代码 All redundant code is removed and cleaned up