Professional Documents
Culture Documents
PRZYKADOWY ROZDZIA
SPIS TRECI
KATALOG KSIEK
KATALOG ONLINE
ZAMW DRUKOWANY KATALOG
TWJ KOSZYK
DODAJ DO KOSZYKA
CENNIK I INFORMACJE
ZAMW INFORMACJE
O NOWOCIACH
ZAMW CENNIK
CZYTELNIA
FRAGMENTY KSIEK ONLINE
Wydawnictwo Helion
ul. Chopina 6
44-100 Gliwice
tel. (32)230-98-63
e-mail: helion@helion.pl
Niezawodno
oprogramowania
Autor: Steve Maguire
Tumaczenie: Andrzej Grayski
ISBN: 83-7197-429-9
Tytu oryginau: Writing solid code: Microsoft's
techniques for developing bug-free C programs
Format: B5, stron: okoo 400
To wanie programista moe w znacznym stopniu przyczyni si do tego,
i wykrywanie bdw i walka z nimi stan si zadaniami atwiejszymi i bardziej
skutecznymi -- t wanie tez Autor stara si udowodni w niniejszej ksice,
ilustrujc swe wywody konkretnymi przykadami.
Niektre ze wskazwek i zalece zawartych w treci niniejszej ksiki sprzeciwiaj si
wielu powszechnie przyjtym praktykom programowania i jako takie prowokowa
mog do stwierdze w rodzaju nikt tak nie pisze lub wszyscy ami t regu.
Warto wwczas zastanowi si nad przyczyn -- jeeli nikt tak nie pisze, to dlaczego?
Czy przypadkiem stare nawyki nie okazuj si silniejsze od racjonalnoci?
Odpowied na te i inne pytania Czytelnik znajdzie w tej ksice.
SPIS TRECI
NIEZAWODNO OPROGRAMOWANIA
SPIS TRECI
Epilog.............................................................................................................181
Dodatek A Lista kontrolna kodowania ......................................................183
Dodatek B Podprogramy zarzdzania pamici .......................................189
Dodatek C Odpowiedzi ................................................................................197
Skorowidz......................................................................................................225
81
81
82
NIEZAWODNO OPROGRAMOWANIA
83
tem sta si nieodcznym elementem jego pracy i cho moe pocztkowo uciliwe z czasem bdzie po prostu poytecznym nawykiem.
83
84
NIEZAWODNO OPROGRAMOWANIA
powoduje
przydzielenie tu 32-bajtowego bloku pamici i zwrcenie niezerowego wskanika,
zatem blok uwarunkowany instrukcj nie zostaje wykonany. Aby go naprawd
przetestowa, naley zasymulowa bdn sytuacj, czyli zastpi wartoci
dopiero co przypisany wskanik:
Spowoduje to co prawda wyciek pamici wywoany utrat wskazania na przydzielony blok, jednake na etapie testowania zazwyczaj mona sobie na to pozwoli;
w ostatecznoci mona wykona wyzerowanie wskanika zamiast wywoywania
funkcji
:
85
)*
Sprawdziem jej dziaanie w tworzonej aplikacji wyzerowujc fragmenty pamici o rnej wielkoci, zarwno wikszej, jak i mniejszej od zaoonego progu
. Wszystko przebiegao zgodnie z oczekiwaniami; wiedzc jednak o
tym, i zero jest wartoci w pewnym sensie wyjtkow, dla nadania testowi wikszej wiarygodnoci uyem w charakterze wypeniacza innego wzorca arbitralnie wybranej wartoci . Dla blokw mniejszych ni
wszystko byo nadal w naleytym porzdku, jednak dla wikszych blokw warto nadana
zmiennej l w linii
++,-
++./-
++0-
A co z czujnoci kompilatora ?
No wanie. Kod prezentowany w niniejszej ksice przetestowaem osobicie
uywajc piciu rnych kompilatorw; aden z nich, mimo ustawienia diagnostyki na najwyszym moliwym poziomie, nie ostrzeg mnie, i wspomniane instrukcje przesuwajce 16-bitow warto o 16, czy 24 bity powoduj utrat wszystkich
znaczcych bitw. Co prawda kompilowany kod zgodny by w zupenoci ze standardem ANSI C, jednake wynik wspomnianych konstrukcji niemal zawsze odbiega od oczekiwa programisty dlaczego wic brak jakichkolwiek ostrzee?
Prezentowany przypadek wykazuje jednoznacznie konieczno nacisku na producentw kompilatorw, by tego rodzaju opcje pojawiay si w przyszych wersjach
ich produktw. Zbyt czsto my, jako uytkownicy, nie doceniamy siy swej argumentacji w tym wzgldzie...
Ten subtelny bd zostaby niewtpliwie szybko wykryty przez testerw, chociaby ze wzgldu na widoczne konsekwencje (czyli wypenianie duych blokw
deseniem zamiast ), jednake powicenie zaledwie kilku minut
na przeledzenie kodu pozwolio wykry w bd ju na etapie tworzenia funkcji.
Jak pokazuje powyszy przykad, krokowe wykonywanie kodu rdowego
moe nie tylko wskaza przepyw sterowania, lecz take uwidoczni inny, niesamowicie wany czynnik, mianowicie zmian wartoci poszczeglnych zmiennych
85
86
NIEZAWODNO OPROGRAMOWANIA
pomykowe uycie operatora $ moe by tu atwo przeoczone, jednak zaobserwowana zmiana wartoci zmiennej wskutek wykonania instrukcji bd ten natychmiast demaskuje.
87
A co z optymalizacj przekadu?
Wzajemne dopasowanie instrukcji kodu rdowego i rozkazw asemblerowych
moe by znacznie utrudnione, gdy kompilator dokonuje optymalizacji przekadu.
Gwne przejawy optymalizacji to eliminacja zbdnego kodu oraz czne tumaczenie kilku ssiadujcych instrukcji kodu rdowego czyli zjawiska jak najmniej
podane w procesie ledzenia kodu. Znakomit wikszo kompilatorw mona
zmusi do poniechania optymalizacji na etapie testowania programu poprzez odpowiednie ustawienie opcji kompilacji, wielu programistw dostrzega w tym jednak przejaw nadmiernego rnicowania wersji testowej i handlowej produktu. Skoro jednak podstawowym zadaniem testowania jest wyapanie bdw, warto
zastosowa kady zabieg, ktry moe si przyczyni do pomylnego wykonania tego zadania.
W kadym razie warto zawsze przekona si, czy dla konkretnego programu
optymalizacja istotnie utrudnia ledzenie jego kodu by moe w ogle nie trzeba
bdzie jej wycza.
Poza wyjtkowo dokadnym sprawdzaniem skadni wspomnianych instrukcji
lub wywietlaniem wartoci poszczeglnych wyrae (podczas pracy krokowej)
jedynym sposobem wykrycia opisanego bdu jest przeledzenie wykonania programu na poziomie instrukcji asemblera. Wymaga to niewtpliwie kwalifikacji potrzebnych do skojarzenia rozkazw maszynowych z odpowiadajcymi im instrukcjami kodu rdowego, jednak takie bdy jak adresowanie z uyciem
wyzerowanego rejestru segmentowego staj si natychmiast widoczne.
SPRBUJ, A POLUBISZ
Niektrych programistw naprawd trudno skoni do systematycznego ledzenia
wasnych programw lub przynajmniej do sprbowania tego przez np. miesic.
Wymawiaj si brakiem czasu, bd te niechci do jego tracenia. Uwaam, i
87
88
NIEZAWODNO OPROGRAMOWANIA
obowizkiem kadego kierownika projektu jest przekonanie takich opornych programistw, i taka oszczdno jest oszczdnoci zdecydowanie le pojt, gdy
oznacza ryzyko tracenia (w przyszoci) znacznie wikszej iloci czasu na tropienie
bdw w gotowym kodzie, przede wszystkim wanie za pomoc ledzenia krokowego. Myl, e tre niniejszego rozdziau (jak i pozostaych rozdziaw niniejszej
ksiki) dostarcza niezbdnych ku temu argumentw.
Zreszt jeli po przeamaniu pocztkowej niechci podejmie si prb ledzenia stworzonego wanie kodu i skonstatuje, e wiele tkwicych w nim bdw
mona z atwoci wyapa i usun ju w cigu dziesiciu minut, dalsze argumenty okazuj si zbyteczne. W taki oto sposb pocztkowa nieufno ustpuje
miejsca poytecznym nawykom...
PODSUMOWANIE
Bdy nie pojawiaj si znikd, lecz s przyrodzonym elementem kadego nowo tworzonego kodu, bd efektem wprowadzanych do tego kodu modyfikacji.
Wyjania to, dlaczego ledzenie wykonania takich nowych kawakw stanowi
najskuteczniejsz bro w walce z bdami.
Obawy, i ledzenie kodu wymaga jakich ogromnych nakadw czasu, s cakowicie nieuzasadnione. ledzenie kodu trwa na pewno znacznie krcej od jego tworzenia, poza tym z zasady pozwala unikn niepotrzebnej straty czasu
zwizanej z pniejszym wyszukiwaniem bdw w gotowym programie.
ledzenie kodu jest operacj w peni skuteczn jedynie wtedy, gdy ledzeniu
podlegaj wszystkie rozgazienia w kodzie. Naley o tym pamita przy ledzeniu instrukcji warunkowych, ptli oraz wyrae zawierajcych operatory
, i .
W niektrych przypadkach ledzenie kodu rdowego musi by uzupenione
ledzeniem wygenerowanego przekadu w celu zorientowania si, jak w rzeczywistoci przebiega wykonanie konkretnej instrukcji. Konieczno taka nie
zdarza si co prawda zbyt czsto, lecz jeeli faktycznie zaistnieje, nie naley
jej lekceway.
PROJEKT: W rozdziale 1. przedstawiem przykady najczciej wystpujcych
bdw programistycznych oraz pytanie o moliwo automatycznego wykrywania
ich przez kompilatory. Zastanw si, w jakim stopniu krokowe ledzenie kodu moe
zwikszy szans wykrywania ich przez programist.
PROJEKT: Sporzd list bdw programistycznych popenionych przez Ciebie
w cigu ostatnich szeciu miesicy i zastanw si, ilu z nich mona byo zapobiec
przez systematyczne ledzenie stworzonego kodu.