zoukankan      html  css  js  c++  java
  • 一个不当使用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
    ",fp);
        if (fp == NULL)
        {
            printf("Open file failed.
    ");
        }
        else
        {
            printf("Open file succeed.
    ");
        }
        fclose(fp);//这里将引发异常
    }

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

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

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

  • 相关阅读:
    ADO.NET 核心对象简介
    ASP.net 内置对象
    行内元素,块级元素与空元素
    ASP.net 常用服务器控件
    javaScript 基础知识
    点击超链接 唤醒企鹅添加好友代码
    使用CSS画出三角形
    NGUI实现的一套不同大小 Item 的循环滚动代码
    xlua怎么样hotfix C#中的重写方法???
    C# ---- GC中代的递增规律
  • 原文地址:https://www.cnblogs.com/achillis/p/5188912.html
Copyright © 2011-2022 走看看