[ Pobierz całość w formacie PDF ]
.Na tak postawione pytaniemo¿na odpowiedzieæ jedynie innym pytaniem — czy wprowadzone zmiany na pewno,bez ¿adnych w¹tpliwoœci, wolne s¹ od jakichkolwiek b³êdów? To prawda, i¿przeœledzenie ka¿dego nowego (lub zmodyfikowanego) fragmentu kodu wymaga trochêczasu, lecz jednoczeœnie fakt ten staje siê nieoczekiwanie przyczyn¹interesuj¹cego sprzê¿enia zwrotnego — mianowicie programiœci przywykli dokonsekwentnego œledzenia w³asnego kodu wykazuj¹ tendencjê do pisania krótkich iprzemyœlanych funkcji, bowiem doskonale wiedz¹, jak k³opotliwe jest œledzeniefunkcji rozwlek³ych, pisanych bez zastanowienia.Nie nale¿y tak¿e zapominaæ o tym, by przy wprowadzaniu zmian do kodu ju¿przetestowanego zmiany te nale¿ycie wyró¿niaæ.Wyró¿niamy w ten sposób tefragmenty, które istotnie wymagaj¹ testowania; w przeciwnym razie ka¿da zmianakodu mo¿e pozbawiæ istniej¹cy kod wiarygodnoœci uzyskanej drog¹ czasoch³onnegotestowania — niczym odrobina ¿Ã³³ci zdolnej zepsuæ beczkê miodu.W prawid³owo dzia³aj¹cym programie wywo³anie funkcji malloc powodujeprzydzielenie tu 32-bajtowego bloku pamiêci i zwrócenie niezerowego wskaŸnika,zatem blok uwarunkowany instrukcj¹ if nie zostaje wykonany.Aby go naprawdêprzetestowaæ, nale¿y zasymulowaæ b³êdn¹ sytuacjê, czyli zast¹piæ wartoœci¹ NULLdopiero co przypisany wskaŸnik:pbBlock = (byte *)malloc(32);pbBlock = NULL;if (pbBlock == NULL){.obs³uga b³êdu}Spowoduje to co prawda wyciek pamiêci wywo³any utrat¹ wskazania na przydzielonyblok, jednak¿e na etapie testowania zazwyczaj mo¿na sobie na to pozwoliæ; wostatecznoœci mo¿na wykonaæ wyzerowanie wskaŸnika zamiast wywo³ywania funkcjimalloc:/* pbBlock = (byte *)malloc(32); */pbBlock = NULL;if (pbBlock == NULL){.obs³uga b³êdu}Na podobnej zasadzie nale¿y przetestowaæ ka¿d¹ ze œcie¿ek wyznaczonych przezinstrukcje if z fraz¹ else, instrukcje switch, jak równie¿ operatory &&, || i?:.Pamiêtaj o przetestowaniu ka¿dego rozga³êzienia w programie.¯ywotne znaczenie przep³ywu danychPierwotna wersja stworzonej przeze mnie funkcji memset, prezentowanejw rozdziale 2., wygl¹da³a nastêpuj¹co:void *memset(void *pv, byte b, size_t size){byte *pb = (byte *)pv;if (size >= sizeThreshold){unsigned long l;l = (b
[ Pobierz całość w formacie PDF ]
Darmowy hosting zapewnia PRV.PL