两次fopen不同的文件返回相同的FILE* 地址

    最近接触一个垃圾程序,出现一个奇怪的bug,现象是两次fopen不同的文件返回相同的FILE*地址,第二次返回的FILE*有时候无端端的就被关闭了。以下代码是对这个bug的概括:

auto fp1 = fopen("c:/1.txt", "rb");    

char buff[10];    

assert(fread(buff, 1, 10, fp1) == 10);    

// 垃圾程序关闭fp1时没有至fp1=nullptr    

fclose(fp1);

// 微软的crt对FILE*使用缓存机制,所以这里返回的fp2==fp1,可参考stream.c里的_getstream函数    

auto fp2 = fopen("c:/1.txt", "rb");

// 垃圾程序的垃圾结构引起第二次关闭fp1,事实上,这里将引起fp2的关闭    

fclose(fp1);    

// 于是垃圾程序读fp2失败    

assert(fread(buff, 1, 10, fp2) == 10);

最后,都用C++喇,谁tmd还用fopen这么古老的api,次凹!!!!

posted on 2013-07-14 16:45  rickerliang  阅读(856)  评论(2编辑  收藏  举报

导航