Listing 2: Checking post-conditions of a function
class PipePreparer { HANDLE ChildStdoutRead; HANDLE ChildStdoutWrite; HANDLE ChildStdinRead; HANDLE ChildStdinWrite; HANDLE ChildStdinWriteDup; HANDLE SaveStdout; HANDLE SaveStdin; void PipePreparer::Finish( bool ChildCreatedOK, HANDLE* pParentIn, HANDLE* pParentOut ); ... } void PipePreparer::Finish( bool ChildCreatedOK, HANDLE* pParentIn, HANDLE* pParentOut ) { bool OK = ::CloseHandle( ChildStdoutWrite ); ChildStdoutWrite = INVALID_HANDLE_VALUE; ::CloseHandle( ChildStdinRead ); ChildStdinRead = INVALID_HANDLE_VALUE; if( OK && ChildCreatedOK ) { pParentOut = ChildStdinWriteDup; ChildStdinWriteDup = INVALID_HANDLE_VALUE; pParentIn = ChildStdoutRead; ChildStdoutRead = INVALID_HANDLE_VALUE; } else { if( ChildStdinWriteDup != INVALID_HANDLE_VALUE ) { ::CloseHandle( ChildStdinWriteDup ); ChildStdinWriteDup = INVALID_HANDLE_VALUE; } if( ChildStdoutRead != INVALID_HANDLE_VALUE ) { ::CloseHandle( ChildStdoutRead ); ChildStdoutRead = INVALID_HANDLE_VALUE; } } ::SetStdHandle( STD_OUTPUT_HANDLE, SaveStdOut ); ::SetStdHandle( STD_INPUT_HANDLE, SaveStdin ); assert( ChildStdoutRead == INVALID_HANDLE_VALUE ); assert( ChildStdoutWrite == INVALID_HANDLE_VALUE ); assert( ChildStdinRead == INVALID_HANDLE_VALUE ); assert( ChildStdinWrite == INVALID_HANDLE_VALUE ); assert( ChildStdinWriteDup == INVALID_HANDLE_VALUE ); } //End of File