ScanImage63 (2)

ScanImage63 (2)



Kompletne kody źródłowe

1 PTńazwa pliku

- plik znajduje się na krążku Eksperta jj^| nazwa pliku

- plik w całości znajduje się na krążku, pokazany tu jest tylko jego fragment


W Tablica4 tab;, .

W cout£ i^get (0) «

Cm!«tab.get(4) «



Łata na kodzie

Błędy w programach są zmorą programistów i użytkowników aplikacji. Ekspert pokaże, jak bronić się przed nieprawidłościami


Wyeliminowanie wszystkich błędów ze stworzonych przez nas programów nie jest zadaniem prostym, a w wypadku złożonych aplikacji wręcz praktycznie niemożliwym. Przekonujemy się o tym na co dzień, instalując wciąż nowe łatki do przeglądarek internetowych czy systemów operacyjnych. Nie oznacza to jednak, że wolno nam świadomie dopuszczać do powstania błędów, wręcz przeciwnie, należy zrobić wszystko, aby nasze programy były od nich wolne. Jak sobie więc radzić z błędami w kodzie? Ekspert pokaże to na prostych przykładach.

Błędne odwołanie do pamięci

Załóżmy, że w naszym programie wykorzystujemy klasę o nazwie Tablicał, której zadaniem jest przechowywanie czterech nieujem-nych wartości całkowitych, na przykład 10, 20,

30 i 40 • (ponie-waż tó tylko ilustracja pewnego problemu, rezygnujemy z tworzenia pliku na-


Wystąpił pioblcm z aplikacją program.exo i zostanie ono zamknięta. Przepraszamy za kłopoty.


Jeżei jestei w trakete pracy, informacje, nad którymi pracujesz, mogły zostać utracone.


Przekaż informacje o tym problemie firmie Microsoft

Utworzyliśmy raport o błędach, który możesz nam przysłać. Raport ten zostanę potraktowany poufnie i anonimowo


Aby zobaczyć, co zawiera len raport o błędach.


klikni tułał.


Wyśłj raport o błędach Nie wysyłaj


O ile pierwszy wiersz zawierający wartość 10 wydaje się poprawny, to drugi wiersz zawiera zupełnie przypadkowe dane. Dlaczego? Otóż skoro w klasie Tablica4 znajduje się czteroelementowa tablica, to największym możliwym indeksem jest 3. Próba pobrania elementu o indeksie 4 musi zatem skończyć się niepowodzeniem. Ten problem nie ogranicza się jednak tylko do uzyskiwania przypadkowych wyników. W rzeczywistości usterka jest bardzo poważna, odwołanie bowiem do miejsca w pamięci, w którym hipotetycznie powinien znajdować się piąty (o indeksie 4) element tablicy, faktycznie nastąpiło. To niebezpieczna sytuacja. Ponieważ w przykładzie Eksperta przesunięcie poza obszar rzeczywistych danych było niewielkie, odczytaliśmy obszar pamięci wciąż należący do naszego programu. Wystarczy jednak sięgnąć w pamięć nieco dalej, aby spowodować interwencję systemu operacyjnego. Zamieńmy więc wiersz:

cout « tab.get(4) « endl;

na przykład na:

cout « tab.get(10004) « endl;

Po kompilacji i uruchomieniu kodu zoba-jcz^rmyznanewszystkim użytkownikom Windows okno •. A więc program wykonał nieprawidłową operację polegającą na próbie dostępu do obszaru pamięci nienależą-cej do niego. Jak rozwiązać ten problem? Ekspert przedstawia trzy rozwiązania.


class Tablica4{ priyate: int tob[4J; €1 public:

Tablica4();    ^

int get(int); ^£1

>?

Tablica4::Tablica4(){ tabj0] = >0; tab[l) » tab[2] = 30; tab[3] :

}


20;

40;


int Tablicaó::get(int indeks){ return tab[indeks};

>


60 LUTY 2007


ekspert


główkowego i cały kod zapisujemy w jednym pliku Tablicał.cpp).

W sekcji private znajduje się czteroele-mentowa tablica liczb całkowitych «i a w sekcji public 43 deklaracje konstruktora i metody get. Konstruktor wypełnia tablicę danymi, natomiast zadaniem metody get jest pobranie elementu o indeksie wskazanym przez argument indeks.

Program korzystający z klasy Tablicał mógłby wyglądać tak ę. Jest w nim tworzo-

tinclude <iosti:eam> ^ linclude "Tablica^.cpp"

using namospace std;


int main{)

Tablica4 tab; €1

cout « tab.get{0) « endl;

cout « tab.get(4) << endl;

>    r


€1


Wartość specjalna

Podstawowym błędem w przedstawionym kodzie jest brak weryfikacji poprawności otrzymywanego argumentu w metodzie get. Skoro tablica w klasie Tablica^ ma cztery elementy, to metoda get musi sprawdzać, czy wartość argumentu indeks zawiera się w przedziale 0-3. Co jednak zrobić po wykryciu nieprawidłowej wartości? Należałoby to w jakiś sposób zasygnalizować. Jedną z metod jest zwrócenie wartości specjalnej, która nie mogłaby się pojawić w przypadku prawidłowego argumentu. Kod mógłby więc mieć następującą postać <


W metodzie get znalazła się tym razem instrukcja warunkowa if badająca, czy wartość



Wyszukiwarka

Podobne podstrony:
ScanImage73 (2) PRZYDATNE KODY DO DELPHI - plik znajduje się na krążku Eksperta nazwa pliku Na CD-RO
ScanImage73 (2) PRZYDATNE KODY DO DELPHI - plik znajduje się na krążku Eksperta nazwa pliku Na CD-RO
61053 ScanImage73 (2) PRZYDATNE KODY DO DELPHI - plik znajduje się na krążku Eksperta nazwa pliku Na
ScanImage81 (2) ROZWIĄZANIA PROBLEM*Czy warto zmienić system plików z FAT32 na NTFS? Każdy plik znaj
161 4 Przykładowy plik źródłowy znajduje się na dyskietce, która była dostarczona wraz z maszyną.. Z
Zdj?cie0878 GŁÓWNY KOMPLEKS ZGODNOŚCI TKANKOWEJ (MHC) Znajduje się na krótkim ramieniu chromosomu 6
W długiej (kilkanaście metrów) rurze do przyśpieszeń znajduje się na jednym jej końcu źródło elektro
img218 (5) 212 Sieci samoorganizujące się ronów. Tylko neurony znajdujące się na brzegu sieci nie ma
Źródło światła oświetla scenę, odbijając światło od wszystkich znajdujących się na niej

więcej podobnych podstron