diff --git a/manifest b/manifest index 8ee480c9c2..511fa74c21 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sminor\sproblems\sin\sthe\stest\sscripts\sand\sharness.\s(CVS\s5394) -D 2008-07-11T13:53:55 +C Additional\stest\scoverage\sfor\sthe\sbtree\smodule.\s\sRemove\sthe\sfailsafe()\smacro\nand\sreplace\sit\swith\sALWAYS()\sand\sNEVER().\s(CVS\s5395) +D 2008-07-11T16:15:18 F Makefile.arm-wince-mingw32ce-gcc fcd5e9cd67fe88836360bb4f9ef4cb7f8e2fb5a0 F Makefile.in a03f7cb4f7ad50bc53a788c6c544430e81f95de4 F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654 @@ -95,8 +95,8 @@ F src/attach.c b18ba42c77f7d3941f5d23d2ca20fa1d841a4e91 F src/auth.c c8b2ab5c8bad4bd90ed7c294694f48269162c627 F src/bitvec.c 95c86bd18d8fedf0533f5af196192546e10a7e7d F src/btmutex.c 483ced3c52205b04b97df69161fadbf87f4f1ea2 -F src/btree.c 6ec7584e5f61f2215cec8504ac6d330f1aa6765b -F src/btree.h 9373128fbd6509a281e0d356cb15f9cffbfa876c +F src/btree.c 881d5eb6ec2a80421690537e68e63a91644bf3ef +F src/btree.h 0063e9853aa1ffb55b46f0e798eea8934f032ffd F src/btreeInt.h d59e58d39950a17c0fb7e004c90ab7696d3e7df5 F src/build.c bac7233d984be3805aaa41cf500f7ee12dc97249 F src/callback.c aa492a0ad8c2d454edff9fb8a57fae13743cf71d @@ -114,7 +114,7 @@ F src/insert.c e8efc17d037346e4a4a6949e72aab850befe3d5d F src/journal.c cffd2cd214e58c0e99c3ff632b3bee6c7cbb260e F src/legacy.c 3626c71fb70912abec9a4312beba753a9ce800df F src/loadext.c ae0eed9fa96d74172d2a90ee63b5bc36d284295c -F src/main.c ff7d9e39d014cc36246c334f6076e44e20db45ca +F src/main.c 453d54b33799bfa0adfdf8a97a196521f9d9e962 F src/malloc.c 226a532e9e371d1bb3de2553bdd1f9b600ef099c F src/md5.c 008216bbb5d34c6fbab5357aa68575ad8a31516a F src/mem1.c 8340fa5f969e9f9b9bdeb54106457a2003456d2b @@ -142,11 +142,11 @@ F src/printf.c 8e5d410220cf8650f502caf71f0de979a3f9031e F src/random.c 5c754319d38abdd6acd74601ee0105504adc508a F src/select.c fcf51df1818a448edebf55b032d89771ba4536ef F src/shell.c 484e7297e066f22830f9c15d7abbcdd2acb097b0 -F src/sqlite.h.in 8d25645bc8aee60e3089d05f3dbb8f66d1af0cd5 +F src/sqlite.h.in a573ab3a22256fc6c28b8f27d5af446f2b712a31 F src/sqlite3ext.h 1e3887c9bd3ae66cb599e922824b04cd0d0f2c3e -F src/sqliteInt.h ca0dc923bcc51bef0064f34628bd6daeb0d68d38 +F src/sqliteInt.h 83181862609629e04b99ae8087b46a7c9dcde7af F src/sqliteLimit.h f435e728c6b620ef7312814d660a81f9356eb5c8 -F src/status.c b8d7b1f6b518e71986dfa65058de7a714efd61be +F src/status.c 2076bc996618b1a112a797f05c1d62026ae01402 F src/table.c 22744786199c9195720c15a7a42cb97b2e2728d8 F src/tclsqlite.c ec46084184f033ba396a9ee7b5514b695083d0f3 F src/test1.c 30bdb22f911efd492c4f49565eae014330231ece @@ -166,7 +166,7 @@ F src/test_devsym.c 6012cb8e3acf812513511025a4fa5d626e0ba19b F src/test_func.c ade4f0117cc96c5a05682e1ef38b84320a866ad9 F src/test_hexio.c 2f1122aa3f012fa0142ee3c36ce5c902a70cd12f F src/test_loadext.c df8ab3a6481ddebbdf0d28ebac5d9e0790f7860f -F src/test_malloc.c 4f07302a0077f2c1730baa7aeb359e4f51960aa7 +F src/test_malloc.c e655e3ff61845fc23886ee81973638e795477c9e F src/test_md5.c 28209a4e2068711b5443c33104fe41f21d160071 F src/test_mutex.c 86a937f5d28f373b8495faf1347a9d0a306594d4 F src/test_onefile.c 243157b10275251c5dc2d6619aee2ff9ae22379c @@ -179,18 +179,18 @@ F src/tokenize.c b5fdc79fb7e00077b9c02af7a0da3b89c9f3398e F src/trigger.c bdb56bb9db1a7b18f8505484051221ab5123f21d F src/update.c 4e698fcc0c91c241a960304c4236dc3a49603155 F src/utf.c 8d52f620a7153d90b058502124fe51d821fcdf57 -F src/util.c 06dbffe992bfc69dd8e4462a6baf9528b706fa17 +F src/util.c 172ebad4eb14eada6e2e1d0e202765b0e97905e4 F src/vacuum.c ef342828002debc97514617af3424aea8ef8522c F src/vdbe.c 14d98d1d47041a99a9c98034842772dbbcc062fb F src/vdbe.h c46155c221418bea29ee3a749d5950fcf85a70e2 F src/vdbeInt.h 30535c1d30ba1b5fb58d8f0e1d1261af976558aa F src/vdbeapi.c a7c6b8db324cf7eccff32de871dea36aa305c994 -F src/vdbeaux.c 734d27d1e18bb4fb3c7f94d499039a8d3bbf8407 +F src/vdbeaux.c 24ecae4e3e7ebcfb604d6ef0dc268da2cfb3ffa7 F src/vdbeblob.c a20fe9345062b1a1b4cc187dc5fad45c9414033b F src/vdbefifo.c c46dae1194e4277bf007144d7e5b0c0b1c24f136 F src/vdbemem.c 0c72b58ffd759676ce4829f42bacb83842a58c21 F src/vtab.c 2096c03ec5540a43c8c73a8f43407dfd3549a982 -F src/where.c 3324f8273a9c40d4b04b65cdef0a8c4954c1cce6 +F src/where.c 087bfd37580cd1b289f534d5727630b247b00ba3 F tclinstaller.tcl 4356d9d94d2b5ed5e68f9f0c80c4df3048dd7617 F test/aggerror.test a867e273ef9e3d7919f03ef4f0e8c0d2767944f2 F test/all.test ed6849e7a425620d5d4388409f3b15901b5bc2e7 @@ -483,7 +483,7 @@ F test/tableapi.test 892208d49e7be4817a4d3e4f641dbcbbee8cd03c F test/tclsqlite.test aa1781808502271feccfd24f9e2c0d2c1d7c496a F test/tempdb.test b88ac8a19823cf771d742bf61eef93ef337c06b1 F test/temptable.test 19b851b9e3e64d91e9867619b2a3f5fffee6e125 -F test/tester.tcl fbb53d7a92ab9156cf123a2dd47528a22c649860 +F test/tester.tcl 3a121e1a03b29376057b3dfff429ad4f373cd0c3 F test/thread001.test 8fbd9559da0bbdc273e00318c7fd66c162020af7 F test/thread002.test 2c4ad2c386f60f6fe268cd91c769ee35b3c1fd0b F test/thread1.test 776c9e459b75ba905193b351926ac4019b049f35 @@ -603,7 +603,7 @@ F tool/speedtest16.c c8a9c793df96db7e4933f0852abb7a03d48f2e81 F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff F tool/speedtest8.c 1dbced29de5f59ba2ebf877edcadf171540374d1 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e -P c45d578e4475486dc5df1c1c0b6987d1cef39188 -R fcf7cc9c66cbbb6fac0990a081db5c0e +P c9ffbfe343b640051161301869698dd9f1f76cb7 +R e52a0e0f0e545d82edca5fee51f0391a U drh -Z a83f4b571a6e380574d50c852424d70b +Z 3dba639b9a1f25eb1dff3dc290a1617a diff --git a/manifest.uuid b/manifest.uuid index ef930fc21f..1701936059 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c9ffbfe343b640051161301869698dd9f1f76cb7 \ No newline at end of file +d7e2f0d2d45574d6191c1b191c0daf5260696f27 \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index dab5c64b1e..cdff148c6d 100644 --- a/src/btree.c +++ b/src/btree.c @@ -9,7 +9,7 @@ ** May you share freely, never taking more than you give. ** ************************************************************************* -** $Id: btree.c,v 1.478 2008/07/11 03:38:41 drh Exp $ +** $Id: btree.c,v 1.479 2008/07/11 16:15:18 drh Exp $ ** ** This file implements a external (disk-based) database using BTrees. ** See the header comment on "btreeInt.h" for additional information. @@ -793,7 +793,7 @@ static void freeSpace(MemPage *pPage, int start, int size){ assert( start>=pPage->hdrOffset+6+(pPage->leaf?0:4) ); assert( (start + size)<=pPage->pBt->usableSize ); assert( sqlite3_mutex_held(pPage->pBt->mutex) ); - if( size<4 ) size = 4; + assert( size>=0 ); /* Minimum cell size is 4 */ #ifdef SQLITE_SECURE_DELETE /* Overwrite deleted information with zeros when the SECURE_DELETE @@ -1177,8 +1177,7 @@ int sqlite3BtreeOpen( ** If this Btree is a candidate for shared cache, try to find an ** existing BtShared object that we can share with */ - if( (flags & BTREE_PRIVATE)==0 - && isMemdb==0 + if( isMemdb==0 && (db->flags & SQLITE_Vtab)==0 && zFilename && zFilename[0] ){ @@ -1187,9 +1186,7 @@ int sqlite3BtreeOpen( char *zFullPathname = sqlite3Malloc(nFullPathname); sqlite3_mutex *mutexShared; p->sharable = 1; - if( db ){ - db->flags |= SQLITE_SharedCache; - } + db->flags |= SQLITE_SharedCache; if( !zFullPathname ){ sqlite3_free(p); return SQLITE_NOMEM; @@ -1375,10 +1372,10 @@ static int removeFromSharingList(BtShared *pBt){ sqlite3SharedCacheList = pBt->pNext; }else{ pList = sqlite3SharedCacheList; - while( pList && pList->pNext!=pBt ){ + while( ALWAYS(pList) && pList->pNext!=pBt ){ pList=pList->pNext; } - if( pList ){ + if( ALWAYS(pList) ){ pList->pNext = pBt->pNext; } } diff --git a/src/btree.h b/src/btree.h index 43e7853d4c..780f1d3f14 100644 --- a/src/btree.h +++ b/src/btree.h @@ -13,7 +13,7 @@ ** subsystem. See comments in the source code for a detailed description ** of what each interface routine does. ** -** @(#) $Id: btree.h,v 1.100 2008/07/10 00:32:42 drh Exp $ +** @(#) $Id: btree.h,v 1.101 2008/07/11 16:15:18 drh Exp $ */ #ifndef _BTREE_H_ #define _BTREE_H_ @@ -76,11 +76,6 @@ int sqlite3BtreeOpen( #define BTREE_READWRITE 16 /* Open for both reading and writing */ #define BTREE_CREATE 32 /* Create the database if it does not exist */ -/* Additional values for the 4th argument of sqlite3BtreeOpen that -** are not associated with PAGER_ values. -*/ -#define BTREE_PRIVATE 64 /* Never share with other connections */ - int sqlite3BtreeClose(Btree*); int sqlite3BtreeSetCacheSize(Btree*,int); int sqlite3BtreeSetSafetyLevel(Btree*,int,int); diff --git a/src/main.c b/src/main.c index 479ed61049..9da03f292f 100644 --- a/src/main.c +++ b/src/main.c @@ -14,7 +14,7 @@ ** other files are for internal use by SQLite and should not be ** accessed by users of the library. ** -** $Id: main.c,v 1.475 2008/07/10 18:13:42 drh Exp $ +** $Id: main.c,v 1.476 2008/07/11 16:15:18 drh Exp $ */ #include "sqliteInt.h" #include @@ -584,8 +584,7 @@ static int sqliteDefaultBusyCallback( */ int sqlite3InvokeBusyHandler(BusyHandler *p){ int rc; - failsafe( p==0, 0x912aaf8d, {return 0;}) - if( p->xFunc==0 || p->nBusy<0 ) return 0; + if( NEVER(p==0) || p->xFunc==0 || p->nBusy<0 ) return 0; rc = p->xFunc(p->pArg, p->nBusy); if( rc==0 ){ p->nBusy = -1; diff --git a/src/sqlite.h.in b/src/sqlite.h.in index 7bfcd7d503..b1a77a03bb 100644 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@ -30,7 +30,7 @@ ** the version number) and changes its name to "sqlite3.h" as ** part of the build process. ** -** @(#) $Id: sqlite.h.in,v 1.367 2008/07/10 18:13:42 drh Exp $ +** @(#) $Id: sqlite.h.in,v 1.368 2008/07/11 16:15:18 drh Exp $ */ #ifndef _SQLITE3_H_ #define _SQLITE3_H_ @@ -6112,7 +6112,6 @@ int sqlite3_status(int op, int *pCurrent, int *pHighwater, int resetFlag); #define SQLITE_STATUS_SCRATCH_USED 3 #define SQLITE_STATUS_SCRATCH_OVERFLOW 4 #define SQLITE_STATUS_MALLOC_SIZE 5 -#define SQLITE_STATUS_FAILSAFE 6 /* diff --git a/src/sqliteInt.h b/src/sqliteInt.h index b019dffab9..acb6ffa729 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -11,7 +11,7 @@ ************************************************************************* ** Internal interface definitions for SQLite. ** -** @(#) $Id: sqliteInt.h,v 1.740 2008/07/10 00:32:42 drh Exp $ +** @(#) $Id: sqliteInt.h,v 1.741 2008/07/11 16:15:18 drh Exp $ */ #ifndef _SQLITEINT_H_ #define _SQLITEINT_H_ @@ -63,24 +63,24 @@ #endif /* -** The failsafe() macro is used to test for error conditions that -** should never occur. This is similar to assert() except that with -** failsafe() the application attempts to recover gracefully rather -** than abort. If a error condition is detected, a global flag is -** set to the "Id" prior to recovery in order to alert the application -** to the error condition. +** The ALWAYS and NEVER macros surround boolean expressions which +** are intended to always be true or false, respectively. Such +** expressions could be omitted from the code completely. But they +** are included in a few cases in order to enhance the resilience +** of SQLite to unexpected behavior - to make the code "self-healing" +** or "ductile" rather than being "brittle" and crashing at the first +** hint of unplanned behavior. ** -** The Id should be a random integer. The idea behind the Id is that -** failsafe() faults in the field can be mapped back to specific failsafe() -** macros, even if line numbers and filenames have changed. -** -** The test condition is argument Cond. The recovery action is -** argument Action. +** When doing coverage testing ALWAYS and NEVER are hard-coded to +** be true and false so that the unreachable code then specify will +** not be counted as untested code. */ #ifdef SQLITE_COVERAGE_TEST -# define failsafe(Cond,Id,Action) +# define ALWAYS(X) (1) +# define NEVER(X) (0) #else -# define failsafe(Cond,Id,Action) if( Cond ){ sqlite3Failsafe(Id); Action; } +# define ALWAYS(X) (X) +# define NEVER(X) (X) #endif /* @@ -1775,7 +1775,6 @@ struct Sqlite3Config { int bCoreMutex; /* True to enable core mutexing */ int bFullMutex; /* True to enable full mutexing */ int mxStrlen; /* Maximum string length */ - int iFailsafe; /* Id of failed failsafe() */ sqlite3_mem_methods m; /* Low-level memory allocation interface */ sqlite3_mutex_methods mutex; /* Low-level mutex interface */ void *pHeap; /* Heap storage space */ @@ -2019,7 +2018,6 @@ void sqlite3RegisterDateTimeFunctions(sqlite3*); #endif int sqlite3SafetyCheckOk(sqlite3*); int sqlite3SafetyCheckSickOrOk(sqlite3*); -void sqlite3Failsafe(int); void sqlite3ChangeCookie(Parse*, int); void sqlite3MaterializeView(Parse*, Select*, Expr*, int); diff --git a/src/status.c b/src/status.c index e5d54f06a7..5d7d6faa4a 100644 --- a/src/status.c +++ b/src/status.c @@ -13,7 +13,7 @@ ** This module implements the sqlite3_status() interface and related ** functionality. ** -** $Id: status.c,v 1.2 2008/07/09 13:28:54 drh Exp $ +** $Id: status.c,v 1.3 2008/07/11 16:15:18 drh Exp $ */ #include "sqliteInt.h" @@ -73,11 +73,6 @@ void sqlite3StatusSet(int op, int X){ ** then this routine is not threadsafe. */ int sqlite3_status(int op, int *pCurrent, int *pHighwater, int resetFlag){ - if( op==SQLITE_STATUS_FAILSAFE ){ - *pCurrent = *pHighwater = sqlite3Config.iFailsafe; - if( resetFlag ) sqlite3Config.iFailsafe = 0; - return SQLITE_OK; - } if( op<0 || op>=ArraySize(sqlite3Stat.nowValue) ){ return SQLITE_MISUSE; } diff --git a/src/test_malloc.c b/src/test_malloc.c index ee233e844f..b67bcccab8 100644 --- a/src/test_malloc.c +++ b/src/test_malloc.c @@ -13,7 +13,7 @@ ** This file contains code used to implement test interfaces to the ** memory allocation subsystem. ** -** $Id: test_malloc.c,v 1.36 2008/07/10 18:13:42 drh Exp $ +** $Id: test_malloc.c,v 1.37 2008/07/11 16:15:18 drh Exp $ */ #include "sqliteInt.h" #include "tcl.h" @@ -1058,7 +1058,6 @@ static int test_status( { "SQLITE_STATUS_SCRATCH_USED", SQLITE_STATUS_SCRATCH_USED }, { "SQLITE_STATUS_SCRATCH_OVERFLOW", SQLITE_STATUS_SCRATCH_OVERFLOW }, { "SQLITE_STATUS_MALLOC_SIZE", SQLITE_STATUS_MALLOC_SIZE }, - { "SQLITE_STATUS_FAILSAFE", SQLITE_STATUS_FAILSAFE }, }; Tcl_Obj *pResult; if( objc!=3 ){ diff --git a/src/util.c b/src/util.c index ad1865c4e4..f7a819353b 100644 --- a/src/util.c +++ b/src/util.c @@ -14,7 +14,7 @@ ** This file contains functions for allocating memory, comparing ** strings, and stuff like that. ** -** $Id: util.c,v 1.236 2008/07/10 00:32:42 drh Exp $ +** $Id: util.c,v 1.237 2008/07/11 16:15:18 drh Exp $ */ #include "sqliteInt.h" #include @@ -936,19 +936,3 @@ int sqlite3SafetyCheckSickOrOk(sqlite3 *db){ magic!=SQLITE_MAGIC_BUSY ) return 0; return 1; } - -#ifndef SQLITE_COVERAGE_TEST -/* -** Report a failsafe() macro failure -*/ -void sqlite3Failsafe(int iCode){ - sqlite3Config.iFailsafe = iCode; - - /* The following assert is always false. When assert() is enabled, - ** the following causes a failsafe() failure to work like an assert() - ** failure. Normal operating mode for SQLite is for assert() to be - ** disabled, however, so the following is normally a no-op. - */ - assert( iCode==0 ); /* Always fails if assert() is enabled */ -} -#endif diff --git a/src/vdbeaux.c b/src/vdbeaux.c index b774d994e5..6e61ce446f 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -14,7 +14,7 @@ ** to version 2.8.7, all this code was combined into the vdbe.c source file. ** But that file was getting too big so this subroutines were split out. ** -** $Id: vdbeaux.c,v 1.395 2008/07/08 22:28:49 shane Exp $ +** $Id: vdbeaux.c,v 1.396 2008/07/11 16:15:18 drh Exp $ */ #include "sqliteInt.h" #include @@ -1083,11 +1083,12 @@ void sqlite3VdbeFreeCursor(Vdbe *p, Cursor *pCx){ if( pCx==0 ){ return; } - if( pCx->pCursor ){ - sqlite3BtreeCloseCursor(pCx->pCursor); - } if( pCx->pBt ){ sqlite3BtreeClose(pCx->pBt); + /* The pCx->pCursor will be close automatically, if it exists, by + ** the call above. */ + }else if( pCx->pCursor ){ + sqlite3BtreeCloseCursor(pCx->pCursor); } #ifndef SQLITE_OMIT_VIRTUALTABLE if( pCx->pVtabCursor ){ diff --git a/src/where.c b/src/where.c index 0f5ba2a5ee..1b5a5f7b8f 100644 --- a/src/where.c +++ b/src/where.c @@ -16,7 +16,7 @@ ** so is applicable. Because this module is responsible for selecting ** indices, you might also think of this module as the "query optimizer". ** -** $Id: where.c,v 1.315 2008/07/09 13:28:54 drh Exp $ +** $Id: where.c,v 1.316 2008/07/11 16:15:18 drh Exp $ */ #include "sqliteInt.h" @@ -478,7 +478,7 @@ static WhereTerm *findTerm( } for(j=0; pIdx->aiColumn[j]!=iColumn; j++){ - failsafe( j>=pIdx->nColumn, 0x0128fc98, {return 0;}); + if( NEVER(j>=pIdx->nColumn) ) return 0; } if( sqlite3StrICmp(pColl->zName, pIdx->azColl[j]) ) continue; } @@ -1608,8 +1608,7 @@ static double bestIndex( flags |= WHERE_COLUMN_IN; if( pExpr->pSelect!=0 ){ inMultiplier *= 25; - }else{ - failsafe( pExpr->pList==0, 0x16b91d0f, continue); + }else if( ALWAYS(pExpr->pList) ){ inMultiplier *= pExpr->pList->nExpr + 1; } } @@ -1725,9 +1724,9 @@ static double bestIndex( */ static void disableTerm(WhereLevel *pLevel, WhereTerm *pTerm){ if( pTerm + && ALWAYS((pTerm->flags & TERM_CODED)==0) && (pLevel->iLeftJoin==0 || ExprHasProperty(pTerm->pExpr, EP_FromJoin)) ){ - failsafe( (pTerm->flags & TERM_CODED)!=0, 0x641154a4, /* no-op */ ); pTerm->flags |= TERM_CODED; if( pTerm->iParent>=0 ){ WhereTerm *pOther = &pTerm->pWC->a[pTerm->iParent]; @@ -1873,7 +1872,7 @@ static int codeAllEqualityTerms( int r1; int k = pIdx->aiColumn[j]; pTerm = findTerm(pWC, iCur, k, notReady, pLevel->flags, pIdx); - failsafe( pTerm==0, 0x7592494c, break ); + if( NEVER(pTerm==0) ) break; assert( (pTerm->flags & TERM_CODED)==0 ); r1 = codeEqualityTerm(pParse, pTerm, pLevel, regBase+j); if( r1!=regBase+j ){ diff --git a/test/tester.tcl b/test/tester.tcl index 8eac43c202..009f36b193 100644 --- a/test/tester.tcl +++ b/test/tester.tcl @@ -11,7 +11,7 @@ # This file implements some common TCL routines used for regression # testing the SQLite library # -# $Id: tester.tcl,v 1.130 2008/07/09 16:51:52 drh Exp $ +# $Id: tester.tcl,v 1.131 2008/07/11 16:15:18 drh Exp $ # # What for user input before continuing. This gives an opportunity @@ -287,16 +287,6 @@ proc finalize_testing {} { if {$nErr>0} { puts "Failures on these tests: $::failList" } - set failsafe [lindex [sqlite3_status SQLITE_STATUS_FAILSAFE 1] 1] - if {$failsafe} { - puts "Failsafe error code [format 0x%08x $failsafe]" - incr nErr - } - set fs2 [lindex [sqlite3_status SQLITE_STATUS_FAILSAFE 0] 1] - if {$fs2} { - puts "Failsafe failed to reset" - incr nErr - } if {[llength $omitList]>0} { puts "Omitted test cases:" set prec {}