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

摘要:
昨天刚好有空,现场抓了一下dump,再把程序扔到IDA里看了一下,很快就找出原因了,原来是调用fclose时出错的。使用C的Runtime函数进行文件操作,也就是fopen,fread,ftell,fclose这些,本身这并没有什么问题但是出现异常的位置往上一点,程序写了日志,主要内容是“打开文件失败,错误原因:xxxxxx”也就是说,在使用fopen打开文件失败了之后,程序仍然使用了fclose来关闭这个无效的FILE指针,导致了异常的发生。

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

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

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

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

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

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

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

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

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

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

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

免责声明:文章转载自《一个不当使用fclose引发的异常》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇halcon之扫描文档祛底色微信小程序之底部菜单actionsheet下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

使用curses管理基于文本的屏幕--(八)

CD管理程序现在我们已经了解了curses所提供了功能,我们可以继续开发我们的例子程序。在这里所展示是一个使用curses库的C语言版本。他提供了一些高级的特性,包括更为清晰的屏幕信息显示以及用于跟踪列表的滚动窗口。完整的程序共页长,所以我们将其分为几部分,在每一部分中介绍一些函数。试验--一个新的CD管理程序1 首先,我们包含所有的头文件以及一些全局常量...

matlab文件操作

matlab文件操作 1、文件的打开与关闭(fopen与fclose) 1)打开文件 在读写文件之前,必须先用fopen函数打开或创建文件,并指定对该文件进行的操作方式。fopen函数的调用格式为: fid=fopen(文件名,“打开方式”) 说明:其中fid用于存储文件句柄值,如果返回的句柄值大于0,则说明文件打开成功。 文件名用字符串形式,表示待打开的...

fopen,fwrite,fread使用

fopen, fwrite, fread详解 1、头文件 #include <stdio.h> 2、fopen (1) 函数原型 FILE *fopen(char *filename, *type) 函数用来打开一个文件 (2) 参数解析 filename,文件名 type,打开方式   字符及其含义:   打开方式由r,w,a,t,b...

【Linux C中文函数手册】文件内容控制函数

文件内容控制函数 1)clearerr 清除文件流的错误旗标 相关函数 feof表头文件 #include<stdio.h>定义函数 void clearerr(FILE * stream);函数说明 clearerr()清除参数stream指定的文件流所使用的错误标识。 2)fclose 关闭文件 相关函数 close,fflush,fope...

PHP文本的读写

1 <?php 2 $txtPart="test0.txt"; //export 3 $txtPartContent=fopen($txtPart,"r"); //读文件,返回TRUE,FALSE 4 if($txtPartContent){ //若文件存在继续 5 while(!fe...

fopen()函数

1.2 文件的输入输出函数 键盘、显示器、打印机、磁盘驱动器等逻辑设备, 其输入输出都能够通过文件管理的方法来完毕。而在编程时使用最多的要算是磁盘文件, 因此本节主要以磁盘文件为主, 具体介绍Turbo C2.0提供的文件操作函数, 当然这些对文件的操作函数也适合于非磁盘文件的情况。 另外, Turbo C2.0提供了两类关于文件的函...