是否可以从 C printf() 捕获错误?

Is it possible to trap errors from C printf()?

我有一个 C++ 程序,经过验证的 API 用户(不是交互式用户,所以这里没有主要的 security/integrity 曝光)可以传递一个参数,该参数成为 printf() 的格式字符串(实际上,对于 vsnprintf())。当然,错误的格式说明符会使程序崩溃。我已经记录了这一点并且它是可以接受的——但是有什么方法可以捕获 printf() 错误而不是让 C 运行时断言吗?

环境非常标准 Posix(z/OS XLC、FWIW)。

使用sigsetjmp()/siglongjmp().

在使用可能错误的格式之前调用 sigsetjmp(),并为 SIGSEGV 和 SIGBUS 安装自定义处理程序,该处理程序使用 sigsetjmp() 调用的上下文调用 siglongjmp()

请务必在不需要信号处理程序后使用它们,以免其他地方的 SIGSEGV 导致一些意外结果。

此处示例:

http://www-01.ibm.com/support/knowledgecenter/ssw_ibm_i_72/apis/sigsetj.htm

请参阅 BOOST 格式库 - http://www.boost.org/doc/libs/1_58_0/libs/format/

The format library provides a class for formatting arguments according to a format-string, as does printf, but with two major differences :

format sends the arguments to an internal stream, and so is entirely type-safe and naturally supports all user-defined types.

您可以通过此库使用 C++ 异常。

我很想推荐一个简单的C++风格try/catch:

. . .
try
  printf(...)
catch (...)
  printf("An error happened handling your printf string!")
...

但我认为您已经尝试过了,并且有理由认为它不能满足您的需求。

更深层次的替代方案是 LE 条件处理程序 - 它本质上是一个回调例程,可让您随时控制异常发生,并且它包括一种在错误后恢复执行的方法。通过谷歌搜索 CEEHDLR 阅读更多内容或参阅 XL C/C++ 编程指南的 "Handling error conditions, exceptions, and signals" 部分。

在紧要关头,您还可以使用 ESTAE/ESPIE 宏包装对 printf() 的调用,以便在运行时发现错误之前捕获错误...是的,它需要几行汇编程序,但是很多有时可以通过这种方式获得更精细的方式。

祝你好运!

回答题目:

if(printf("...") < 0)
    {
        perror("printf error message");
        exit;
    }

加法。 工作示例

wchar_t wide[2];
wide[0] = 129;
wide[1] = 0;
    
if(printf("%ls", wide) < 0)
    perror("detect error");