To właśnie programista może w znacznym stopniu przyczynić się do tego, iż wykrywanie błędów i walka z nimi staną się zadaniami łatwiejszymi i bardziej skutecznymi -- tę właśnie tezę Autor stara się udowodnić w niniejszej książce, ilustrując swe wywody konkretnymi przykładami.
Niektóre ze wskazówek i zaleceń zawartych w treści niniejszej książki sprzeciwiają się wielu powszechnie przyjętym praktykom programowania i jako takie prowokować mogą do stwierdzeń w rodzaju "nikt tak nie pisze" lub "wszyscy łamią tę regułę". Warto wówczas zastanowić się nad przyczyną -- jeżeli "nikt tak nie pisze", to dlaczego? Czy przypadkiem stare nawyki nie okazują się silniejsze od racjonalności?
Odpowiedź na te i inne pytania Czytelnik znajdzie w tej książce.
Author(s): Steve Maguire
Publisher: Helion
Year: 2002
Przedmowa do wydania polskiego (9)
Wstęp (15)
Dwa najważniejsze pytania (16)
Nazewnictwo (17)
Rozdział 1. Hipotetyczny kompilator (21)
Poznaj swój język programowania (23)
Pożyteczne Narzędzie - Lint (27)
To tylko kosmetyczne zmiany (27)
Nigdy więcej błędów (28)
Rozdział 2. Sprawdzaj samego siebie (31)
Przypowieść o dwóch wersjach (32)
Asercje (33)
"Niezdefiniowane" oznacza "nieprzewidywalne" (36)
Zagadkowe asercje (37)
Kompatybilność kontrolowana (39)
Gdy niemożliwe staje się możliwe (43)
Nic o nas bez nas (45)
Co dwa algorytmy, to nie jeden (48)
Usuwaj błędy jak najwcześniej (52)
Rozdział 3. Ufortyfikuj swoje podsystemy (59)
Jest błąd, nie ma błędu (60)
Zutylizuj swoje śmieci (62)
Jestem już gdzie indziej (66)
Kontroluj wykorzystanie pamięci (69)
Spójrz na to, czego nie widać (72)
Wybieraj rozsądnie (76)
Szybki czy bezbłędny (77)
Teraz lub później (77)
Rozdział 4. Jak wykonuje się Twój kod (81)
Uwiarygodnij swój kod (82)
Przetestuj wszystkie rozgałęzienia (83)
Żywotne znaczenie przepływu danych (85)
Czy czegoś nie przeoczyłeś (87)
Spróbuj, a polubisz (88)
Rozdział 5. Niekomunikatywne interfejsy (91)
getchar() zwraca liczbę, nie znak (92)
realloc() a gospodarka pamięcią (94)
Uniwersalny menedżer pamięci (96)
Nieprecyzyjne parametry (98)
Fałszywy alarm (101)
Czytanie pomiędzy wierszami (103)
Ostrzegaj przed niebezpieczeństwem (105)
Diabeł tkwi w szczegółach (108)
Rozdział 6. Ryzykowny biznes (111)
int intowi nierówny (112)
Nadmiar i niedomiar (116)
"Projekt" czy "prawie projekt" (118)
Po prostu robią, co do nich należy (120)
Przecież to to samo (124)
?: to także if (125)
Precz z redundancją (128)
Wysokie ryzyko, bez odwrotu (129)
Przeklęta niespójność (133)
Nie przypisuj zmiennym informacji diagnostycznych (135)
Nie warto ryzykować (137)
Rozdział 7. Dramaturgia rzemiosła (141)
Szybkość, szybkość (142)
Złodziej otwierający zamek kluczem nie przestaje być złodziejem (144)
Każdemu według potrzeb (146)
Nie uzewnętrzniaj prywatnych informacji (148)
Funkcje-pasożyty (150)
Programistyczne śrubokręty (153)
Syndrom APL (155)
Bez udziwnień, proszę (156)
Na śmietnik z tymi wszystkimi trikami (158)
Rozdział 8. Reszta jest kwestią nawyków (163)
Hokus-pokus, nie ma błędu (163)
Zrób dziś, co masz zrobić jutro (165)
Doktora!!! (166)
Jeśli działa, nie poprawiaj (167)
Funkcja z wozu, koniom lżej (169)
Elastyczność rodzi błędy (169)
Spróbuj (171)
Święty Harmonogram (172)
"Tester" - nazwa w sam raz dla testera (173)
Programista zawinił, testera powiesili (175)
Zdefiniuj swe priorytety (176)
Epilog (181)
Dodatek A Lista kontrolna kodowania (183)
Dodatek B Podprogramy zarządzania pamięcią (189)
Dodatek C Odpowiedzi (197)
Skorowidz (225)