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

7654

被折叠的 条评论
为什么被折叠?



