是否可以从 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");
我有一个 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");