3行代码,搞垮Domino服务器

    技术2022-05-11  80

    声明:

    此文撰写的目的在于探讨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  Variantv  =   Split ( "" "" )v  =  Arrayappend(v,  Nothing )

    当代码执行时,便会触发NSD错误。如果类似有问题的代码放置服务器上,又设置为定时代理……后果不堪设想。 

    PS:经测试,如果将第二个参数Nothing换为Null或者Empty,则不会出现类似的问题。


    最新回复(0)