網通設備成功案例:C++test靜態分析只需數分鐘為企業預防損失的發生
一、問題重現
下面的描述來自 Parasoft 的客戶某跨國網通設備大廠的郵件內容,客戶在郵件中描述了一段存在 Bug 的代碼。以下是郵件內容(注:為防止泄漏客戶代碼信息,對代碼做過輕微改動):
“
As talked last night, we have solved one big code bug; here I list it here for your information.
This code cause system running in an endless loop, that cause system reboot due to watch dog timer timeout.
void ETN_xdd_algo::stop_running(T_global_TCID tcid)
{
if ( pinstances == NULL) { return;
}
LE_simple_list
for (; it != pinstances->end(); ) { if (tcid == (*it)->get_tcid()) {
delete *it; break;
}
}
return;
}
”
對上述錯誤代碼做簡單分析,你將很容易發現問題所在,原因簡單甚至弱智,因為 for 循環的循環因子 it 沒有進行自加運算。這導致只要進入該 for 循環,必將陷入死循環。
以上是從代碼角度進行分析,得出死循環結論。 而當代碼在實際項目中運行時(上述錯誤代碼的項目,實際運行在客戶所生產的電信設備上),所產生的真實后果則更為嚴重。
客戶在郵件中有簡單提及:
“solved one big code bug”
“This code cause system running in an endless loop, that cause system reboot due to watch dog timer timeout.”
而在我們現場支持客戶端過程中,客戶曾說明如下:
“由于存在 Bug 的設備在電信運營商的系統上,經常無端死機,導致他們的客戶怨聲載道。責令他們必須在規定期限內,找到問題根源并修復;”
好了,我們再簡單回顧一下整個問題發生的流程,以便我們能更好的重現問題:
作為電信設備供應商的某跨國網通設備大廠,所銷售的設備正運行在運營商系統上,而運營商發現該設備經常無端死機,于是要求某跨國網通設備大廠必須在短期內找到問題根源并修復。由于不能現場調試,某跨國網通設備大廠的開發人員只能在本地反復診斷,反復模擬,希望重現死機的現象,經過長達一周時間的模擬,他們終于發現問題的根源正是上述那段簡單的 for 循環錯誤。
二、客戶背景
某跨國網通設備大廠是國際電信行業的佼佼者,是數十億美元規模的電信技術領先廠商, 擁有數個重要的全球研發中心,擁有技術先進、制造能力達到世界一流水平的生產制造平臺, 銷售服務網絡遍及全國和海外 50 多個國家。
三、客戶代碼
上述錯誤的代碼正來自某跨國網通設備大廠核心設備的軟件中。述及該項目的歷史,也足讓你瞠目結舌。總項目全部基礎性代碼超過 1000 萬行,最早的代碼可追蹤到 90 年代。
客戶所測項目隸屬總項目重要模塊之一,代碼量超過 100 萬行。
四、問題影響
更為重要的影響在于運營商對于某跨國網通設備大廠產品質量的認定,這樣的問題對于任何客戶而言都是不希望看到的,因為這會影響到實際產品的運行,進而消費者對于產品的使用。
五、解決之道
在軟件開發中,我們極不情愿將 Bug 呈現到客戶面前,但當問題真正產生時,我們需要去反思為什么如此簡單的 for 循環所導致的問題造成這么大影響。
- 產品沒有經過測試嗎?有測試,但往往是功能性和系統性測試。
- 沒有代碼規范標準嗎?有標準,但往往停留于紙面而不得執行。
- 項目初期即介入測試嗎?
……
以上一些問題是保障軟件產品高質量的一些因素,對于這些,C++test 的靜態規則檢查正好完美的滿足這些需求:
- 在代碼級別測試上,C++test 的靜態分析能建立有效代碼規范標準,使得測試不僅僅局限于功能性和系統性測試;
- 在代碼規范標準上,C++test 內建近 1600 條代碼規范,同時提供自定義代碼規范工具 RuleWizard;
- C++test 的靜態分析, Bug Detective 功能,不需要整個項目完成后測試,可在編寫代碼的第一行開始,即進行測試。盡早消除代碼隱患。
對于上文中某跨國網通設備大廠所出現的 Bug,只需要通過 C++test 一條簡單代碼規范, 即可防范于未然。
以下規則來自 C++test 靜態編碼規則:
“Null initialize or increment expressions in for loops will not be used; a while loop will be used instead [CODSTA-49-3]”
六、客戶反饋
從某跨國網通設備大廠反饋的情況,他們非常信賴 C++test 靜態分析,已經將 C++test 的靜態分析作為測試的標準流程,每日進行測試。因為通過 C++test 的代碼規范,只需數分鐘即可預防該問題發生。而該問題從發現到修復前后花費 2 周時間,更重要的是影響客戶對于他們產品的信心。