Udostępnij przez


Korzystanie z VERIFY zamiast ASSERT

Załóżmy, że podczas uruchamiania wersji debugowania aplikacji MFC nie ma problemów. Jednak wersja wydania tej samej aplikacji ulega awarii, zwraca nieprawidłowe wyniki i/lub wykazuje inne nietypowe zachowanie.

Ten problem może być spowodowany umieszczeniem ważnego kodu w instrukcji ASSERT w celu sprawdzenia, czy działa prawidłowo. Ponieważ instrukcje ASSERT są komentowane w kompilacji wydania programu MFC, kod nie jest uruchamiany w kompilacji wydania.

Jeśli używasz funkcji ASSERT do potwierdzenia, że wywołanie funkcji powiodło się, rozważ użycie funkcji VERIFY zamiast tego. Makro VERIFY ocenia własne argumenty zarówno w kompilacjach debugowania, jak i wydania aplikacji.

Inną preferowaną techniką jest przypisanie wartości zwracanej funkcji do zmiennej tymczasowej, a następnie przetestowanie zmiennej w instrukcji ASSERT.

Zapoznaj się z następującym fragmentem kodu:

enum {
    sizeOfBuffer = 20
};
char *buf;
ASSERT(buf = (char *) calloc(sizeOfBuffer, sizeof(char) ));
strcpy_s( buf, sizeOfBuffer, "Hello, World" );
free( buf );

Ten kod jest uruchamiany doskonale w wersji debugowania aplikacji MFC. Jeśli wywołanie zakończy się calloc( ) niepowodzeniem, zostanie wyświetlony komunikat diagnostyczny zawierający plik i numer wiersza. Jednak w kompilacji detalicznej aplikacji MFC:

  • wywołanie calloc( ) nigdy nie występuje, pozostawiając buf niezainicjowane lub

  • strcpy_s( ) kopiuje "Hello, World" do losowego fragmentu pamięci, prawdopodobnie powodując awarię aplikacji lub powodując, że system przestaje odpowiadać lub

  • free() próbuje zwolnić pamięć, która nigdy nie została przydzielona.

Aby prawidłowo użyć funkcji ASSERT, przykładowy kod powinien zostać zmieniony na następujące:

enum {
    sizeOfBuffer = 20
};
char *buf;
buf = (char *) calloc(sizeOfBuffer, sizeof(char) );
ASSERT( buf != NULL );
strcpy_s( buf, sizeOfBuffer, "Hello, World" );
free( buf );

Zamiast tego możesz użyć funkcji VERIFY:

enum {
    sizeOfBuffer = 20
};
char *buf;
VERIFY(buf = (char *) calloc(sizeOfBuffer, sizeof(char) ));
strcpy_s( buf, sizeOfBuffer, "Hello, World" );
free( buf );

Zobacz też

Naprawianie problemów kompilacji wydania