新聞中心
對于一個通過輸出緩沖區(qū)來返回數(shù)據(jù)的函數(shù),如果函數(shù)執(zhí)行失敗,則這個緩沖區(qū)里的數(shù)據(jù)是未定義的,調(diào)用者不應(yīng)該對這些數(shù)據(jù)做出任何假定。

但是,還是有人會這樣做。
我曾經(jīng)讀過 Michael Kaplan 的一篇關(guān)于輸出緩沖區(qū)的文章,在那篇文章中,用戶要求,即使函數(shù)執(zhí)行失敗,函數(shù)也需要將輸出緩沖區(qū)里的數(shù)據(jù)做出一定的設(shè)置后才返回。
為什么輸出緩沖區(qū)在函數(shù)失敗的時候一定不能做出任何修改,因為有很多應(yīng)用程序會依賴這個行為:函數(shù)調(diào)用失敗后,函數(shù)將不會對輸出緩沖區(qū)做任何改動,即使并沒有文檔指明函數(shù)一定要支持這個行為特征。
下面是一個簡化版本的例子代碼,它會依賴輸出緩沖區(qū)在函數(shù)調(diào)用失敗后不會有任何改動。
此代碼片段首先定義一個默認的注冊表鍵值,然后嘗試打開一個”更好”的鍵,假設(shè)如果打開失敗,hk 變量的內(nèi)容將保持不變,因此將繼續(xù)具有原始默認值。RegOpenKeyEx 函數(shù)的規(guī)范不能保證這種行為,但這并不能阻止人們依賴它。
這只是 Win32 為了兼容性而需要定期維持的各種濫用行為的一個簡單示例。因為,畢竟,人們購買計算機是為了在計算機上運行程序。
“失敗時輸出緩沖區(qū)未定義”規(guī)則的一個重要例外是 COM 接口返回的輸出緩沖區(qū)規(guī)則是,輸出緩沖區(qū)始終被初始化,即使在失敗時也是如此。這對于確保編組器不會崩潰是必要的。例如,IUnknown::QueryInterface 方法的最后一個參數(shù)必須在失敗時設(shè)置為 NULL。
總結(jié)
到底要不要設(shè)置輸出緩沖區(qū),好像確實是一個需要權(quán)衡的問題。
如果代碼庫作者決定在函數(shù)執(zhí)行失敗的時候設(shè)置緩沖區(qū),則必須在文檔中明確指明此行為。
我的個人習(xí)慣是:不論函數(shù)是否執(zhí)行成功,都會在客戶提供的緩沖區(qū)設(shè)置一個合理值。
說到底,我看起來還是一個決定論者。
最后
Raymond Chen的《The Old New Thing》是我非常喜歡的博客之一,里面有很多關(guān)于Windows的小知識,對于廣大Windows平臺開發(fā)者來說,確實十分有幫助。
本文來自:《More undocumented behavior and the people who rely on it: Output buffers》
標題名稱:另一個人們依賴的未文檔化行為:輸出緩沖區(qū)
本文網(wǎng)址:http://www.5511xx.com/article/cojdohh.html


咨詢
建站咨詢
