3行代碼,搞垮Domino服務器

聲明:

此文撰寫的目的在於探討Domino開發技術,並儘量迴避開發過程中有可能犯下的錯誤,請勿將其用於不適當的場合,否則後果自負!


前兩天碰到一個奇怪的問題,某段代碼一執行,就會立即觸發NSD錯誤。如果代碼運行在客戶端,則客戶端會被強制關閉。如果代碼運行在服務器,則整個Domino服務器會立即癱瘓並被強制關閉。當時通過Lotusscript調試,發現在如下函數退出時程序崩潰:

Function getVariant() as Variant
  
dim vrnTemp as Variant
  ...
  
End Function

琢磨了半天,恍然大悟,忘了寫返回值(-_-)b

更改後代碼如下: 

Function getVariant() as Variant
  
dim vrnTemp as Variant
  ...
  getVariant 
= vrnTemp ' 給函數賦返回值。這句是原來忘了寫的。
End Function

 

 

這樣一來問題就消失了,我也一度認爲Variant型的函數必須賦返值,可是今天想再研究一下這問題時,卻發現問題無法重現了。莫非是原來的推斷有誤?更深入的研究證實了這一點。原來,問題的產生的源頭是另一個函數。

Function wrongFunction() as Variant  
  ...
  
'vrnSource is a string array
  vrnSource = arrayappend(vrnSource, getVariant()) '其實是一執行到這裏就NSD
  ...
End Function

實測結果表明,當使用ArrayAppend()方法時,如果第二個參數是Nothing,則會立即觸發NSD錯誤。按照這個思路,完全可以寫出類似以下的代碼。

Dim v As Variant
= Split("""")
= Arrayappend(v, Nothing)

當代碼執行時,便會觸發NSD錯誤。如果類似有問題的代碼放置服務器上,又設置爲定時代理……後果不堪設想。 

PS:經測試,如果將第二個參數Nothing換爲Null或者Empty,則不會出現類似的問題。

發佈了24 篇原創文章 · 獲贊 1 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章