Rozpatrywanie sprawozdań ASSERT
Załóżmy, że podczas uruchamiania programu debug wersję aplikacji MFC nie występują problemy.Jednakże wersji tej samej aplikacji ulega awarii, zwraca nieprawidłowe wyniki, lub nienormalne działanie wykazuje.
Ten problem może być spowodowany umieścić kod ważne w instrukcji ASSERT, aby zweryfikować, że wykonuje poprawnie.Ponieważ w wydanej kompilacji programu MFC komentarzem sprawozdań ASSERT, kod nie jest uruchamiany w wydanej kompilacji.
Jeśli używasz ASSERT, aby potwierdzić, że udało się wywołanie funkcji, należy rozważyć użycie SPRAWDŹ zamiast.Makro Sprawdź ocenia argumenty w obu debug i release buduje aplikacji.
Inny preferowany technika jest przypisać wartość zwracana przez funkcję do zmiennej tymczasowej, a następnie przetestować zmiennej w instrukcji ASSERT.
Zbadać następujący fragment kodu:
enum {
sizeOfBuffer = 20
};
char *buf;
ASSERT(buf = (char *) calloc(sizeOfBuffer, sizeof(char) ));
strcpy_s( buf, sizeOfBuffer, "Hello, World" );
free( buf );
Ten kod uruchamia się doskonale w wersji debugowania aplikacji MFC.Jeśli wywołanie calloc( ) nie powiedzie się, diagnostyczne wiadomości, która zawiera liczbę plików i wiersza pojawia się.Jednakże w sprzedaży detalicznej budowanie aplikacji MFC:
wywołanie calloc( ) nigdy nie nastąpi, pozostawiając buf niezainicjowanych, lub
strcpy_s( )kopie "Hello, World" w losowej piece pamięci, ewentualnie awarii aplikacji lub powodowanie system przestanie odpowiadać, lub
free()próby zwolnić pamięć, która nigdy nie została przydzielona.
Aby użyć poprawnie ASSERT, przykładowy kod powinny zostać zmienione do następującego:
enum {
sizeOfBuffer = 20
};
char *buf;
buf = (char *) calloc(sizeOfBuffer, sizeof(char) );
ASSERT( buf != NULL );
strcpy_s( buf, sizeOfBuffer, "Hello, World" );
free( buf );
Lub sprawdź, czy można użyć zamiast tego:
enum {
sizeOfBuffer = 20
};
char *buf;
VERIFY(buf = (char *) calloc(sizeOfBuffer, sizeof(char) ));
strcpy_s( buf, sizeOfBuffer, "Hello, World" );
free( buf );