真正的 ManagementObject foreach 循环资源泄漏或误报?
Real ManagementObject foreach loop resource leak or false positive?
我正在使用 C# 中的 ManagementObjects 和 foreach 循环。 Coverity 声称在这样的代码中存在泄漏:
ObjectQuery myQuery = new ObjectQuery("Select * from Win32_Printer");
using (ManagementObjectSearcher mySearcher = new ManagementObjectSearcher(myQuery))
{
// alloc_fn: A new resource is returned from allocation method Current.get
// var_assign: Assigning: mo = resource returned from mo$iterator.Current
foreach (ManagementObject mo in mySearcher.Get())
{
foreach (PropertyData p in mo.Properties)
{
// do stuff, maybe return a string
}
}
}
// leaked_resource: Returning without closing mo leaks the resource that it refers to
return "";
这是真漏还是误报?
这里甚至需要 using 块吗(这是我为避免泄漏而进行的最初尝试)?
我的想法是,这是一个实现了 IDisposable 的托管集合,调用者不应该负责销毁它。我之前看过以下建议的代码,但它似乎在使用更多 using 块的情况下走错了路:
...
foreach (ManagementObject mo in mySearcher.Get()) using(mo)
...
ManagementObject
是一次性的,它没有在该代码中被处理。这就是警告的内容。这是一个真正的肯定。
集合 class (mySearcher.Get()
) 也没有被处理,但它应该被处理。 Coverity 应该对此发出警告。
到目前为止,我只做了很少的 WMI,但似乎几乎所有东西都需要处理。一个讨厌的API。 Win32 大放异彩。
如果这是一个一次性程序,我根本不会担心任何一个。否则,您可能需要处理。
我正在使用 C# 中的 ManagementObjects 和 foreach 循环。 Coverity 声称在这样的代码中存在泄漏:
ObjectQuery myQuery = new ObjectQuery("Select * from Win32_Printer");
using (ManagementObjectSearcher mySearcher = new ManagementObjectSearcher(myQuery))
{
// alloc_fn: A new resource is returned from allocation method Current.get
// var_assign: Assigning: mo = resource returned from mo$iterator.Current
foreach (ManagementObject mo in mySearcher.Get())
{
foreach (PropertyData p in mo.Properties)
{
// do stuff, maybe return a string
}
}
}
// leaked_resource: Returning without closing mo leaks the resource that it refers to
return "";
这是真漏还是误报?
这里甚至需要 using 块吗(这是我为避免泄漏而进行的最初尝试)?
我的想法是,这是一个实现了 IDisposable 的托管集合,调用者不应该负责销毁它。我之前看过以下建议的代码,但它似乎在使用更多 using 块的情况下走错了路:
...
foreach (ManagementObject mo in mySearcher.Get()) using(mo)
...
ManagementObject
是一次性的,它没有在该代码中被处理。这就是警告的内容。这是一个真正的肯定。
集合 class (mySearcher.Get()
) 也没有被处理,但它应该被处理。 Coverity 应该对此发出警告。
到目前为止,我只做了很少的 WMI,但似乎几乎所有东西都需要处理。一个讨厌的API。 Win32 大放异彩。
如果这是一个一次性程序,我根本不会担心任何一个。否则,您可能需要处理。