问题描述
StringBuilder csvData = new StringBuilder();
StreamWriter fileWriter = new StreamWriter(filepath.ToString());
try
{
csvData.Append(Constants.CSVQuote);
csvData.Append(Constants.Code);
csvData.Append(Constants.CSVDelimiter);
csvData.Append(Constants.Description);
csvData.Append(Constants.CSVDelimiter);
csvData.Append(Constants.Comments);
csvData.Append(Constants.CSVQuote);
fileWriter.WriteLine(csvData);
csvData.Clear();
for( int i=0; i<StatusEntities.Count(); i++)
{
csvData.Append(Constants.CSVQuote);
csvData.Append(StatusEntities[i].Code != null ? Common.ToCSVString(StatusEntities[i].Code) : string.Empty);
csvData.Append(Constants.CSVDelimiter);
csvData.Append(StatusEntities[i].Description != null ? Common.ToCSVString(StatusEntities[i].Description) : string.Empty);
csvData.Append(Constants.CSVDelimiter);
csvData.Append(StatusEntities[i].Comments != null ? Common.ToCSVString(StatusEntities[i].Comments) : string.Empty);
csvData.Append(Constants.CSVQuote);
fileWriter.WriteLine(csvData);
csvData.Clear();
}
}
catch
{
throw;
}
finally
{
fileWriter.Close();
csvData = null;
}
我不断找回Improper_Resource_Shutdown_or_Release漏洞。 我曾尝试使用自动使用 try-with-resource 的隐式发布,但这也不起作用。 您能否就如何修复此类漏洞提供一些建议?
解决方法
Checkmarx 正在标记您的代码,因为您没有为 StringBuilder 和 StreamWriter 实例正确处理新的资源分配。您可以将资源分配移动到 Var ind =str.indexof("@")
块,然后在 try { }
块内添加以下代码:
finally { }
您需要将资源分配移动到 cvsData.Dispose();
fileWriter.Dispose();
块的原因是因为在分配过程中可能会抛出异常。尤其是下面这行:
try { }
例如,如果变量“filepath”无效,可能会引发异常。
或者,您可以将新的资源分配包装在 StreamWriter fileWriter = new StreamWriter(filepath.ToString());
块中,如下所示:
using(...) { }
这可确保资源在超出范围时(当您使用完它时)被正确处理,而无需您明确处理它。