Article View: gnu.gcc.bug
Article #994gcc 2.2.2 w/-O4 corrupts diff-1.15
From: Daniel I. Rosenblatt
Date: Tue, 25 Aug 1992 04:31
Date: Tue, 25 Aug 1992 04:31
336 lines
14849 bytes
14849 bytes
I've got a Sun 4/670 running SunOS 4.1.2
gcc 2.2.2 was built with 'configure sparc'.
Compiling diff-1.15 with gcc 2.2.2 and -O4 will, with certain input files to
diff, cause diff to core dump. Recompiling the module analyze.c without
optimization or with only simple optimization (-O) corrects the problem. Here
is a terminal session showing the problem (including the diff input files):
----------------------------------------------------------------------
Script started on Tue Aug 25 10:19:30 1992
kmongo_jr% gdiff x y >/dev/null
kmongo_jr% bdiff x y >/dev/null
Segmentation fault (core dumped)
kmongo_jr% gdb bdiff core
GDB is free software and you are welcome to distribute copies of it
under certain conditions; type "show copying" to see the conditions.
There is absolutely no warranty for GDB; type "show warranty" for details.
GDB 4.6, Copyright 1992 Free Software Foundation, Inc...
Core was generated by `bdiff'.
Program terminated with signal 11, Segmentation fault.
#0 0x38f4 in diag (xoff=7, xlim=22, yoff=7, ylim=26, cost=0xf7fff7dc)
at analyze.c:93
93 bd[bmid] = xlim;
(gdb) where
#0 0x38f4 in diag (xoff=7, xlim=22, yoff=7, ylim=26, cost=0xf7fff7dc)
at analyze.c:93
#1 0x3fdc in compareseq (xoff=7, xlim=22, yoff=7, ylim=26) at analyze.c:266
#2 0x401c in compareseq (xoff=7, xlim=73, yoff=7, ylim=82) at analyze.c:289
#3 0x4b50 in diff_2_files (filevec=0xf7fff970, depth=0) at analyze.c:792
#4 0x37a8 in compare_files (dir0=0x0, name0=0xf7fffbee "x", dir1=0x0,
name1=0xf7fffbf0 "y", depth=0) at diff.c:664
#5 0x2c54 in main (argc=3, argv=0xf7fffb9c) at diff.c:392
(gdb) quit
kmongo_jr% cat x
int MRHierarchyMgr::GetNextPage( MRPageReqPtr curPageInfo )
{
int retVal = FALSE; /* return value */
long lastPage = -1, /* last page of file */
nextFile = -1, /* id of next file in order */
nextFileView = -1, /* if of view for nextFile */
nextFileDoc = -1; /* id of doc for nextFile */
{
/* get the sequence number of the last page in the cur page's file */
if( ( lastPage = GetFileLastPageNum( curTocParent, curPageInfo->fileId,
curPageInfo->docId ) ) == -1 )
LogError( "GetFileLastPageNum failed in MRHierarchyMgr::GetNextPage",
NULL, 0, USER_ERROR );
/* if at end of file, find the next file */
else if( ( ( curPageInfo->pageSeq + 1 ) > lastPage ) &&
!FindNextFile( curTocParent, curPageInfo->fileId,
curPageInfo->docId, curPageInfo->viewId,
&nextFile, &nextFileDoc, &nextFileView ) )
LogError( "FindNextFile failed in MRHierarchyMgr::GetNextPage",
NULL, 0, USER_ERROR );
/* get the next page if there is one */
else
{
/* at end of file and no more files, tell the gui */
if( ( ( curPageInfo->pageSeq + 1 ) > lastPage ) &&
( nextFile == -1 ) )
{
if( !AsyncSendToObjs( DMPMSG_OBJ_TO_OBJ_MSG,
DMPMSG_NUM_NO_MORE_PAGES,
(void *)NULL, 0 ) )
LogError( "AsyncSendToObjs failed in MRHierMgr::GetNextPage",
NULL, 0, USER_ERROR );
else
retVal = TRUE;
}
/* is a page, so get it */
else
{
/* if new file, load the new file and doc into the structure */
if( ( curPageInfo->pageSeq + 1 ) > lastPage )
{
curPageInfo->fileId = nextFile;
curPageInfo->docId = nextFileDoc;
curPageInfo->viewId = nextFileView;
curPageInfo->pageSeq = 1;
}
/* if same file, increment sequence */
else
curPageInfo->pageSeq++;
/* set defaults */
curPageInfo->rotation = defaultRotation;
curPageInfo->scale = defaultScale;
curPageInfo->screenWid = defaultScreenWid;
curPageInfo->screenHt = defaultScreenHt;
curPageInfo->printFlg = FALSE;
curPageInfo->hiWords = NULL;
curPageInfo->numHiWords = 0;
if( curPageInfo->pagePath )
{
delete curPageInfo->pagePath;
curPageInfo->pagePath = NULL;
}
/* get the toc index for the page & add it to the page structure */
if( !AddPageTocIndex( curPageInfo ) )
LogError( "AddPageTocIndex failed in MRHierMgr::GetNextPage",
NULL, 0, USER_ERROR );
/* add the path to the page */
else if( !BuildPagePath( curPageInfo ) )
LogError( "BuildPagePath failed in MRHierMgr::GetNextPage",
NULL, 0, USER_ERROR );
/* add the descr and get the page */
else
{
strncpy( curPageInfo->pageDescr,
mrHierList[ curPageInfo->hierIndex ].
toc[ curPageInfo->tocIndex ].descr,
MR_HIER_MAX_STRING_SIZE - 1 );
curPageInfo->pageDescr[ MR_HIER_MAX_STRING_SIZE - 1 ] = '\0';
/* send the page request */
if( !SendToObjs( DMPMSG_OBJ_TO_OBJ_MSG, DMPMSG_NUM_GET_PAGE,
(void *)curPageInfo, sizeof( MRPageReqRec ),
FALSE ) )
LogError( "SendToObjs failed in MRHierMgr::GetNextPage",
NULL, 0, USER_ERROR );
else
retVal = TRUE;
} /* end else add the descr and get the page */
} /* end else is a page, so get it */
} /* end else get the next page if there is one */
} /* end if the current TOC matches the page requested */
/* if the current TOC does not match the page's go request it */
else
/* end else the current TOC does not match */
return retVal;
} /* end GetNextPage */
kmongo_jr% cat y
int MRHierarchyMgr::GetNextPage( MRPageReqPtr curPageInfo )
{
char buf[256]; /* message buffer for errors */
int pagesLeft = 0; /* number pages actually avail */
int error = FALSE; /* denotes an error in paging */
int reqPageOffset = 0; /* compute page offset to get */
int retVal = FALSE; /* return value */
long lastPage = -1, /* last page of file */
nextFile = -1, /* id of next file in order */
nextFileView = -1, /* id of view for nextFile */
nextFileDoc = -1, /* id of doc for nextFile */
rtnNextFile = -1, /* rtn'd file id */
rtnNextFileView = -1, /* rtn'd view id */
rtnNextFileDoc = -1; /* rtn'd doc id */
{
/* grab the number of pages requested */
reqPageOffset = curPageInfo->pageOffset;
/* get the sequence number of the last page in the cur page's file */
if( ( lastPage = GetFileLastPageNum( curTocParent, curPageInfo->fileId,
curPageInfo->docId ) ) == -1 )
LogError( "GetFileLastPageNum failed in MRHierarchyMgr::GetNextPage",
NULL, 0, USER_ERROR );
else
{
/* if the requested page is not in the current file, try to */
/* page through and find the appropriate file */
if( ( curPageInfo->pageSeq + reqPageOffset ) > lastPage )
{
nextFile = curPageInfo->fileId;
nextFileDoc = curPageInfo->docId;
nextFileView = curPageInfo->viewId;
do
{
/* if we are on the first file, then subtract off number */
/* of pages remaining, otherwise subtract number of pages */
/* in the file */
if( nextFile == curPageInfo->fileId )
{
reqPageOffset -= (int) lastPage - curPageInfo->pageSeq;
pagesLeft = (int) lastPage - curPageInfo->pageSeq;
}
else
{
reqPageOffset -= (int) lastPage;
pagesLeft += (int) lastPage;
}
/* go get the next file */
if( ( !FindNextFile( curTocParent, nextFile,
nextFileDoc, nextFileView, &rtnNextFile,
&rtnNextFileDoc, &rtnNextFileView ) ) ||
( rtnNextFile == -1 ) )
{
error = TRUE;
}
/* find out how many pages in next file */
else if( ( lastPage = GetFileLastPageNum( curTocParent,
rtnNextFile, rtnNextFileDoc ) ) == -1 )
{
error = TRUE;
}
nextFile = rtnNextFile;
nextFileDoc = rtnNextFileDoc;
nextFileView = rtnNextFileView;
}
/* Add 1 to test for last page in case seq number was a zero. */
/* If requested page in this file or if there was an error, */
/* we're done, else keep trying to find the file */
while( ( reqPageOffset >= lastPage + 1 ) && ( !error ) );
/* if there was an error (including if there were not enough */
/* pages to satisfy the request) send a msg and display warning */
if( error )
{
if( !AsyncSendToObjs( DMPMSG_OBJ_TO_OBJ_MSG,
DMPMSG_NUM_NO_MORE_PAGES,
(void *)NULL, 0 ) )
LogError( "AsyncSendToObjs failed in MRHierMgr::GetNextPage",
NULL, 0, USER_ERROR );
else
{
if( pagesLeft <= 0 )
sprintf( buf, "There are no more pages available.\n" );
else if( pagesLeft == 1 )
sprintf( buf, "There is only one more page available.\n" );
else
sprintf( buf, "There are only %d more pages available.\n",
pagesLeft );
if ( !AsyncSendToObjs( DMPMSG_OBJ_TO_OBJ_MSG,
DMPMSG_NUM_DISPLAY_WARNING,
buf, strlen( buf ) + 1 ) )
LogError( "AsyncSendToObjs failed in MRHierMgr::GetNextPg",
NULL, 0, USER_ERROR );
else
retVal = TRUE;
}
}
else
{
/* save info about file we want to retrieve the requested page */
curPageInfo->fileId = rtnNextFile;
curPageInfo->docId = rtnNextFileDoc;
curPageInfo->viewId = rtnNextFileView;
curPageInfo->pageSeq = reqPageOffset;
}
}
/* else the page is in the current file, increment sequence */
else
curPageInfo->pageSeq += reqPageOffset;
/* if there were no errors, go make the page request */
if( !error )
{
/* set defaults */
curPageInfo->rotation = defaultRotation;
curPageInfo->scale = defaultScale;
curPageInfo->screenWid = defaultScreenWid;
curPageInfo->screenHt = defaultScreenHt;
curPageInfo->printFlg = FALSE;
curPageInfo->hiWords = NULL;
curPageInfo->numHiWords = 0;
if( curPageInfo->pagePath )
{
delete curPageInfo->pagePath;
curPageInfo->pagePath = NULL;
}
/* get the toc index for the page & add it to the page structure */
if( !AddPageTocIndex( curPageInfo ) )
LogError( "AddPageTocIndex failed in MRHierMgr::GetNextPage",
NULL, 0, USER_ERROR );
/* add the path to the page */
else if( !BuildPagePath( curPageInfo ) )
LogError( "BuildPagePath failed in MRHierMgr::GetNextPage",
NULL, 0, USER_ERROR );
/* add the descr and get the page */
else
{
strncpy( curPageInfo->pageDescr,
mrHierList[ curPageInfo->hierIndex ].
toc[ curPageInfo->tocIndex ].descr,
MR_HIER_MAX_STRING_SIZE - 1 );
curPageInfo->pageDescr[ MR_HIER_MAX_STRING_SIZE - 1 ] = '\0';
/* send the page request */
if( !SendToObjs( DMPMSG_OBJ_TO_OBJ_MSG, DMPMSG_NUM_GET_PAGE,
(void *)curPageInfo, sizeof( MRPageReqRec ),
FALSE ) )
LogError( "SendToObjs failed in MRHierMgr::GetNextPage",
NULL, 0, USER_ERROR );
else
retVal = TRUE;
} /* end else add the descr and get the page */
} /* if there were no errors */
} /* we were able to determine end of current file */
} /* end if the current TOC matches the page requested */
/* if the current TOC does not match the page's go request it */
else
/* end else the current TOC does not match */
return retVal;
} /* end GetNextPage */
kmongo_jr% exit
script done on Tue Aug 25 10:24:11 1992
I can be reached at
dir@lookout.uswest.com
303/595-2854
Technical Details
Message-ID:
<199208251631.AA09439@lookout.it.uswc.uswest.com>Path:
arc1-ca.pugleaf.net!sparky!uunet!stanford.edu!ames!uakari.primate.wisc.edu!zaphod.mps.ohio-state.edu!cis.ohio-state.edu!lookout.IT.USwc.USwest.COM!dirShow Full Headers
Complete Article Headers
Path: arc1-ca.pugleaf.net!sparky!uunet!stanford.edu!ames!uakari.primate.wisc.edu!zaphod.mps.ohio-state.edu!cis.ohio-state.edu!lookout.IT.USwc.USwest.COM!dir From: dir@lookout.IT.USwc.USwest.COM (Daniel I. Rosenblatt) Newsgroups: gnu.gcc.bug Subject: gcc 2.2.2 w/-O4 corrupts diff-1.15 Message-ID: <199208251631.AA09439@lookout.it.uswc.uswest.com> Date: 25 Aug 92 04:31:18 GMT Sender: gnulists@ai.mit.edu Distribution: gnu Organization: GNUs Not Usenet Lines: 336 Approved: bug-gcc@prep.ai.mit.edu