You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
补充一点排查信息:RT_KLIBC_USING_VSNPRINTF_STANDARD 的默认值是 default y if ARCH_CPU_64BIT,但这块 BSP 保存的 .config 把它显式关成了 is not set。所以用默认配置复现不出来——我先后试了"全关""STANDARD+LONGLONG 全开"两种,6 个 klibc 用例都是 PASSED,直到打开 RT_KLIBC_USING_LIBC_VSNPRINTF 才稳定失败。
Activity
kurisaW commentedon Feb 24, 2025
@mysterywolf 满老师有空能否也看下这个issue
[-][Bug] AARCH64下运行utest项提示 klibc.rt_sprintf 运行失败[/-][+][Bug] qemu-virt64-aarch64运行utest项提示 klibc.rt_sprintf 运行失败[/+]Yunlk commentedon Oct 30, 2026
/claim
Yunlk commentedon Oct 30, 2026
复现到了,根因也定位了,已提 PR #11953。
复现条件
bsp/qemu-virt64-aarch64,RT_USING_CI_ACTION=y+RT_UTEST_TC_USING_KLIBC=y,关键是要开RT_KLIBC_USING_LIBC_VSNPRINTF=y。补充一点排查信息:
RT_KLIBC_USING_VSNPRINTF_STANDARD的默认值是default y if ARCH_CPU_64BIT,但这块 BSP 保存的.config把它显式关成了is not set。所以用默认配置复现不出来——我先后试了"全关""STANDARD+LONGLONG 全开"两种,6 个 klibc 用例都是 PASSED,直到打开RT_KLIBC_USING_LIBC_VSNPRINTF才稳定失败。根因
rt_sprintf()把一个无穷大的 size 传给 libc:内置实现只用 size 决定何时停写,无害;但开了
LIBC_VSNPRINTF后直接转发:libc 用
buf + size算缓冲区末尾,64 位下溢出,调用失败且一个字节都没写。实测对照:
0xCC是 utest 宏SPRINTF_CHECK里rt_memset(buffer, 0xCC, ...)的填充值,所以报错里的str-b是一串����:修复与验证
开
LIBC_VSNPRINTF时改用 libc 的vsprintf()(本就无 size 参数),内置路径不动。三组结果:LIBC_VSNPRINTF=yrt_sprintfFAILED,其余 5 个 PASSEDLIBC_VSNPRINTF未开LIBC_VSNPRINTF未开 + STANDARD/LONGLONG 全开想请你确认
issue 里没有当时的完整
.config。如果那时RT_KLIBC_USING_LIBC_VSNPRINTF是关着的,那我修的就不是你碰到的那一次,需要你补一下配置(或直接贴 CI 的.config)。不过从"64 位 + 你这单报的就是
rt_sprintf"来看,这条路径是比较可能的解释——因为它是 64 位下唯一会让rt_sprintf完全不写(而不是写错)的路径。0xCC未写入的现象也和截图里那种整片乱码对得上。如果你能确认当时的配置,我可以再按那个配置交叉验证一次。
github-actions commentedon Oct 30, 2026
@Yunlk has claimed this issue.