From c5d3403da5419a058a0813a4ec7f1f951db66bb4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Przemys=C5=82aw=20Czerpak?= Date: Wed, 29 Jan 2014 09:38:38 +0100 Subject: [PATCH] 2014-01-29 09:38 UTC+0100 Przemyslaw Czerpak (druzus/at/poczta.onet.pl) * include/harbour.hbx * src/vm/dynsym.c + added PRG function which verifies internal global symbol table structure: __dynsVerify() -> (0 => no errors detected) * include/harbour.hbx * src/vm/hvm.c + added PRG function which verifies internal module symbol tables: __vmModulesVerify() -> * include/harbour.hbx * src/vm/classes.c + added PRG function which verifies given class internal structure: __clsVerify( ) -> | NIL --- ChangeLog.txt | 17 +++++++++++++++++ include/harbour.hbx | 3 +++ src/vm/classes.c | 35 ++++++++++++++++++++++++++++++++++- src/vm/dynsym.c | 40 ++++++++++++++++++++++++++++++++++++++++ src/vm/hvm.c | 42 +++++++++++++++++++++++++++++++++++++++++- 5 files changed, 135 insertions(+), 2 deletions(-) diff --git a/ChangeLog.txt b/ChangeLog.txt index 236c24f0d6..2e87fd1146 100644 --- a/ChangeLog.txt +++ b/ChangeLog.txt @@ -10,6 +10,23 @@ * Change, ! Fix, % Optimization, + Addition, - Removal, ; Comment */ +2014-01-29 09:38 UTC+0100 Przemyslaw Czerpak (druzus/at/poczta.onet.pl) + * include/harbour.hbx + * src/vm/dynsym.c + + added PRG function which verifies internal global symbol table + structure: + __dynsVerify() -> (0 => no errors detected) + + * include/harbour.hbx + * src/vm/hvm.c + + added PRG function which verifies internal module symbol tables: + __vmModulesVerify() -> + + * include/harbour.hbx + * src/vm/classes.c + + added PRG function which verifies given class internal structure: + __clsVerify( ) -> | NIL + 2014-01-27 15:04 UTC+0100 Przemyslaw Czerpak (druzus/at/poczta.onet.pl) * src/3rd/zlib/zutil.c ! do not define dummy errno variable in WinCE builds - it's probably diff --git a/include/harbour.hbx b/include/harbour.hbx index d44428d1c4..47f11da045 100644 --- a/include/harbour.hbx +++ b/include/harbour.hbx @@ -1283,6 +1283,7 @@ DYNAMIC __clsPreallocate DYNAMIC __clsSyncSignal DYNAMIC __clsSyncWait DYNAMIC __clsUnlockDef +DYNAMIC __clsVerify DYNAMIC __cls_CntClsData DYNAMIC __cls_CntData DYNAMIC __cls_CntShrData @@ -1370,6 +1371,7 @@ DYNAMIC __dynsIsFun DYNAMIC __dynsN2Ptr DYNAMIC __dynsN2Sym DYNAMIC __dynsP2Name +DYNAMIC __dynsVerify DYNAMIC __eInstVar52 DYNAMIC __eInstVar53 DYNAMIC __Eject @@ -1499,6 +1501,7 @@ DYNAMIC __TextSave DYNAMIC __TracePrgCalls DYNAMIC __TypeFile DYNAMIC __vmItemID +DYNAMIC __vmModulesVerify DYNAMIC __vmNoInternals DYNAMIC __Wait DYNAMIC __wapi_GetACP diff --git a/src/vm/classes.c b/src/vm/classes.c index 6bf17bc184..661e892799 100644 --- a/src/vm/classes.c +++ b/src/vm/classes.c @@ -1917,7 +1917,7 @@ PHB_SYMB hb_objGetMethod( PHB_ITEM pObject, PHB_SYMB pMessage, } #else { - PMETHOD pMethod = hb_clsFindMsg( pClass, pMsg ); + PMETHOD pMethod = b_clsFindMsg( pClass, pMsg ); if( pMethod ) { pStack->uiMethod = ( HB_USHORT ) ( pMethod - pClass->pMethods ); @@ -5681,6 +5681,39 @@ void hb_clsAssociate( HB_USHORT usClassH ) } } +HB_FUNC( __CLSVERIFY ) +{ + HB_USHORT uiClass = ( HB_USHORT ) hb_parni( 1 ); + PHB_ITEM pReturn = hb_itemNew( NULL ); + + if( uiClass && uiClass <= s_uiClasses ) + { + PCLASS pClass = s_pClasses[ uiClass ]; + PMETHOD pMethod = pClass->pMethods; + HB_SIZE nLimit = hb_clsMthNum( pClass ), nPos = 0; + + hb_arrayNew( pReturn, pClass->uiMethods ); + do + { + if( pMethod->pMessage ) + { + PHB_DYNS pDynSym = hb_dynsymFind( pMethod->pMessage->pSymbol->szName ); + + if( pMethod->pMessage != pDynSym || + hb_clsFindMsg( pClass, pDynSym ) != pMethod ) + hb_arraySetC( pReturn, ++nPos, pMethod->pMessage->pSymbol->szName ); + } + ++pMethod; + } + while( --nLimit ); + + if( nPos < ( HB_SIZE ) pClass->uiMethods ) + hb_arraySize( pReturn, nPos ); + } + + hb_itemReturnRelease( pReturn ); +} + #if 0 /* * return real function name ignoring aliasing diff --git a/src/vm/dynsym.c b/src/vm/dynsym.c index c7ba269e8b..97407a33bd 100644 --- a/src/vm/dynsym.c +++ b/src/vm/dynsym.c @@ -772,3 +772,43 @@ HB_FUNC( __DYNSP2NAME ) hb_retc( pDynSym != NULL ? pDynSym->pSymbol->szName : NULL ); } + +/* internal function used to debug dynamic symbol integrity */ +static int hb_dynsymVerify( void ) +{ + HB_USHORT uiPos = 0; + int iResult = 0; + + HB_TRACE( HB_TR_DEBUG, ( "hb_dynsymVerify()" ) ); + + HB_DYNSYM_LOCK(); + + while( iResult == 0 && uiPos < s_uiDynSymbols ) + { + PHB_DYNS pDynSym = s_pDynItems[ uiPos ].pDynSym; + HB_UINT uiAt; + int iCmp; + + if( uiPos > 0 && + ( iCmp = strcmp( s_pDynItems[ uiPos - 1 ].pDynSym->pSymbol->szName, + pDynSym->pSymbol->szName ) ) <= 0 ) + iResult = iCmp == 0 ? -1 : -2; + else if( hb_dynsymPos( pDynSym->pSymbol->szName, &uiAt ) != pDynSym ) + iResult = -3; + else if( uiAt != uiPos ) + iResult = -4; + else + ++uiPos; + } + + HB_DYNSYM_UNLOCK(); + + return iResult; +} + +HB_FUNC( __DYNSVERIFY ) +{ + HB_STACK_TLS_PRELOAD + + hb_retni( hb_dynsymVerify() ); +} diff --git a/src/vm/hvm.c b/src/vm/hvm.c index 39c00469b7..78246bdeaf 100644 --- a/src/vm/hvm.c +++ b/src/vm/hvm.c @@ -8008,6 +8008,40 @@ PHB_SYMBOLS hb_vmRegisterSymbols( PHB_SYMB pModuleSymbols, HB_USHORT uiSymbols, return pNewSymbols; } +static void hb_vmVerifySymbols( PHB_ITEM pArray ) +{ + PHB_SYMBOLS pLastSymbols = s_pSymbols; + PHB_ITEM pItem = NULL; + + HB_TRACE( HB_TR_DEBUG, ( "hb_vmVerifySymbols(%p)", pArray ) ); + + hb_arrayNew( pArray, 0 ); + + while( pLastSymbols ) + { + HB_USHORT ui, uiSymbols = pLastSymbols->uiModuleSymbols; + + for( ui = 0; ui < uiSymbols; ++ui ) + { + PHB_SYMB pSym = pLastSymbols->pModuleSymbols + ui; + + if( pSym->pDynSym && + hb_dynsymFind( pSym->szName ) != pSym->pDynSym ) + { + char szText[ 256 ]; + + hb_snprintf( szText, sizeof( szText ), "%s->%s", + pLastSymbols->szModuleName, pSym->szName ); + pItem = hb_itemPutC( pItem, szText ); + hb_arrayAddForward( pArray, pItem ); + } + } + pLastSymbols = pLastSymbols->pNext; + } + if( pItem ) + hb_itemRelease( pItem ); +} + static void hb_vmVerifyPCodeVersion( const char * szModuleName, HB_USHORT uiPCodeVer ) { if( uiPCodeVer != 0 ) @@ -8023,7 +8057,6 @@ static void hb_vmVerifyPCodeVersion( const char * szModuleName, HB_USHORT uiPCod "Please recompile.", szModuleName, szPCode ); } } - } /* @@ -12138,6 +12171,13 @@ HB_FUNC( __VMITEMID ) } } +HB_FUNC( __VMMODULESVERIFY ) +{ + HB_STACK_TLS_PRELOAD + + hb_vmVerifySymbols( hb_stackReturnItem() ); +} + HB_FUNC( HB_ARRAYTOPARAMS ) { HB_STACK_TLS_PRELOAD