2014-09-25 144 views
6

我一直在審查使用OpenSSL的示例代碼,並且在我找到的每個示例中,創建者都選擇使用BIO_printf()將事物寫入標準輸出而不是printf()。使用BIO_printf()而不是printf()有什麼好處?

我拿走了他們的代碼,刪除了openssl/bio.h頭文件聲明,並將所有對BIO_printf()的調用更改爲常規printf()語句。程序運行的結果相同。

我正在掌握的問題是,爲什麼這些編碼器使用BIO_printf()時需要更多的設置,而不僅僅是使用printf()。您必須包含另一個標題(這會增加程序大小),您需要將文件指針設置爲要寫入的流。然後你可以打印你的消息到標準輸出。看起來比使用printf()複雜得多。

當我在BIO_printf()上搜索時,它列出了BIO_printf(3)的可能手冊頁,但沒有一個頁面實際上包含任何信息!

我決定對這兩種方法做基準測試。我打了printf("Hey\n"); 1,000,000次。然後我做了BIO_printf(fp, "Hey\n");。我只定時了BIO_printf()語句,而不是設置文件指針(這會增加時間)。與使用BIO_printf()相比,printf()的差異快了4.7倍。

他們爲什麼使用它?有什麼好處?這是我的理解,在編程中,您要麼希望代碼簡單或高效,而在BIO_printf()的情況下,它既不是。

+0

在我的經驗中,OpenSSL的功能在於安全和抽象。 BIO_printf函數可以保護信息免於泄漏,或者簡化與BIO結構或兩者兼而有之的工作。 – Dan 2014-09-25 21:33:57

+0

由於OpenSSL的所有問題,有一個運行的項目非常簡化了OpenSSL,並且刪除諸如BIO_printf()之類的東西是列表中的第一件事情。換句話說,有人認爲BIO_printf是一個好主意,但事實並非如此。 – gnasher729 2014-09-25 21:59:05

+0

我的確普遍認同BIO超出SSL庫應該做的範圍的觀點。在我自己的代碼中,我根本不使用它們,我使用自己的通信渠道,只使用非BIO版本的OpenSSL函數。 – 2014-09-26 02:38:44

回答

1

通常,BIO可能不會寫入標準輸出。

你可以有一個BIO寫入到文件,或空或插座,或網絡驅動器,或其他生物等

通過使用BIO_printf家庭,代碼可以輕易地改變將其輸出發送到不同的位置或另一個BIO,這可能會進行一些進一步的過濾,然後將輸出傳遞到其他任何地方。

0

正如其他人所指出的,BIO可以堆疊,與FILE相反。在C99中添加了snprintf()vnsprintf()。 OpenSSL/SSLeay比這更舊。因此,SSLeay開發者必須編寫他們自己的實現。不幸的是,稍微使用過的實現會導致OP或CVE-2016-0799描述的性能問題。

相關問題