解决 “Power PC S390X 上 C/C++ 正确调用 sprintf %d” 发生编译失败的错误。

本文探讨了在IBM ZS390X大型机平台上,如何修复由于`sprintf`导致的编译错误,涉及使用std::to_string替代和调整CXX_FLAGS。通过实例代码和解决策略,帮助开发者理解并解决格式化字符串溢出的问题。

函数实现:

    auto fmt = [](int source, char* dest) noexcept {
        if (source < 10) {
            char temp[3];
            strcpy(dest, "0");
            sprintf(temp, "%d", source);
            strcat(dest, temp);
        }
        else {
            sprintf(dest, "%d", source);
        }
    };

错误信息:

error: ‘%d’ directive writing between 1 and 11 bytes into a region of size 3 [-Werror=format-overflow=]
  440 |             sprintf(temp, "%d", source)

是不是很惊讶?上述代码怎么会发生编译错误并导致停止编译,在其它平台上面这样的代码是可以正确编译的,我们知道:%d 格式符号等价需求 signed int; int 的数值输入。

不过这套观点无法适用于 IBM Z S390X 大型机平台上面,解决办法有两种:

1、不要使用 sprintf 函数,自行单独封装各自的字符串格式化函数,比如 %d 可以由 std::to_string 来代替实现。

2、为编译器选项 CXX_FLAGS 增加:-Wno-format-overflow。# CMAKE: CMAKE_CXX_FLAGS

     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值