Can a stack overflow be sometimes misinterpreted by the compiler as an Access violation?

耗尽温柔 提交于 2019-12-24 15:22:20

问题


I have a fortran code compiled with Intel fortran compiler 2013 and VS2010 under windows 7 that started to give me unhandled exceptions without showing the line in which the code was crashing. Usually an error like this was showing up:

Unhandled exception at 0x73e1d3d2 in GRIB2METEOriparto.exe: 0xC0000005: Access violation writing location 0x00240ef4....

and the call stack had only dbghelp.dll or verifies.dll and no source available. I moved my source files under Cygwin, I compiled with gfortran with all the possible warning/error flags on (including check bounds and implicit interfaces) and no warning at all and the program runs smoothly. All interfaces are explicit cause I am using "CONTAINS". Therefore if there was a mismatching number of arguments the debugger would catch it. No uninitialized variables are present. I went back to VS2010, I did a "clean solution" and I rebuilt the project. The code started to crash inside different C routines (that I did not write) such as:

crt0.c at the line:

mainret = _tmain(__argc, _targv, _tenviron);

or

osinfo.c at line (if I well remember):

EnterCriticalSection( &(_pioinfo(fh)->lock) );

The code was not even reaching the first line of executable code (a breakpoint there was not reached).

I started commenting some lines of code I recently added in the past days and when running the thread was finally passing successfully the few first lines and it crashed at a subroutine call with a stackoverflow error. That finally helped me understand the problem. I have a bunch of characters declared as character*2560 (both in the subroutine and in the main code). I substituted them with character*256 and it was not crashing anymore. I rewrote character*2560 and I added the flag /stack:2000000 in the link options and now everything runs smoothly. I removed the extra comments I added in those line of codes (that where calling the faulty subroutine with too many character*2560) and everything runs smoothly. I recompiled everything with gfortran in Cygwin and everything is still good. Is this normal? Am I safe now? Was initially the stack overflow error for some reason wrongly interpreted as a access violation? Is that possible?

EDIT: this is my faulty declaration in the main program (I have similar ones (but shorter) in other subroutines):

 character*2560   DOScallINV,FORMdosCALLtxt,FORMdosCALLinv,filenam,FILEinv,provSTR,FMTtimeMETEO,&
        TIMEstring,fmtGRID,fmtTIMEstring,FMTdataMETEO,WORKINGdir,path,DIRgribs,PATHgribs,&
        DIRresultsRUN,PATHoutput,previousDIR,filePATH,PATHresultsRUN,PATHinputD3D,textFILE,&
        newLINE,textFILE1,textFILE2,PATHlogs,LOGfile,LOGdir,ilineTXT,message,PATHresultsREST,&
        LastRUNfolder,PATHobs,PATHopenda,PATHresultsRUNm1,workworkWITHnum,pathSTOBS,pathSTMOD,pathALG,&
        toBEfound,COLLECTdirect,COLLECTdirectLOC,PATHwork,filePATHtot,filePATHlong,stringCAL,string,&
        pathNM,filePATH_d3model,CDstring,toBEadded,stringCALini,filePATH_d3wrapper,fileWIND,dudFILE,stringL,stringU,fileWINDcal,&
        PATHweb,pathREGR,fileWEB,PATHfileANALYSIS,threadFILE,threadFILEcopy

来源:https://stackoverflow.com/questions/36470055/can-a-stack-overflow-be-sometimes-misinterpreted-by-the-compiler-as-an-access-vi

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!