我一直在查看使用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()的情况下,它既不是。
答案 0 :(得分:2)
一般来说,BIO可能不会写入stdout。
您可以拥有写入文件的BIO,或null,或套接字,网络驱动器或其他BIO等。
通过使用BIO_printf系列,可以轻松更改代码,将其输出发送到其他位置或其他BIO,这可能会进行进一步过滤,然后将输出传递到其他任何位置。
答案 1 :(得分:0)
正如其他人指出的那样,BIO
可以与FILE
相反地堆叠。在C99中添加了snprintf()
和vnsprintf()
。 OpenSSL / SSLeay比这个早。因此,SSLeay开发人员必须编写自己的实现。不幸的是,使用少量实现会导致OP或CVE-2016-0799所描述的性能问题。