2 , . , , . (defensive) . ( , proactive) . , , . .
, . - , , , NULL-. , : , , . , , ( ) .
: - . "" , , , , , , . , . , , .
, , , . , . , , : , , , , , , , , . -, , .
, : -, , . , , ( ) , .
. , . , , , . . " " .
Gremlin ( ) , , ; , , goblin. .
, , , , . , , : , ( ) .
assertion (.) ( ), ( ) (true) (false). .
( false), , . . , , 1, . , , , (. . false). , , , . , , , .
- , , . , .
, ( ) , . , . , , , .
, ( ).
Assert , ASSERT (. ).
, . , , .
, , . , , , " ". , , .
: . , , . ASSERT. , , (. . , ).
// .
// ?
BOOL GetPathltem ( int i, LPTSTR szltem, int iLen)
{
ASSERT ( ( i > 0 ) &&
( NULL != szltem ) &&
( ( iLen > 0) && ( iLen < MAX_PATH) ) &&
( FALSE = IsBadWriteStringPtr ( szltem, iLen)));
}
// .
// , , .
BOOL GetPathltem ( int i, LPTSTR szltem, int iLen)
{
ASSERT ( i > 0);
ASSERT ( NULL != szltem);
ASSERT ( ( iLen > 0) && ( iLen < MAX_PATH));
ASSERT ( FALSE == IsBadWriteStringPtr ( szltem, iLen));
}
. , , NULL
( ), . ( , 1), , .
//
BOOL EnumerateListltems ( PFNELCALLBACK pfnCallback)
{
ASSERT ( NULL != pfnCallback);
}
, ASSERT API- isBadCodePtr:
//
BOOL EnumerateListltems (PFNELCALLBACK pfnCallback)
{
ASSERT ( FALSE = IsBadCodePtr ( pfnCallback));
}
: , , . , .
:
nCount .
Function UpdateListEntries(ByVal nCount As Integer) as Integer
Debug.Assert nCount
.
.
.
End Function
' (nCount>0) , Assert-
' nCount
Function UpdateListEntries(ByVal nCount As Integer) as Integer
Debug.Assert nCount > 0
.
.
.
End Function
, , nCount, , (nCount <= 0) Assert. (nCount > 0), , -, (. . nCount > 0 ) , -, "" (<= 0) nCount.
UpdateListEntries , - Debug.Assert nCount > 0 ASSERTION FAILURE. .
C++ , . 3.1 . Visual Basic, - .
3.1. C/C++
|
|
GetOb j ectType |
(GDI), GDI |
IsBadCodePtr |
|
IsBadReadPtr |
, |
IsBadStringPt |
, NULL- ( ) |
IsBadWritePtr |
, |
IsWindow |
, HWND- |
IsBadstringPtr IsBadWritePtr . IsBadWritePtr, , . , , . , IsBadstringPtr IsBadWritePtr.
Visual Basic , Visual Basic. 3.2. , Visual Basic, variants ByVal ByRef , . , , , .
3.2. Visual Basic
isArray |
, Array |
IsDate |
, |
IsEmpty |
, variant- |
IsError |
, |
IsMissing |
, Variant |
IsNull |
, Variant- Null |
IsNumeric |
, |
IsObject |
, |
TypeName |
|
, .
//
BOOL CheckDriveFreeSpace ( LPCTSTR szDrive)
{
ULARGE_INTEGER ulgAvail;
ULARGE_INTEGER ulgNumBytes;
ULARGE INTEGER ulgFree;
if ( FALSE == GetDiskFreeSpaceEx ( szDrive ,
&ulgAvail ,
&ulgNumBytes ,
&ulgFree ))
{
ASSERT ( FALSE);
return ( FALSE);
}
}
ASSERT, . , FALSE, . ( ) .
(Dave Angel) , ASSERT C++ NOT (!), . , , , - , ( ). . , Visual Basic.
//
BOOL CheckDriveFreeSpace ( LPCTSTR szDrive)
{
ULARGE_INTEGER ulgAvail;
ULARGE_INTEGER ulgNuinBytes;
ULARGE INTEGER ulgFree;
if ( FALSE = GetDiskFreeSpaceEx ( szDrive ,
&ulgAvail ,
&ulgNumBytes,
&ulgFree ))
{
ASSERT ( !"GetDiskFreeSpaceEx failed!");
return ( FALSE);
}
}
, AND (&&). , ASSERT- :
BOOL AddToDataTree ( PTREENODE pNode)
{
ASSERT ( ( FALSE == IsBadReadPtr
( pNode, sizeof ( TREENODE))) &&
"Invalid parameter!");
.
.
.
}
, . , , . , (, ). , .
(stopDebugging) , 4, ASSERT. , (ASSERT) . , , , .
BOOL DEBUGINTERFACE_DLLINTERFACE _stdcall
StopDebugging ( LPHANDLE IpDebugSyncEvents)
{
ASSERT ( FALSE ==
IsBadWritePtr ( IpDebugSyncEvents,
sizeof ( HANDLE) * NUM_DEBUGEVENTS));
if ( TRUE == IsBadWritePtr ( IpDebugSyncEvents,
sizeof ( HANDLE) * NUM_DEBUGEVENTS))
{
SetLastError ( ERROR_INVALID_PARAMETER);
return ( FALSE);
}
// .
VERIFY ( SetEvent ( IpDebugSyncEvents[ CLOSEDEBUGGER ]));
return ( TRUE);
}
private- . , . , , , ( , ), () . , . ASSERT- . , .
, "" . . , , , .
ASSERT- . ASSERT- . . 3-1 startDebugging ( , 4), . , .
3-1. ASSERT- ;
HANDLE DEBUGINTERFACE_DLLINTERFACE _stdcall
StartDebugging ( LPCTSTR szDebuggee ,
LPCTSTR szCmdLine ,
LPDWORD IpPID ,
CDebugBaseUser * pUserClass ,
LPHANDLE IpDebugSyncEvents )
{
// ASSERT- .
ASSERT ( FALSE == IsBadStringPtr ( szDebuggee, MAX__PATH));
ASSERT ( FALSE == IsBadStringPtr ( szCmdLine, MAX_PATH));
ASSERT ( FALSE == IsBadWritePtr ( IpPID, sizeof ( DWORD)));
ASSERT ( FALSE == IsBadReadPtr ( pUserClass,
sizeof ( CDebugBaseUser *)));
ASSERT' ( FALSE == IsBadWritePtr ( IpDebugSyncEvents,
sizeof ( HANDLE) *
NUM_DEBUGEVENTS));
// .
if ( ( TRUE == IsBadStringPtr ( szDebuggee, MAX_PATH) ) ||
( TRUE == IsBadStringPtr ( szCmdLine, MAX_PATH) ) ||
( TRUE IsBadWritePtr ( IpPID, sizeof ( DWORD) )) ||
( TRUE == IsBadReadPtr ( pUserClass,
sizeof ( CDebugBaseUser *))) ||
( TRUE == IsBadWritePtr ( IpDebugSyncEvents,
sizeof ( HANDLE) *
NUM_DEBUGEVENTS) ) )
{
SetLastError ( ERROR_INVALID_PARAMETER);
return ( INVALID_HANDLE_VALUE);
}
// ,
// , HANDLE hStartAck;
// , TCHAR szStartAck [ _ ];
// ,
if ( 0 == LoadString ( GetDllHandle () ,
IDS_DBGEVENTINIT ,
szStartAck ,
sizeof ( szStartAck) ))
{
ASSERT ( !"LoadString IDS_DBGEVENTINIT failed!");
return ( INVALID_HANDLE_VALUE);
}
// .
hStartAck = CreateEvent ( NULL , //
TRUE , // FALSE ,
// Initial state = Not szStartAck);
// ASSERT ( FALSE != hStartAck);
if ( FALSE == hStartAck)
{
TRACE ( "StartDebugging : Unable to create Start Ack event\n");
return ( INVALID_HANDLE_VALUE);
}
// .
THREADPARAMS StParams;
stParams.lpPID = IpPID;
stParams.pUserClass = pUserClass;
stParams.szDebuggee = szDebuggee;
stParams.szCmdLine = szCmdLine ;
// HANDLE hDbgThread;
// .
hDbgThread = (HANDLE)_beginthread ( DebugThread, 0, sstParams);
ASSERT ( NULL != hDbgThread);
if ( NULL == hDbgThread)
{
TRACE ( "StartDebugging : _beginthread failed\n");
VERIFY ( CloseHandle ( hStartAck));
return ( INVALID_HANDLE_VALUE);
}
// , ,
::WaitForSingleObject ( hStartAck, INFINITE);
// .
VERIFY ( CloseHandle ( hStartAck));
// , . ,
// , , .
DWORD dwExitCode = ~STILL_ACTIVE;
if ( FALSE == GetExitCodeThread ( hDbgThread, SdwExitCode))
{
ASSERT ( !"GetExitCodeThread failed!");
return ( INVALID_HANDLE_VALUE);
}
ASSERT ( STILL_ACTIVE = dwExitCode);
if ( STILL_ACTIVE != dwExitCode)
{
TRACE ( "StartDebugging : GetExitCodeThread failedXn");
return ( INVALID_HANDLE_VALUE);
}
// ,
// , .
BOOL bCreateDbgSyncEvts =
CreateDebugSyncEvents ( IpDebugSyncEvents, *lpPID);
ASSERT ( TRUE = bCreateDbgSyncEvts);
if ( FALSE = bCreateDbgSyncEvts)
{
// . ,
// ,
//
// .
// . .
TRACE ( "StartDebugging : CreateDebugSyncEvents failedW) ;
VERIFY ( TerminateThread ( hDbgThread, (DWORD)-1));
return ( INVALID_HANDLE_VALUE);
}
return ( hDbgThread);
}
, , , . , , 3 , . : ( ) , .
, , . , , , . , , "" , , . Microsoft Visual C++ Visual Basic , , . . , Watch ( 5, Visual C++). - ValidatePointerArray, .
#ifdef _DEBUG
void VaiidatePointerArray ( STDATA * pData, int iCount)
{
// .
ASSERT ( FALSE == IsBadReadPtr ( pData,
iCount * sizeof ( STDATA *)));
for ( int i = 0; i < iCount; i++)
{
ASSERT ( pData[ i ].bFlags < DF_HIGHVAL);
ASSERT { FALSE == IsBadStringPtr ( pDataf i ].pszName,
MAX_PATH));
}
}
#endif
void PlotDataltems ( STDATA * pData, int iCount)
#ifdef _DEBUG
VaiidatePointerArray ( pData, iCount);
#endif
}
VERIFY
, VERIFY, Microsoft Foundation Classes MFC). , : 0, VERIFY . , , .
, VERIFY , . , , - . - VERIFY : , , . , ResetEvent, , , . ResetEvent , . VERIFY, , , , - . , , ASSERT, VERIFY , . , , .
MFC-, , VERIFY . . VERIFY cstring: :Loadstring, . , Loadstring , VERIFY . Loadstring , . , , , . , . VERIFY, , - ?
, Visual C++ Visual Basic. , -, ASSERT, .
assert, _ASSERTw _ASSERTE
assert (run-time) ANSI . - ASSERT.H. Windows- assert stderr. Windows- (GUI), assert ASSERTION FAILURE... (. . 3.1).
- Windows. _ASSERT __ASSERTE, CRTDBG.H. , _ASSERTE , . , 1, _ASSERTE, _ASSERT. - ( DCRT- 15).
Test engineers . .
BoundsChecker NuMega , . , , . (U ^-) , . , , , .
UI User Interface, . .
. .
, , - . BoundsChecker , Windows (Windows Debugging API), (debugger) 3 (debuggee), , . , , WaitForDebugEvent . , , , .
, , , API, , , cioseHandle. , API , , . .
, , API, , ! , . : , API, , , , API .
, , , , "". Windows NT 4, , (Windows' 2000 ). , . API , , Ul- , , , Ul-, !
( ) , , . . , BoundsChecker, , , , , , .
, API. ( ), , , cioseHandle. , , , .
, CioseHandle, , Windows NT 4 Windows 2000 : "Invalid Handle exception (0x00000008)" ( (0x00000008) " "). , , .
assert, _ASSERT _ASSERTE , . assert .
-, 60 , , . , , Windows 2000 -. assert (stderr), . assert , , , . . UI- .
, -, , API- outputoebugstring, __CrtsetReportMode. , Microsoft, : ( , ). , .
, .
// . (-),
// , .
//, ,
// SendMessageTimeout, ,
// GetLastError. 0 0,
// SendMessageTimeout -.
_ASSERTE ( NULL != pDataPacket)
if ( NULL == pDataPacket)
return ( ERR_INVALID_DATA);
}
LRESULT IRes = SendMessageTimeout ( hUIWnd,
WM_USER_NEEDNEXTPACKET,
0
(LPARAM)pDataPacket ,
SMTO_BLOCK ,
10000
&pdwRes ) ;
_ASSERTE ( FALSE != IRes);
if ( 0 == IRes)
{
// .
DWORD dwLastErr = GetLastError ();
if ( 0 == dwLastErr)
{
// UI .
return ( ERR_UI_IS_HUNG);
}
// - ,
// , .
return ( ERR_INVALID_DATA);
}
return ( ERR_SUCCESS);
.
.
.
, , (last error value).
_ASSERTE ( FALSE != IRes)
(. . ) , 0, UI- , , , sendMessageTimeout, . - , , . , SUPERASSERT .
ASSERT_KINDOFw ASSERT_VALID
, MFC, , MFC , . DECLARE_DYNAMIC DECLARE_SERIAL, ASSERT_KINDOF , ( cobject) . ASSERT_KINDOF cobject: :isKindOf. ASSERT_KINDOF, .
BOOL DoSomeMFCStuffToAFrame ( CWnd * pWnd)
{
ASSERT ( NULL != pWnd);
ASSERT_KINDOF ( CFrameWnd, pWnd);
if ( (NULL == pWnd) ||
{ FALSE == pWnd->IsKindOf ( RUNTIME_CLASS ( CFrameWnd))))
{
return ( FALSE);
.
.
.
// MFC-; ,
// pWnd CFrameWnd ,
// CFrameWnd.
.
.
.
MFC-- ASSERT_VALID AfxAssertvaiidObject, , cobject. , ASSERT_VALID Assertvaiid. . Assertvaiid , .
Debug.Assert
, Visual Basic- , C/C++, Visual Basic ( , variant). , , Visual Basic . Visual Basic Debug.Assert, .
. : Debug.Assert , , . . . , Visual Basic ,
Debug.Assert (native) . Debug.Assert (IDE) Visual Basic. , IDE Debug.Assert. Debug.Assert IDE, , , .
Debug.Assert, Advanced Visual Basic 6.0 (2nd ed., Microsoft Press, 1998) The Mandelbrot Set, . (Mark ) Visual Basic, Assertion Sourcerer. ( ). Debug.Assert . , . , Assertion Sourcerer , !
Debug.Print . 3-2 VBASSERTANDTRACE.BAS, , . SUPERASSERT, .
3-2. VBASSERTANDTRACE.BAS
Attribute VB_Name = "VBAssertAndTrace"
'''''''''''''''''''''''''''''''''''''''''''''
' Copyright () 1999-2000 John Robbins All rights reserved.
' "Debugging Applications" (Microsoft Press)
'
' :
' ( !) :
' Visual Basic- Assertion
' Sourcerer (Mark Pearce)
' "Advanced Microsoft Visual Basic 6.0" (2nd ed).
' Debug.Assert
'
' BugAssert, Visual Basic-
' .
' Debug.Assert :
' 1. BUGSLAYERUTIL.DLL,
' .
' 2. Debug.Assert .
' 3. ,
' ,
' BugAssert.
' 4. .
' 5. .
'
' BUGSLAYERUTIL.DLL,
' .
'''''''''''''''''''''''''''''''''''''''''''
Option Explicit
' BUGSLAYERUTIL.DLL,
' .
Public Declare Sub DiagOutputVB Lib "BugslayerUtil" _
(ByVal sMsg As String)
Public Declare Function DiagAssertVB Lib "BugslayerUtil" _
(ByVal dwOverrideOpts As Long, _
ByVal bAllowHalts As Long,
_ ByVal sMsg As String) _
As Long
Public Declare Function AddDiagAssertModule Lib "BugslayerUtil" _
(ByVal hMod As Long) _
As Long
Public Declare Function SetDiagAssertFile Lib "BugslayerUtil" _
(ByVal hFile As Long) _
As Long
Public Declare Function SetDiagAssertOptions Lib "BugslayerUtil" _
(ByVal dwOpts As Long) _
As Long
Public Declare Function SetDiagOutputFile Lib "BugslayerUtil" _
(ByVal dwOpts As Long) _
As Long
Private Declare Function GetModuleFileName Lib "kerne!32" _
Alias "GetModuleFileNameA" _
(ByVal hModule As Long, _
ByVal IpFileName As String, _
ByVal nSize As Long) _
As Long Public Declare Sub DebugBreak Lib "kerne!32" ()
' TRACE.
' . , Assertion Sourcerer
' TRACE- ( Debug.Print)
Public Sub TRACE(ByVal sMsg As String)
DiagOutputVB sMsg End Sub
' BugAssert,
' Assertion Sourcerer
Public Sub BugAssert(ByVal vntiExpression As Variant, sMsg As String)
CallAssert vntiExpression, 0, sMsg
End Sub
' SUPERASSERT.
Public Sub SUPERASSERT{ByVal vntiExpression As Variant, sMsg As String)
CallAssert vntiExpression, 7, sMsg
End Sub
Private Sub CallAssert{ByVal vntiExpression As Variant, _
ByVal iOpt As Long,
_ sMsg As String)
If (vntiExpression) Then
Exit Sub Else
' , ,
' InDesign.
' .
Static bCheckedDesign As Boolean 'False .
' , , DiagAssertVB.
' 1, DiagAssertVB
' . 0,
' VB IDE , DiagAssertVB
' .
' VB IDE,
' !
Static lAllowHalts As Long
' InDesign .
If (False = bCheckedDesign) Then
If (True = InDesign()) Then
lAllowHalts = 0
Else
lAllowHalts = I
End If
bCheckedDesign = True
End If
Dim IRet As Long
IRet = DiagAssertVB(iOpt, lAllowHalts, sMsg)
If (I = IRet) Then
' . .
' ,
' VB IDE.
If (1 = lAllowHalts) Then
DebugBreak
End If
End If
End If
End Sub
'''''''''''''''''''''''''''''''''''''''''
' "On
' Error GoTo To Hell" (.25,26 "Advanced Microsoft Visual Basic 6.0")
' InDesign , VB IDE.
' , !
'''''''''''''''''''''''''''''''''''''''
Public Function InDesign() As Boolean
' .
' Debug.Assert!
Static nCallCount As Integer
Static bRet As Boolean ' False.
nCallCount = nCallCount + 1
Select Case nCallCount
Case 1: ' ( Debug.Assert)
Debug.Assert InDesign() Case 2: ' , Debug.Assert
bRet = True
End Select
' Debug.Assert, True,
' .
InDesign = bRet
' .
nCallCount = 0
End Function
, , , , . . 3.1 SUPERASSERT. Program, File Line . , Last Error.
SUPERASSERT . API , . . , , . , GetModuieFileName , , SUPERASSERT 122, ERROR_INSUFFICIENT_BUFFER ( ) WINERROR.H. "The data area passed to a system call is too small" ( , , ), , .
. 3.1. SUPERASSERT
, Last Error . 3.1, , Windows- . ( ), SUPERASSERT . , MSDN "Message Compiler" ( ). : .
, Last Error. . . SUPERASSERT , .
SUPERASSERT: . , , ! 2 (regression-testing tool), , ( ) . - , , . SUPERASSERT, , OutputDebugsString, , . , , . , , .
SUPERASSERT . C++ BUGSLAYERUTIL.H BUGSLAYERUTIL.LIB. 3-3 DIAGASSERT.H, BUGSLAYERUTIL.H.
3-3. DIAGASSERT.H ( BUGSLAYERUTIL.H)
/ - - - - - - - - - - - - - - - - - - - - - -
"Debugging Applications" (Microsoft Press)
Copyright () 1999-2000 John Robbins All Rights Reserved.
/- - - - - - - - - - - - - - - - - - - -
#fndef _DIAGASSERT_H
#define _DIAGASSERT_H
#ifdef _cplusplus
extern "C" {
#endif //_cplusplus
#include <tchar.h>
/////////////////////////////////////////////
#define
//////////////////////////////////////////////
// ,
// . //
#define DA_USEDEFAULTS OxOOOO
// ( ).
#define DA_SHOWMSGBOX OxOOOl
// OutputDebugString ( ).
// the default.
#define DA_SHOWODS 0x0002
// .
// ASSERT SUPERASSERT.
ifdefine DA_SHOWSTACKTRACE 0x0004
/*- - - - - - - - - - - - - - - - - - - - -
: SetDiagAssertOptions
:
ASSERT.
:
dwOpts
:
- - - - - - - - - - - - - - - - - - - - - */
DWORD BUGSUTIL_DLLINTERFACE _stdcall
SetDiagAssertOptions ( DWORD dwOpts);
/*- - - - - - - - - - - - - - - - - - - - -
: SetDiagAssertFile
:
, . , INVALID_HANDLE_VALUE. SetDiagAssertOptions ; assertion- .
.
:
hFile
:
- - - - - - - - - - - - - - - - - - - - -* /
HANDLE BUGSUTILJ3LLINTERFACE _stdcall
SetDiagAssertFile ( HANDLE hFile);
/* - - - - - - - - - - - - - - - - - - - - -
: AddDiagAssertModule
DISCUSSION :
, .
:
hMod
:
TRUE - .
FALSE - .
- - - - - - - - - - - - - - - - - - - - -*/
BOOL BUGSUTIL_DLLINTERFACE _stdcall
AddDiagAssertModule ( HMODULE hMod);
/*- - - - - - - - - - - - - - - - - - - -
: DiagAssert
:
C++
:
dwOverrideOpts DA_* DiagAssert
szMsg
szFile ,
dwLine ,
:
FALSE .
TRUE DebugBreak.
- - - - - - - - - - - - - - - - - - - - - -* /
BOOL BUGSUTIL_DLLINTERFACE _stdcall
DiagAssertA ( DWORD dwOverrideOpts ,
LPCSTR szMsg ,
LPCSTR szFile DWORD dwLine );
BOOL BUGSUTILJDLLINTERFACE _stdcall
DiagAssertW ( DWORD dwOverrideOpts ,
LPCWSTR szMsg ,
LPCSTR szFile
DWORD dwLine ) ;
#ifdef UNICODE
#define DiagAssert DiagAssertW ttelse
#define DiagAssert DiagAssertA
#endif
/*- - - - - - - - - - - - - - - - - -
: DiagAssertVB
:
Visual Basic-.
dwOverrideOpts DA_*
DiagAssert
bAllowHalts TRUE, Retry Ignore
szMsg .
Visual Basic
:
FALSE .
TRUE - DebugBreak.
- - - - - - - - - - - - - - - - - - - */
BOOL BUGSUTILJDLLINTERFACE _stdcall
DiagAssertVB ( DWORD dwOverrideOpts,
BOOL bAllowHalts,
LPCSTR szMsg);
/*- - - - - - - - - - - - - - - - - - - -
: SetDiagOutputFile
:
, ( ) trace-. , INVALID_HANDLE_VALUE.
- .
:
hFile
:
- - - - - - - - - - - - - - - - - */
HANDLE BUGSUTIL_DLLINTERFACE _stdcall
SetDiagOutputFile ( HANDLE hFile);
/*- - - - - - - - - - - - - - - - -
: DiagOutput
:
OutputDebugString
:
szFmt
... , szFmt
:
.
- - - - - - - - - - - - - - - - - - */
void BUGSUTIL_DLLINTERFACE
DiagOutputA ( LPCSTR szFtat, ...);
void BUGSUTIL_DLLINTERFACE
DiagOutputW ( LPCWSTR szFmt, ...);
#ifdef UNICODE
#define DiagOutput DiagOutputW
#else
idefine DiagOutput DiagOutputA
#endif
/*- - - - - - - - - - - - - - - - - -
: DiagOutputVB
:
OutputDebugString Visual Basic-
:
szMsg
:
.
- - - - - - - - - - - - - - - - - - - - - -*/
void BUGSUTIL_DLLINTERFACE _stdcall
DiagOutputVB ( LPCSTR szMsg);
/*/////////////////////////////////////
#undef
////////////////////////////////////////*/
#ifdef ASSERT
#undef ASSERT
#endif
#ifdef assert
#undef assert
#endif
#ifdef VERIFY
#undef VERIFY
#endif
#ifdef TRACE
3undef TRACE
#endif
#ifdef TRACED
#undef TRACED
#endif
#ifdef TRACE1
#undef TRACE1
#endif
#ifdef TRACE2
#undef TRACE2
#endif
#ifdef TRACE3
#undef TRACE3
#endif
/*////////////////////////////////////
_DEBUG
///////////////////////////////////////*/
#ifdef _DEBUG
/*//////////////////////////////////////////////
#define
/////////////////////////////////////////////*/
// ,
// SetDiagAssertOptions.
// DiagAssert ,
// .
// assert ASSERT SUPERASSERT.
// "conditional expression is constant" ("
// ") - , while(0).
// ,
// .
#pragma warning ( disable : 4127)
#ifdef PORTABLE_BUGSLAYERUTIL
#define ASSERTMACRO(a,x) \
do \
{ \
if ( !(x) &&\
DiagAssert ( a, _T ( #x), _FILE_, _LINE_) ) \
{ \
DebugBreak () ; \
} \
} while (0)
#else //!PORTABLE_BUGSLAYERUTIL
#define ASSERTMACRO(a,x) \
do \
{ \
if ( !(x) &&\
DiagAssert ( a, _T ( Ix), _FILE_, _LINE_) . ) \
{ \
_asm int 3 \
} \
} while (0)
#endif // PORTABLE_BUGSLAYERUTIL
// . .
#define ASSERT(x) ASSERTMACRO(DA_OSEDEFAULTS, x)
// assert.
#define assert ASSERT // , !
#define VERIFY(x) ASSERT(x)
// assert
#define SUPERASSERT(x) ASSERTMACRO ( DA_SHOWSTACKTRACE | \
DA_SHOWMSGBOX | \
DA_SHOWODS , \
x ,)
//
#define SETDIAGASSERTOPTIONS(x) SetDiagAssertOptions(x)
//
#define ADDDIAGASSERTMODULE(x) AddDiagAssertModule(x)
// TRACE
#ifdef _cplusplus
#define TRACE ::DiagOutput
#endif
#define TRACED(sz) DiagOutput(_T("Is"), _T(sz))
#define TRACEl(sz, pi) DiagOutput(_T(sz), pi)
#define TRACE2(sz, pi, p2) DiagOutput(_T(sz), pi, p2)
#define TRACE3(sz, pi, p2, p3) DiagOutput(_T(sz), pi, p2, p3)
#else // !_DEBUG
/*/////////////////////////////////////////
_DEBUG !!HE!!
//////////////////////////////////////////*/
#define ASSERTMACRO(a,x)
#define ASSERT(x)
#define VERIFY(x) ((void)(x))
#define SUPERASSERT(x)
#define SETDIAGASSERTOPTIONS(x)
#define ADDDIAGASSERTMODULE(x)
#ifdef _cplusplus
//inline void TraceOutput(LPCTSTR, ...) { }
#define TRACE (void)0
#endif
#define TRACED(fmt)
#define TRACE1(fmt,argl)
#define TRACE2(fmt,argl,arg2)
#define TRACE3(fmt,argl,arg2,arg3)
#endif // _DEBUG
#ifdef _cplusplus
}
#endif //_cplusplus
#endif // _DIAGASSERT_H
SUPERASSERT ASSERT assert . _ASSERT __ASSERTE , . Visual Basic ASSERT_KINDOF ASSERT_VALID. Visual Basic VBASSERTANDTRACE.BAS.
SUPERASSERT, . ASSERT , . . , , . , , , SETDIAGASSERTOPTIONS setoiagAssertcptions ASSERT DA_SHOWSTACKTRACE. SUPERASSERT , . , , . ASSERT.
?
, :
if ( INVALID_HANDLE_VALUE == hFile)
if ( hFile == INVALID_ HANDLE_VALUE)
, . , . ( ), . C/C++, Visual Basic, . - , , , .
, , , . , , . , , .
, . . . , , , .
, , , , , . , TRACE ( ++) Debug.Print ( Visual Basic) , , . priritf-. , , .
, . , . , , . , . 14 LIMODS, , .
, .
, . , , , , . ( , 12), . , , , .
, - ( ) . , , . .
, . , §1- . ": ". , , . , . , .
Output . www.sysinternals.com DebugView/Enterprise Edition (Mark Russinovich) , . . , , . DebugView/Enterprise Edition -, . , , -, , , , Microsoft Internet Information Services (US).
. UNIX (grep). UNIX find, . .
(Francois Poulin), , , : " , , , , !" , . , , , , , , . , .
- : . , . "" , , ; , . .
:
;
;
;
;
.
, , , . (Donald Knuth) , , . , .
19 "Self-Documenting Code" (Steve McConnell) Code Complete (Microsoft Press, 1993). , , . , , .
, (Andy Grove) Intel Only the Paranoid Survive ( ). -. - , . . , -, . , .
: , . 1 , - . , . . , , , , , , .
1 , , , , . .
: . . - , , . (, , ). , , . , , .
, , , , - . , , , . , 9. Windows 98, , API- syminitiaiize DBGHELP.DLL , Windows 2000. , Windows 98 , Bsusyminitialize. , .
. , 50 . , , , , -. . (master sources). , , . smoke-.
() (code coverage). , , . . , , 100 , 85 , 85%- . , , .
. . . , . , ( 100%). , , TrueCoverage NuMega Visual PureCoverage Rational.
, , , 85 90 . , . , , . , , . , , , . , , , , .
, , , 1. , .
, , . ..\SourceCode\BugslayerUtil \Tests -. , . , , -. . , , , .
, . ,
, . SUPERASSERT , , Microsoft. , . , . , , .
, , . , , 8590%- , . , .
10.11.2021 - 12:37: - Personalias -> WHO IS WHO - - _. 10.11.2021 - 12:36: - Conscience -> . ? - _. 10.11.2021 - 12:36: , , - Upbringing, Inlightening, Education -> ... - _. 10.11.2021 - 12:35: - Ecology -> - _. 10.11.2021 - 12:34: , - War, Politics and Science -> - _. 10.11.2021 - 12:34: , - War, Politics and Science -> . - _. 10.11.2021 - 12:34: , , - Upbringing, Inlightening, Education -> , - _. 10.11.2021 - 09:18: - New Technologies -> , 5G- - _. 10.11.2021 - 09:18: - Ecology -> - _. 10.11.2021 - 09:16: - Ecology -> - _. 10.11.2021 - 09:15: , , - Upbringing, Inlightening, Education -> - _. 10.11.2021 - 09:13: , , - Upbringing, Inlightening, Education -> - _. |