You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

升级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的边界检查逻辑冲突。

额外排查技巧

  1. 编译时添加-fno-inline选项:关闭函数内联后,错误栈会更简洁,能直接定位到触发警告的代码行,而非层层内联后的STL代码。
  2. 检查Fedora的fmt包补丁:Fedora对系统库通常会打自定义补丁,可能是补丁引入了与GCC 13静态检查不兼容的代码,可查看/usr/src/debug/fmt-9.1.0下的补丁文件。

内容的提问来源于stack exchange,提问作者Fedor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 22:02:03