| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1374 人关注过本帖
标题:0x5F2DEB12(msvcr110.dll)中有未经处理的异常
只看楼主 加入收藏
lyl930130
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:323
专家分:111
注 册:2013-5-13
结帖率:91.43%
收藏
已结贴  问题点数:20 回复次数:8 
0x5F2DEB12(msvcr110.dll)中有未经处理的异常
0x5F2DEB12(msvcr110.dll)中有未经处理的异常:0xC0000005:读取位置***时发生访问冲突。

写了一个处理数据的代码,对同一个数据文件进行处理,大概率(10次有7、8次)出现这个错误,小概率(10次里有2、3次)能出正确结果。

不明白是不是程序有问题。如果有问题为什么对同一个文件进行处理的时候又能出结果?
2017-04-10 11:03
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:0 
是不是动态分配资源没处理好
2017-04-10 11:29
lyl930130
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:323
专家分:111
注 册:2013-5-13
收藏
得分:0 
回复 2楼 吹水佬
没有用到动态分布资源,用的都是数组,但是指针来来回回比较多。
2017-04-10 11:43
邹特强
Rank: 2
等 级:论坛游民
帖 子:123
专家分:85
注 册:2016-9-21
收藏
得分:0 
回复 楼主 lyl930130
能把代码贴出来吗?要不然都是空谈啊

............
2017-04-10 12:50
lyl930130
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:323
专家分:111
注 册:2013-5-13
收藏
得分:0 
回复 4楼 邹特强
代码如下,因为是在局域网,只能手敲过来,数据也没法测试,还麻烦将就看看。

程序代码:
#define BUFSIZE 64
char * memstr(char *data_1, char *data_2, int len_1, int len_2);

int main()
{
    FILE *fp_list, *fpr, *fpw;
    int i, ret, pre, flag_data_now, flag_data_pre, flag_data_next, flag_temp;
    char Cmd[BUFSIZE], fname[BUFSIZ], Data[3][BUFSIZE], Data_temp[BUFSIZE*2];
    char *p_c_temp1, *p_c_temp2, *p_c_begin, *p_c_end;
    

    memset(Cmd, 0, sizeof(Cmd));
    memset(Data, 0, sizeof(Data));
    if((fp_list = fopen("pcap.lst", "r"))==NULL) return 0;

    while(1)
    {
        memset(fname, 0, sizeof(fname));
        if(fscanf(fp_list, "%s", fname)==EOF)
            break;

        if((fpr=fopen(fname, "rb"))==NULL)
            continue;

        sprintf(Cmd, "%s.new", fname);
        if((fpw = fopen(Cmd, "wb"))==NULL) 
        {
            fclose(fpr);
            continue;
        }

        flag_data_now = 0;
        ret = fread(Data[1], 1, BUFSIZE, fpr);
        pre = 0;
        p_c_temp2 = NULL;
        while(1)
        {
            if(ret < BUFSIZE)
                break;

            flag_data_now = (flag_data_now+1)%3;
            flag_data_next = (flag_data_now+1)%3;
            flag_data_pre = (flag_data_now+2)%3;
            ret = fread(Data[flag_data_next], 1, BUFSIZE, fpr);
            pre++;

            flag_temp = 0;
            p_c_temp1 = (char *)memchr(Data[flag_data_now],0xab,BUFSIZE);
            p_c_temp2 = Data[flag_data_now];
            while(p_c_temp1 != NULL)
            {
                if(p_c_temp1-p_c_temp2 > 1)
                {
                    fwrite(p_c_temp2, 1, p_c_temp1-p_c_temp2-1, fpw);
                    p_c_temp2 = p_c_temp1-1;
                }

                if(p_c_temp1 == Data[flag_data_now])
                {
                    if((pre==1) || (pre>1 && ((Data[flag_data_pre][BUFSIZE-1]&0xf0) != 0x10)))
                        fwrite(p_c_temp2, 1, p_c_temp1-p_c_temp2+1, fpw);
                }
                else
                {
                    if(((*(p_c_temp1-1))&0xf0) != 0x10)
                        fwrite(p_c_temp2, 1, p_c_temp1-p_c_temp2+1, fpw);
                    else
                    {
                        int temp = p_c_temp1-Data[flag_data_now];
                        if(temp>2 && temp<(BUFSIZE-2))
                            if(((*(p_c_temp1+2)&0xff)!=0xab) && ((*(p_c_temp1-2_&0xff)!=0xab))
                                fwrite(p_c_temp2, 1, p_c_temp1-p_c_temp2+1, fpw);
                    }
                }

                if(p_c_temp1 == &Data[flag_data_now][BUFSIZE-1])
                {
                    flag_temp++;
                    break;
                }
                else if(p_c_temp1 == &Data[flag_data_now][BUFSIZE-2])
                {
                    if(((Data[flag_data_now][BUFSIZE-1]&0xf0)!=0x10) || (Data[flag_data_next][0]&0xff!=0xab))
                        fwrite(p_c_temp1+1, 1, 1, fpw);
                    flag_temp++;
                    break;
                }

                p_c_temp2 = p_c_temp1+1;
                p_c_temp1 = (char *)memchr(p_c_temp2, 0xab, BUFSIZE-(p_c_temp1-Data[flag_data_now]) );

            }
            if(flag_temp==0)
                fwrite(p_c_temp2, 1, BUFSIZE-(p_c_temp2-Data[flag_data_now]), fpw);

        }
        fflush(fpw);
        fclose(fpr);
        fclose(fpw);
    }
    
    return 0;
}

char * memstr(char *data_1, char *data_2, int len_1, int len_2)
{
    int i,j,k=0;
    for(i=0; i<len_1-len_2; i++)
    {
        if(data_1[i]==data_2[0])
            for(j=0; j<len_2; j++)
                if(data_1[i+j]!=data_2[j])
                    break;
        if(j==len_2)
            return data_1+i;
    }
    return NULL;
}
2017-04-10 16:29
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:20 
以下是引用lyl930130在2017-4-10 11:43:02的发言:

没有用到动态分布资源,用的都是数组,但是指针来来回回比较多。

观测一下数组下标(或指针),看看有无越界。数组下标过界的区域刚好也是正在使用的区域时就有可能发生读写冲突。
2017-04-10 20:35
lyl930130
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:323
专家分:111
注 册:2013-5-13
收藏
得分:0 
回复 6楼 吹水佬
又看了一遍,目前还没看出问题。
但是我理解,对同一份数据进行处理,如果数组越界的话,出错的话应该是在同一个地方,但是出错的位置都是不一样的(也会有一样的),来回反复试,还有不出错直接出结果的。这个没想明白,不知道怎么定位错误。
2017-04-11 10:47
lyl930130
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:323
专家分:111
注 册:2013-5-13
收藏
得分:0 
回复 6楼 吹水佬
全删了重写了一遍,这次都过了。
应该是哪里有指针搞错了,但是实在找不出来。

不过还是不明白,既然指针有问题,对同样的数据进行调试的时候,不应该每次都在同一个地方出错吗?
2017-04-11 21:32
lmlm1001
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:4
帖 子:107
专家分:550
注 册:2015-3-1
收藏
得分:0 
第一个fscanf和第一个sprintf可能会越过数组边界,可以先看下对应的数据长度是否过长。
其次你的fclose不密封。
你在声明之后打印一下变量的地址,可以提供出错点的参考
2017-04-11 21:56
快速回复:0x5F2DEB12(msvcr110.dll)中有未经处理的异常
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.039111 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved