使用BIO_printf()而不是printf()有什么好处?

时间:2014-09-25 21:18:54

标签: c openssl

我一直在查看使用OpenSSL的示例代码,在我找到的每个示例中,创建者都选择使用BIO_printf()将内容写入stdout而不是printf()。

我已经取了他们的代码,删除了openssl / bio.h头文件声明,并将对BIO_printf()的所有调用都更改为常规printf()语句。程序运行的结果相同。

我正在掌握的问题是,为什么这些编码器使用BIO_printf()时需要更多的设置而不仅仅是使用printf()。您必须包含另一个标头(这将增加程序大小),您需要将文件指针设置为您要写入的流。然后,您可以将消息打印到stdout。它似乎比使用printf()复杂得多。

当我在BIO_printf()上搜索时,它列出了BIO_printf(3)的可能的手册页,但没有一个页面实际包含任何信息!

我决定对这两种方法进行基准测试。我循环printf("Hey\n"); 1,000,000次。然后我为BIO_printf(fp, "Hey\n");做了。我只定时BIO_printf()语句,而不是设置文件指针(这会增加时间)。 printf()的差异比使用BIO_printf()快了4.7倍。

他们为什么要使用它?有什么好处?我的理解是,在编程中你要么想要简单也要有效率,而在BIO_printf()的情况下,它既不是。

2 个答案:

答案 0 :(得分:2)

一般来说,BIO可能不会写入stdout。

您可以拥有写入文件的BIO,或null,或套接字,网络驱动器或其他BIO等。

通过使用BIO_printf系列,可以轻松更改代码,将其输出发送到其他位置或其他BIO,这可能会进行进一步过滤,然后将输出传递到其他任何位置。

答案 1 :(得分:0)

正如其他人指出的那样,BIO可以与FILE相反地堆叠。在C99中添加了snprintf()vnsprintf()。 OpenSSL / SSLeay比这个早。因此,SSLeay开发人员必须编写自己的实现。不幸的是,使用少量实现会导致OP或CVE-2016-0799所描述的性能问题。