【问题标题】:Null dereferencing within VB.NETVB.NET 中的空解引用
【发布时间】:2018-08-15 19:24:03
【问题描述】:

我正在审核我们的许多申请。一个应用程序返回了相当多的 null 尊重问题。值得一提的是,我对 VB.NET 很陌生,所以请耐心等待我可能会用我的代码传递的任何问题。

Public Sub SomeMethod()
    Try
        PerformLog("Entering SomeMethod")
        Dim intTemp As Short

        Erase gstrFieldWhatever //Defined earlier: Public gstrFieldWhatever() As String

        ...

        intTemp = intTemp + 1
        ReDim Preserve gstrFieldWhatever(intTemp)
        gstrFieldWhatever(intTemp) = "Z*L-"

分析器(在本例中为 Fortify)报告Erase gstrFieldWhatever 将在我们稍后尝试在gstrFieldWhatever(intTemp) = "Z*L-" 调用它时导致潜在的空异常。但是,我们使用ReDim Preserve gstrFieldWhatever(intTemp) 应该创建一个新数组。如果是这种情况,为什么分析器会指出潜在的 null 取消引用问题?

【问题讨论】:

  • Erase 关键字是 VB6 时代的遗留物,它可以使旧代码的移植更容易。这不是.Net 中的好习惯。与ReDim Preserve 相同。在大多数情况下,这意味着您应该拥有一个集合而不是数组。
  • @JoelCoehoorn 啊...有没有更好的方法来执行与 Erase 关键字类似的操作?我问错问题了吗(我应该问如何使用集合)?
  • VB.Net 通常只重新声明数组(不带Preserve),或者——甚至更好——使用List(Of String) 并将其称为.Clear() 方法。

标签: vb.net


【解决方案1】:

gstrFieldWhatever 是一个公共字段。如果在多线程代码中使用此对象,则存在风险,因为该字段可能在它被释放和被 ReDimmed 之间被访问。

在大多数情况下,ReDim Preserve 的使用表示您确实需要像 List(Of String) 这样的集合的地方,但是,我知道这种更改是否会级联到代码的其他区域。

【讨论】:

  • 这对我来说已经足够了。听起来调整为使用集合而不是数组可能是应用程序的一个不错的选择。
  • 我会确认,通过您的回答,我们能够解决问题。再次感谢!
猜你喜欢
  • 1970-01-01
  • 2010-11-21
  • 2010-09-28
  • 2011-02-09
  • 2017-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-30
相关资源
最近更新 更多