ppc64le平台内联strcmp()对比相同字符串偶现返回错误值
ppc64le平台GCC优化下strcmp()异常问题排查与解决
环境
- GCC版本:
gcc (GCC) 11.2.1 20220127 (Red Hat 11.2.1-9) - 运行平台:ppc64le
问题现象
在ppc64le平台使用-O优化编译代码时,内联的strcmp()对比两个完全相同的字符串,偶尔会返回负值。
- 两个字符串的存储位置:一个在本地字符数组,另一个在动态分配的内存中
- 问题仅在大型服务代码中触发,无法提炼出最小复现用例
调试分析
反汇编内联的strcmp()代码后,通过GDB调试观察寄存器与内存,定位到问题根源:
内联的strcmp()实现会读取字符串结束符(\0)之后的内存区域,而两个字符串对应的该区域内容不一致,最终导致计算出错误的返回值(例如-115、-168)。
解决方法
验证了两种可行的规避方案:
- 添加编译选项
-fno-builtin-strcmp,禁用strcmp()的内联优化 - 将待比较的字符串变量复制到本地变量后,再调用
strcmp()
最终选用第二种方案解决问题
附调试信息
反汇编片段与寄存器值
0x00000000103f04f8 <+1480>: lxvd2x vs32,r29,r9 0x00000000103f04fc <+1484>: lxvd2x vs33,r23,r9 ... (gdb) p (int)$r15 $42 = -115
内存调试补充信息
(gdb) x /32x $r26 0x69 0x5f 0x77 0x72 0x5f 0x72 0x65 0x66 ... (gdb) x /32x $r23 0x69 0x5f 0x77 0x72 0x5f 0x72 0x65 0x66 ...
内容的提问来源于stack exchange,提问作者UBA
相关产品推荐
相关产品推荐

