Konflikty międzyaplikacyjne

W przypadku tak złożonych systemów operacyjnych (OS) producenci systemów operacyjnych rutynowo dystrybuują wymagania dotyczące kodu i określone parametry do producentów oprogramowania aplikacji, aby zminimalizować prawdopodobieństwo konfliktów programów lub nieoczekiwanych przestojów. Chociaż z pewnością pomaga to zmniejszyć liczbę problemów i poprawia zgodność w przód i wstecz z poprzednimi wersjami systemu operacyjnego, czasami nawet dostawcy systemów operacyjnych doświadczają lub powodują trudności, gdy nie są zgodne z parametrami ustalonymi dla ich własnych programów.

Wyczerpanie zasobów

Wyczerpywanie się w programie szybkiej pamięci (pamięć o dostępie swobodnym lub RAM), pamięć masowa (dysk), cykle jednostki centralnej (CPU), wpisy w tabeli systemu operacyjnego, semafory lub inne zasoby mogą spowodować awarię programu. Na przykład niewystarczająca pamięć główna może powodować zamianę danych na dysk, zwykle powodując drastyczne zmniejszenie przepustowości

Stan obciążenia

Wszystkie programy i systemy mają ograniczenia dotyczące pojemności pamięci, liczby użytkowników, transakcji i przepustowości. Błędy obciążenia mogą wystąpić z powodu dużej objętości, która obejmuje dużą ilość pracy przez długi czas, lub dużego obciążenia, które obejmuje maksymalne obciążenie jednocześnie.

Warunki wyścigu

Gdy między zdarzeniem A a zdarzeniem B dochodzi do wyścigu, do prawidłowego działania wymagana jest określona sekwencja zdarzeń, ale ta sekwencja nie jest zapewniana przez program. Na przykład, jeśli proces A blokuje zasób 1 i czeka na odblokowanie zasobu 2, podczas gdy proces B blokuje zasób 2 i czeka na odblokowanie zasobu 1, nastąpi śmiertelne uścisk, który zawiesza operacje. W systemach wieloprocesorowych i systemach interaktywnych można się spodziewać warunków wyścigowych, ale mogą one być trudne do odtworzenia; na przykład opisany właśnie śmiertelny uścisk może zdarzyć się tylko raz na 1000 transakcji, jeśli średni czas transakcji jest krótki. W związku z tym warunki wyścigu należą do najmniej przetestowanych.

Przekazywanie parametrów.

Czasami występują błędy w przekazywaniu danych tam i z powrotem między modułami. Na przykład wywołanie funkcji może zostać przypadkowo przekazana zła nazwa zmiennej, aby funkcja działała na niewłaściwych wartościach. W przypadku wystąpienia tych błędów przekazywania parametrów dane mogą zostać uszkodzone, a ścieżka wykonania może zostać zmieniona z powodu nieprawidłowych wyników obliczeń lub porównań. W rezultacie ostatnie zmiany danych mogą zostać utracone lub wykonanie może wpaść w procedury obsługi błędów, nawet jeśli zamierzone dane były poprawne.

Naruszenia warunków granicznych

Termin „granice” odnosi się do największych i najmniejszych wartości, z jakimi program może sobie poradzić; na przykład tablica może być zwymiarowana z 365 wartościami, aby uwzględnić dni w roku, a następnie zawieść w roku przestępnym, gdy program zwiększy licznik dni do 366 i tym samym spróbuje zapisać wartość pod nieprawidłowym adresem. Programy, które ustawiają zmienne zakresy i alokację pamięci, mogą działać w granicach, ale jeśli są nieprawidłowo zaprojektowane, mogą ulec awarii w granicach lub poza nimi. Pierwsze użycie programu również można uznać za warunek brzegowy.

Obliczanie

Gdy program błędnie interpretuje skomplikowane formuły i traci precyzję podczas obliczeń, prawdopodobnie wystąpił błąd obliczeniowy; na przykład wartość pośrednia może być przechowywana w tablicy z 16 bitami precyzji, gdy potrzebuje 32 bitów. Ta kategoria błędów obejmuje również błędy obliczeniowe spowodowane nieprawidłowymi algorytmami.

Przepływ logiczny

Moduły przekazują kontrolę sobie nawzajem lub innym programom. Jeśli wykonanie przejdzie do niewłaściwego modułu, wystąpił błąd przepływu logicznego. Przykłady obejmują wywołanie niewłaściwej funkcji lub rozgałęzienie do podprogramu, który nie zawiera instrukcji RETURN, tak że wykonanie przechodzi przez logiczny koniec modułu i rozpoczyna wykonywanie innego modułu kodu.

Inicjalizacja

Błędy inicjalizacji są podstępne i trudne do znalezienia. Najbardziej podstępne programy zapisują informacje inicjujące na dysku i kończą się niepowodzeniem tylko przy pierwszym użyciu — to znaczy przed utworzeniem pliku inicjującego. Za drugim razem dany użytkownik aktywuje  program, nie ma dalszych błędów inicjalizacji. W związku z tym błędy pojawiają się tylko dla pracowników i klientów, gdy aktywują nową kopię lub instalację wadliwego programu. Inne programy z błędami inicjalizacji mogą wykazywać dziwne obliczenia lub inne wady przy pierwszym użyciu lub inicjalizacji; ponieważ nie przechowują swoich wartości inicjalizacji, te błędy inicjalizacji będą pojawiać się ponownie za każdym razem, gdy program jest używany.

RODZAJE BŁĘDÓW OPROGRAMOWANIA

Wewnętrzne błędy projektowe lub implementacyjne.

Ogólna definicja błędu oprogramowania to niezgodność między programem a jego specyfikacją; bardziej szczegółową definicją jest „niepowodzenie programu w wykonaniu tego, czego rozsądnie oczekuje użytkownik końcowy”. Istnieje wiele rodzajów błędów oprogramowania. Niektóre z najważniejszych to:

* Inicjalizacja

* Przepływ logiczny

* Obliczenia

* Naruszenia warunków brzegowych

* Przekazywanie parametrów

* Warunki wyścigu

* Stan obciążenia

* Wyczerpanie zasobów

* Konflikt zasobów, adresu lub programu z systemem operacyjnym lub aplikacjami

* Względy dotyczące zgodności z przepisami

* Inne błędy