3行代码,搞垮Domino服务器

来源:互联网 发布:asp户口管理系统源码 编辑:程序博客网 时间:2024/06/06 08:37

声明:

此文撰写的目的在于探讨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,则不会出现类似的问题。

原创粉丝点击