fmt 库的 format_to_n 函数会卡死

作者: , 共 475 字 , 共阅读 0

最近遇到一个诡异的问题,一个程序经常卡死。最后定位到 fmt 和下面简单的例子:

#include <fmt/format.h>
#include <iostream>

int main()
{
    char buffer[12];
    fmt::format_to_n(buffer, 5, "aaaa{}", "bbbb");

    std::cout << buffer;

    return 0;
}

上面这个程序会卡死, CPU 一直占用 100%,程序不会结束。很奇葩的是,把长度限制设置为 4、5、6、7 就会卡死,更小或更大则不会。

github 上有人提到这个 bug :format_to_n will hang infinitely if buffer size is < required size of formatted string,在 2020 年 11 月份被修复。所以升级到 fmt 最新版本即可解决这个问题。

Q. E. D.

类似文章:
编程 » C++, fmt
C++的fmt::format格式化库,由于效率高,功能强大,相关的 API 已经进入C++20,但其文档和 API 细节无法恭维。
编程 » C++, popen
popen函数可以获取比std::system函数更详细的程序输出。只是正常调用 popen 只能获取 stdout 的输出,而 stderr 的输出被忽略。
编程 » C++
如果我们用std::getline或者简单的std::cin >>获取用户输入,有一个问题是,它会阻塞掉整个程序,用户必须有输入后才能继续执行。如果这个输入是单独的线程,它还会阻止整个程序的退出。
编程 » C++
现在一般不能用 sprintf 和 strcpy ,推荐使用 snprintf 和 strncpy ,以防止缓冲区溢出:
编程 » Python
在 Python3 以上,通常说的字符串是指unicode字符串,以下将不再重复强调。
编程 » C++
有两种方法,一种在线程的调用函数内部设置,还有一种是在外部对指定线程变量做设置。
编程 » C++, folly
folly::fbstring是一个完全兼容std::string的类,可以做到无缝替换,而且性能更高。其代码参见https://github.com/facebook/folly/blob/master/folly/FBString.h
编程 » folly, C++, 数据容器
由 Facebook 开发和维护的 C++库 Folly 提供folly::small_vector,代码文件地址:https://github.com/facebook/folly/blob/master/folly/small_vector.h
编程 » C++, 智能指针
理论上而言,当 C++提供了std::unique_ptr, C++的程序就不应该出现普通指针了。所有普通指针都可以用std::unique_ptr代替,避免手动删除对象。
走特定形状的轨迹,可以给公园徒步稍微增加一点难度和乐趣。奥森玫瑰花则是其中很经典的一条路线,寓意也很美好。路线绝大部分是平路,经过奥森湿地等多处经典地点,中间要上仰山山顶,有一小段爬升。
投资 » 股指期货
本文不构成投资建议。本文所有观点,仅代表个人立场以及个人操作,不代表单位立场,不具有任何指导作用,据此操作,风险自负!