Реальная утечка ресурсов цикла foreach ManagementObject или ложное срабатывание?

Я работаю с ManagementObjects и циклами foreach в C#. 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 "";

Это настоящая утечка или ложный положительный результат?

Блок использования вообще нужен здесь (это была моя первоначальная попытка избежать утечки)?

Я думаю, что это управляемая коллекция, которая реализует IDisposable, и вызывающая сторона не должна нести ответственность за ее уничтожение. Я видел следующий код, предложенный ранее, но кажется, что он движется по неверному пути с большим количеством блоков:

...
    foreach (ManagementObject mo in mySearcher.Get()) using(mo)
...

1 ответ

Решение

ManagementObject является одноразовым, и он не размещается в этом коде. Вот о чем предупреждение. Это настоящий позитив.

Класс коллекции (mySearcher.Get()) тоже не утилизируется но так и должно быть. Coverity должен предупредить об этом.

Пока я сделал очень мало WMI, но, кажется, почти все нужно утилизировать. Неприятный API. Win32 просвечивает.

Если бы это была одноразовая программа, я бы ни о чем не беспокоился. В противном случае вам, вероятно, нужно избавиться.

Другие вопросы по тегам