Я могу объяснить, что означают сообщения, включая noescape
.
this.btnSaveChanges.Visible = false;
//Error: alloc_fn: A new resource is returned from allocation method Grp_des.
//Error: var_assign: Assigning: dtv = resource returned from this.dal.Grp_des(this.sParent).
DataView dtv = dal.Grp_des("ABC");
Событие alloc_fn
означает, что Coverity считает, что Grp_des
выделяет ресурс, который должен быть утилизирован. Затем var_assign
говорит, что на ресурс указывает переменная dtv
.
**//error: noescape: Resource dtv is not closed or saved in Table.get.**
DataRow dtr = dtv.Table.Rows[0];
Событие noescape
является чисто информативным. Coverity говорит, что, хотя dtv
было передано Table.get
, этот метод не распоряжается ресурсом, а также не сохраняет его в поле. Следовательно, ресурс все еще распределен и все еще должен быть удален.
Это конкретное событие, как известно, сбивает с толку. Термин «escape», используемый для анализа stati c анализа, описывает, что происходит, когда значение сохраняется в поле или глобале. «noescape» означает, что этого не произошло.
lblTransferFrom.Text = "Job Transferred from: " + HttpUtility.HtmlEncode(dtr[0].ToString());
//Error: leaked_resource: Variable dtv going out of scope leaks the resource it refers to.
Наконец, событие leaked_resource
указывает, что мы достигли конца этого метода, и ресурс все еще не был утилизирован или сохранен для последующего удаления. , Обычно это плохо, потому что ресурс не будет утилизироваться до тех пор, пока сборщик мусора не восстановит связанный объект памяти, что может занять длительное время, а в это время что-то может истощиться для рассматриваемого ресурса.
Простым решением было бы добавить dtv.Dispose();
в конце или использовать оператор using
для автоматического удаления и безопасного исключения. Но, конечно, не видя остальной код, невозможно быть уверенным, что это правильное исправление.
(Раскрытие: я работал на Coverity / Synopsys.)