一个静态代码分析工具(来自HP的Fortify)抱怨在分配任何控件的Font属性时生成的WinForms代码。分析工具抱怨:
line 143: this.mCopyrightLabel.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
在第143行中,InitializeComponent()函数在AboutWindowForm.cs中无法正确地释放由Font()分配的非托管系统资源。 解释: 程序无法正确释放使用非托管系统资源的托管对象。未能正确处置使用非托管系统资源的托管对象至少有两个常见原因:
在这种情况下,在第143行的AboutWindowForm.cs中分配的资源没有被正确地释放到程序路径上。
托管.NET对象的一小部分使用非托管系统资源。.NET的垃圾收集器可能无法以可预测的方式释放原始托管对象。因此,应用程序可能会耗尽可用内存,因为垃圾收集器不知道非托管资源占用的内存。大多数非托管资源泄漏问题都会导致一般的软件可靠性问题,但如果攻击者可以故意触发非托管资源泄漏,则攻击者可能会通过耗尽非托管资源池来发起拒绝服务攻击。
关于在windows窗体中处理字体的主题,我已经搜索了一段时间,以下是我收集到的要点:
因此,我想得出这样的结论:没有必要在VS生成的代码中显式地释放分配给控件的字体,而且可能我们不应该这样做,因为字体是缓存的?
我创建了一个非常简单的表单测试程序:通过单击一个按钮,我创建了一个使用不同字体的新空表单。在关闭新打开的表单后,Task中的GDI对象计数将立即下降。这就是上述几点的证据,不是吗?
然而,静态分析器似乎并不这么认为。它相信字体最终将由GC发布。它还认为这对非托管资源是不好的,因为占用的内存位于GC知识之外,因此GC不会被及时触发,因为GC没有感到内存压力。这使攻击者有机会故意触发耗尽非托管池。
你能帮我理解一下分析器的解释吗?它对WinFroms有效吗?手动处理创建的每个字体都很繁琐。
准确地说:
字体是在处理控件时立即显式地释放,还是Control释放对字体的引用并让GC处理所有左边的?
谢谢!
对我的问题的进一步更新:我做的另一个实验是:我在TaskManager和内存分析器中监视了我的测试TaskManager应用程序。主窗体有一个按钮,该按钮将打开另一个窗体,其字体在单击时是不同的。我注意到,当我单击按钮并打开新表单时,TaskManager中的GDI对象计数会上升。所以内存分析器所观察到的字体对象的计数。
但是,当我关闭新表单时,TaskManager中的GDI对象的计数立即下降。内存分析器中字体对象的计数没有改变,这意味着GC没有发生。然而,这些字体对象在内存分析器中被标记为“已处理但未收集”。。
它让我感觉到,当窗体关闭时,设置为WinForms控件的字体属性的Font对象已经被正确地释放了。这场戏背后的逻辑似乎是
但这只是间接证据+我的分析。我没有任何直接的证据,如源代码或官方文件支持它。
发布于 2014-02-14 05:54:13
您可以通过包含在使用构造模式中来控制字体的处理。在调用main中,应该将Application封装在表单的using结构中。
示例:
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new FrmMainUtility());
对此:
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
using (FrmMainUtility form = new FrmMainUtility())
{
Application.Run(form);
}
试试看!
发布于 2016-06-24 08:09:49
当窗体关闭时,GC将自动释放不需要显式处理字体。
https://stackoverflow.com/questions/21769908
复制相似问题