[Fortify][.NET]Unreleased Resource: Streams 排除

明明同事用了using来确保区块结束时会调用Dispose()作到自动释放资源,但还是被源码检测工具fortify举报。呼~~来解题。

如下,Developer都很乖有使用using定义对象范围来让using区块结束时调用Dispose()作到自动释放资源

using (FileStream fsInFile = new FileStream(@"C:Testfile.txt", FileMode.Open, FileAccess.Read, FileShare.None))
{
    using (StreamReader srInFile = new StreamReader(fsInFile, System.Text.Encoding.Default))
    {
        string strInfData;
        while ((strInfData = srInFile.ReadLine()) != null)
        {
            throw new Exception("somebody else"); //故意直接跳出method
        }
    }
}

另外,微软docs对于using陈述式的说明:

提供方便的语法,以确保正确使用 IDisposable 对象。

但被扫出Unreleased Resource: Streams

查了using在微软docs的说明,有一行吸引了眼球,文档她说即使发生Exception,也可以确保会执行Dispose

The?using?statement ensures that?Dispose?is called even if an exception occurs within the?using?block.

看来是fortify误判了。


修正方法

老招,继续神鬼交锋,那我们在出事前加上一行Dispose()

using (FileStream fsInFile = new FileStream(@"C:Testfile.txt", FileMode.Open, FileAccess.Read, FileShare.None))
{
    using (StreamReader srInFile = new StreamReader(fsInFile, System.Text.Encoding.Default))
    {
        string strInfData;
        while ((strInfData = srInFile.ReadLine()) != null)
        {
            fsInFile.Dispose();
            throw new Exception("somebody else");
        }
    }
}

重新扫描:

结案!


实验解构函数发生Exception跳出using区块时是否会执行

除了看微软Docs文档,我们也科学的做实验。

我们有一个球员class:Footballer,New一个马竞前锋grizmann起来执行射门之后,我们故意进入Exception,看看解构函示是否会执行?

using System;

namespace ConsoleApp1
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            Console.WriteLine("程序开始");
            Attack();
            Console.WriteLine("程序结束");
        }

        private static void Attack()
        {
            using (Footballer griezmann = new Footballer())
            {
                try
                {
                    griezmann.Shot();
                    throw new Exception("Error");
                }
                catch (Exception e)
                {
                    Console.WriteLine(e);
                    return;
                }
            }
        }
    }

    internal class Footballer : IDisposable
    {
        public Footballer()
        {
            Console.WriteLine("建构函数");
        }

        public void Shot()
        {
            Console.WriteLine("射门!!!");
        }

        public void Dispose()
        {
            Console.WriteLine("解构函数");
            GC.SuppressFinalize(this);
        }
    }
}

有执行解构!资源会被释放~

Semi Finals

期待的4强,就少了西班牙。


参考

微软docs using陈述式

https://docs.microsoft.com/zh-tw/dotnet/csharp/language-reference/keywords/using-statement

原文:大专栏  [Fortify][.NET]Unreleased Resource: Streams 排除

原文地址:https://www.cnblogs.com/petewell/p/11445416.html

时间: 2025-01-25 10:30:49

[Fortify][.NET]Unreleased Resource: Streams 排除的相关文章

Unreleased Resource(未释放资源)-Streams(流)

java中把不同的输入/输出源(键盘.文件.网络连接等)抽象表现为Stream(流). java程序可以通过使用不同的流来访问不同的输入/输出源.而Stream(流)可以直观的理解为从数据的源(Source)到数据的接收(Sink)之间的这样一段有序数据. ps. 注意此处是Stream(流) 并不是 冰激凌中的 Scream(奶油) 大家看以参照下图,在脑海中想象一下,途中的水滴就是流中的数据,他们共同组成了这段有序的数据(水:流). 一.流的分类 1.按照流的方向(从程序运行所在的内存的角度

Vmware VRA vRealize Automation 7 看不到Endpoint里的computer resource 故障排除

给客户安装vRealize Automation 7. 添加完vsphere的endpoint以后,看不到里面的cluster.等了许久看到cluster了,在Fabric Group里面选取若干cluster作为Compute Repource. 但是Compute Repource抓不到实际资源状况,log里面也是一堆错误. 查到是IAAS服务器和SQL服务器 MSDTC通信问题. 由于这两台服务器都是来自于一个模版,因此MSDTC的ID是一样的.因此在两台机器上分别以管理员身份运行下面的命

转 Fortofy扫描漏洞解决方案

Log Forging漏洞: 数据从一个不可信赖的数据源进入应用程序. 在这种情况下,数据经由CreditCompanyController.java 的第 53行进入 getParameter(). 2. 数据写入到应用程序或系统日志文件中. 这种情况下,数据通过CreditCompanyController.java 文件第86 行的 info() 记录下来.为了便于以后的审阅.统计数据收集或调试,应用程序通常使用日志文件来储存事件或事务的历史记录.根据应用程序自身的特性,审阅日志文件可在必

【转】The requested resource (/) is not available

HTTP Status 404(The requested resource is not available)异常主要是路径错误或拼写错误造成的,请按以下步骤逐一排查: 1.未部署Web应用 2.URL输入错误 a.查看URL的IP地址和端口号是否书写正确. b.查看上下文路径是否正确 Project--------Properties------MyElipse-----Web----- Web Context-root检查这个路径名称是否书写正确. c.检查一下文件名称是否书写正确. 3.

C++test 关于resource参数和include/exclude参数说明

C++test工具:Parasoft® C/C++test® 是专业针对C和C++语言的开发测试方案,经广泛证明能提高软件开发效率和代码质量的自动化最佳实践解决方案. 如果需要使用C++test的命令行进行自动化测试分析,需要用到cpptestcli命令,并且通常如果需要设置过滤扫描时,可以考虑使用下面的三个关键参数选项: -resource %RESOURCE% Specifies a workspace resource path %RESOURCE% to add to the test

Flume官方文档翻译——Flume 1.7.0 User Guide (unreleased version)(二)

Flume官方文档翻译--Flume 1.7.0 User Guide (unreleased version)(一) Logging raw data(记录原始数据) Logging the raw stream of data flowing through the ingest pipeline is not desired behaviour in many production environments because this may result in leaking sensit

Flume官方文档翻译——Flume 1.7.0 User Guide (unreleased version)(一)

Flume 1.7.0 User Guide Introduction(简介) Overview(综述) System Requirements(系统需求) Architecture(架构) Data flow model(数据流模型) Complex flows(复杂流) Reliability(可靠性) Recoverability(可恢复性) Setup(配置)Configuration(配置 Setting up an agent(设置一个agent) Configuring indiv

理解 PHP 中的 Streams

Streams 是PHP提供的一个强有力的工具,我们常常在不经意会使用到它,如果善加利用将大大提高PHP的生产力. 驾驭Streams的强大力量后,应用程序将提升到一个新的高度. 下面是PHP手册中对Streams的一段描述: Streams 是在PHP 4.3.0版本被引入的,它被用于统一文件.网络.数据压缩等类文件的操作方式,为这些类文件操作提供了一组通用的函数接口.简而言之,一个stream就是一个具有流式行为的资源对象.也就是说,我们可以用线性的方式来对stream进行读取和写入.并且可

The requested resource is not available错误

"HTTP Status 404(The requested resource is not available)"示例 HTTP Status 404(The requested resource is not available)异常主要是路径错误或拼写错误造成的,请按以下步骤逐一排查: 1.未部署Web应用 2.URL输入错误 a.查看URL的IP地址和端口号是否书写正确. b.查看上下文路径是否正确 Project--------Properties------MyElipse