升级Fedora 38后spdlog+gtest程序出现GCC 13的数组越界等警告
定位
array-bounds/stringop-overflow编译警告:逐步简化示例的方法 从错误调用栈能明确看到,警告的触发路径完全在fmt库的代码中(从fmt::v9::detail::format_dragon到bigint::assign_pow10再到内存缓冲区操作),和gtest没有直接关联。可以按以下步骤逐步简化示例,精准锁定问题根源:
第一步:移除gtest依赖,仅保留spdlog调用
示例中的TEST宏只是包裹了spdlog的调用,完全可以剥离gtest,直接写main函数触发spdlog的格式化逻辑:
#include <spdlog/spdlog.h> int main() { spdlog::info("info {}", 1); return 0; }
用原编译参数-Wall -Werror -pedantic-errors编译,如果仍出现相同警告,说明问题与gtest无关,聚焦到spdlog+fmt的组合上。
第二步:跳过spdlog,直接调用fmt库核心逻辑
spdlog底层依赖fmt实现格式化,可直接调用fmt的接口触发相同数值格式化路径:
#include <fmt/core.h> int main() { fmt::print("info {}", 1); return 0; }
若该示例也触发警告,说明问题完全出自fmt库本身,与spdlog无关。
第三步:精准定位到fmt的bigint模块
从错误栈可知,问题出在fmt::v9::detail::bigint::assign_pow10函数中,可直接构造该路径的最小示例:
#include <fmt/format.h> int main() { fmt::v9::detail::bigint num; num.assign_pow10(1); return 0; }
这个示例会直接触发错误栈中的核心代码路径,确认是否是fmt的bigint实现与GCC 13的边界检查逻辑冲突。
额外排查技巧
- 编译时添加
-fno-inline选项:关闭函数内联后,错误栈会更简洁,能直接定位到触发警告的代码行,而非层层内联后的STL代码。 - 检查Fedora的fmt包补丁:Fedora对系统库通常会打自定义补丁,可能是补丁引入了与GCC 13静态检查不兼容的代码,可查看
/usr/src/debug/fmt-9.1.0下的补丁文件。
内容的提问来源于stack exchange,提问作者Fedor
相关产品推荐
相关产品推荐

