Checkmarx C# - Improper_Resource_Shutdown_or_Release

问题描述

我有一个看起来像这样的代码块:

        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(...) { }

这可确保资源在超出范围时(当您使用完它时)被正确处理,而无需您明确处理它。