2013-12-13 29 views
0

我的軟件驗證組正在測試的一段代碼如下所示:強制sscanf會比納參數的數目返回更多

unsigned int alarm_id; 
char   alarm_text[16]; 
static const char text_string[] = "105, Water_Boiling"; 
signed int arguments_satisfied = 
    sscanf(text_string, 
      "%3d, %16s", 
      &alarm_id, &alarm_text[0]); 
if (arguments_satisfied < 2) 
{ 
    system_failure(); 
} 

使用上面的代碼片段,有沒有辦法讓sscanf返回一個值大於2而不更改格式說明符或將參數更改爲sscanf

他們正在使用單元測試工具行使if語句表達式。

對於C++,編譯爲C++時,與上述片段有什麼不同嗎?
(我們計劃使用相同的代碼,但是可以編譯爲C++)。我們在IAR Embedded Workbench中使用ARM7處理器。

+0

您是否試圖讓它返回大於2,或者您是否試圖確保您的if語句不會錯過失敗?但是,對於C++來說沒有區別。 – Carl

+2

如果'text_string'的alarm_text字段的長度超過了16個或更多字符,'%16s'格式將在'alarm_text'數組的末尾寫入''\ 0'。 'alarm_text'數組需要有17個元素或格式說明符需要'%15s'。 –

+0

在'system_failure'函數中,世界是否被炸燬? –

回答

1

sscanf返回轉換的參數個數。它不能轉換比你講過的更多的論據。因此,除非格式字符串被更改,否則sscanf不能返回大於2的值。一個可能的異常 - 如果在轉換第一個參數之前用完數據,可能會返回EOF,但我懷疑只有適用於scanf,而不是sscanf。

+0

並且由於EOF保證是負數(即使它不能保證爲-1),它仍然不會返回大於2的值。 –

1

對於很多工具鏈(我非常肯定IAR是一個),如果你在一個目標文件和一個庫中有一個符號,鏈接器將鏈接到一個目標文件中的鏈接,優先於圖書館。

因此,您可以在測試過程中提供自己的sscanf()函數進行鏈接,並讓它返回任何您喜歡的內容。

如果連接器有一個問題,您sscanf()實現,一個在圖書館和替代之間的符號衝突可能工作是讓你的單元測試sscanf()使用不同的名稱(如unittest_sscanf),並有構建系統在構建過程中使用類似/Dsscanf=unittest_sscanf的模塊定義一個宏來重命名sscanf()以用於被測模塊。

當然,確保其他sscanf()未經測試的呼叫不會導致問題可能會非常棘手。

+0

+1爲單元測試建議一個單獨的'sscanf'。 –