一个不当使用fclose引发的异常

最近服务器上一个后台传输文件的服务,经常会报出异常来,只能强行终止并重启。

昨天刚好有空,现场抓了一下dump,再把程序扔到IDA里看了一下,很快就找出原因了,原来是调用fclose时出错的。

使用C的Runtime函数进行文件操作,也就是fopen,fread,ftell,fclose这些,本身这并没有什么问题

但是出现异常的位置往上一点,程序写了日志,主要内容是“打开文件失败,错误原因:xxxxxx”

也就是说,在使用fopen打开文件失败了之后,程序仍然使用了fclose来关闭这个无效的FILE指针,导致了异常的发生。

可以简单用下面的代码测试一下:

void TestFun()
{
    FILE *fp;
    fp = fopen("C:\\nosuchfile.sys","r");//打开一个不存在的文件
    printf("fp = 0x%X\n",fp);
    if (fp == NULL)
    {
        printf("Open file failed.\n");
    }
    else
    {
        printf("Open file succeed.\n");
    }
    fclose(fp);//这里将引发异常
}

事实上,我所知道的,用CloseHandle关闭一个无效的句柄同样是会引发异常的。

本来打开操作就是失败的,FILE指针也无效,再关它有什么意义呢?

解决办法:直接把程序中这个调用打了个补丁,用nop指令填充了一下,就正常了。如下图所示,将有颜色的三条指令用nop填充:

时间: 2024-09-30 05:34:48

一个不当使用fclose引发的异常的相关文章

mono 3.10 Socket引发未知异常的悲剧事情...

最近在做mono 3.10针对socket性能方面的测试,在想对压力比较高的情况下发现了mono的一个bug会导致程序引发未知异常从而导致程序结束的严重问题. 错误信息 Unhandled Exception: System.InvalidOperationException: EndSend can only be called once per asynchronous operation at System.Net.Sockets.Socket.EndSend (IAsyncResult

在MS单元测试中引发期望异常

首先准备一个引发异常的方法. 1 public static void ThrowException() 2 { 3 throw new ArgumentException(); 4 } 然后在单元测试项目中,写下测试方法. [TestMethod] [ExpectedException(typeof(ArgumentException))]// 构造函数中为期望引发的异常. public void ThrowExceptionTest() { Program.ThrowException();

因DataTable的字段值为DBNull引发的异常

1 问题重现 (1)新建项目DBNullExp,项目属性为"控制台应用程序": (2)在项目下新建数据集Schools(数据集文件的后缀名为.xsd): (3)在数据集下新建数据表Students,表字段的定义如下表所示: 字段名 说明 ID dc.DataType = Type.GetType("System.Int32");//类型 dc.AutoIncrement = true;//自动增量 dc.AutoIncrementSeed = 1;//起始为1 dc

int Parse方法引发的异常

今天,我们来介绍一下Parse方法引发的异常. 一.Parse方法(String): 首先,我们先来介绍一下这个Parse方法的主要作用,即将数字的字符串表示形式转换为它的等效 32 位有符号整数.在C++中,它的具体语法如下: public: static int Parse( String^ s ) 其中,参数是s,类型是String,包含要转换的数字的字符串.返回值是int,与 s 中包含的数字等效的 32 位有符号整数. Parse方法主要有三个异常: 1)System.Argument

NIO设置SO_LINGER引发的异常

欢迎关注Github:https://github.com/teaey/ ### 背景 银时跟我讲,想从 Netty3迁移到Netty4 . 问其原因是因为 Netty3在容器里会报错,错误堆栈: java.io.IOException: 无法立即完成一个非阻止性套接字操作. at sun.nio.ch.SocketDispatcher.close0(Native Method) at sun.nio.ch.SocketDispatcher.preClose(SocketDispatcher.j

TCP端口复用引发的异常,用setsockopt来解决

TCP端口复用引发的异常,用setsockopt来解决 我们在并发连接一个服务端时候他会出现这种情况 OSError: [WinError 10048] 通常每个套接字地址(协议/网络地址/端口)只允许使用一次. 假如端口被socket使用过,并且利用socket.close()来关闭连接,但此时端口还没有释放,要经过一个TIME_WAIT的过程之后才能使用,这是TNN的相当烦银的,为了实现端口的马上复用,可以选择setsockopt()函数来达到. 端口复用的实现,我在这里用Python举个T

一个由IsPrime算法引发的细节问题

//******************************* // //    2014年9月18日星期四,于宿舍撰写 //    作者:夏华林 // //******************************** 好久没有没有更新博客了,最近确实烦心事儿挺多,已经大三了,真的静下心来好好看看书了. 今天要说的,就是一个由IsPrime算法引发的细节问题,我这里说的细节,是我所认为的,若有不妥,望指正! 一个简单的IsPrime算法的实现如下: 1 bool IsPrime(int

一个截取字符串函数引发的思考

背景 前些天,遇到这样一个问题,问题的内容如下: 要求编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串.但是要保证汉字不被截半个,如"我ABC", 4,截取后的效果应该为"我AB",输入"我ABC汉DEF", 6,应该输出为"我ABC",而不是"我ABC+汉的半个". 问题 刚看到这个问题的时候,以为还是很简单的,但写出来之后,发现并不是想要的效果.回想一下当时的思路,就发现刚开

往一个控制器的View添加另一个控制器的View出现的异常

往一个控制的view上添加另一个控制器的View,(由于layout缘故)可能视图会发生异常,出现伸缩(被添加视图的view变小,或者变大),所以应该设置被添加控制器的View的属性,让他不随父控件的变化而变化, 被添加控制器.view.autoresizingMask = UIViewAutoresizingNone; 往一个控制器的View添加另一个控制器的View出现的异常,布布扣,bubuko.com