C/Błędy: Różnice pomiędzy wersjami

Usunięta treść Dodana treść
m Dodano kategorię "C" za pomocą HotCat
linki, literówki, zbędne spacje
Linia 2:
'''Błąd ''' (oprogramowania, programu) (ang. bug) jest to [[C/Błędy#Obs.C5.82uga_b.C5.82.C4.99d.C3.B3w_i_wyj.C4.85tk.C3.B3w|usterka programu komputerowego]] powodująca jego nieprawidłowe działanie<ref>[[w:Błąd (informatyka)|błąd w wikipedii]]</ref> Przykłady typowych błędów<ref>[http://www.forbot.pl/forum/topics20/programowanie-pulapki-jezyka-c-vt9178.htm programowanie-pułapki-jezyka-c]</ref><ref>[http://www.drpaulcarter.com/cs/common-c-errors.php|common c errors]</ref>
 
'''Sygnał''' ( ang. signal ) jest to [[Programowanie:C:Biblioteka_standardowa:Indeks_tematyczny#signal.h |informacja przesyłana do procesu]].
 
'''Wyjątek''' (ang. exception) jest to przewidziany przez programistę błąd programu <ref>[http://www.math.uni.opole.pl/~zlipinski/pr2d/Programowanie2-cpp-Wyklad-11.pdf Z Lipiński : Programowanie w Cpp ]</ref>
 
=Typy=
Ze względu na '''przyczynę''' błędy dzieli się na trzy główne typy :
* [[C/Używanie_kompilatora#B.C5.82.C4.99dy_sk.C5.82adniowe| błędy składniowe]] – nie pozwalają na kompilację programu, jak np. literówka w wywołaniu zmiennej. Są one najczęściej dość łatwe do usunięcia, zazwyczaj wynikają z drobnych pomyłek programisty.
* błędy semantyczne (znaczeniowe) – część błędów semantycznych można wychwycić już w momencie kompilacji, np. próbę odwołania się do nieistniejącej funkcji, lecz inne mogą ujawnić się dopiero w trakcie wykonywania.
* błędy logiczne – nie przerywają kompilacji, lecz powodują niewłaściwe działanie warstwy logicznej jak np. niepoprawne wyznaczanie pozycji gracza (które także może być spowodowane literówką – jak np. wpisanie znaku „+” zamiast „-”). Ten typ błędów jest znacznie trudniejszy do wykrycia i usunięcia; często błąd tkwi w jednym źle zapisanym znaku, lecz programista musi do tego znaku sam dojść (w przypadku błędu składniowego znak jest wskazywany przez komunikat kompilatora).
 
Ze względu na '''moment wykrycia''' błędy dzielimy na :
* błędy wykryte przy kompilacji
* błędy wykryte przy uruchomieniu
Linia 21:
==Błędy przy uruchamianiu==
 
Błędy przy uruchamianiu programu ( = błędy wykonania , ang. run-time errors )
* Naruszenie ochrony pamięci ( ang. Segmentation fault) mogą być spowodowane przez :<ref>[[w:Naruszenie ochrony pamięci| wikipedia : Naruszenie ochrony pamięci]]</ref>
** przepełnieniem stosu ( ang. stack overflow ) <ref>[http://students.mimuw.edu.pl/SO/Projekt04-05/temat5-g2/kulewski/pax.html W Sikora-Kobyliński, M Czępiński, G Kulewski : Ostatnia linia obrony przed atakiem ]</ref>
** dostęp do tablicy z użyciem indeksu poza jego zakresem ( Index > IndexMax )
** użycie <code>scanf("%d", x);</code> zamiast <code>scanf("%d", &x);</code><ref>[http://www.faqs.org/qa/qa-673.html ...definition of "Segmentation Fault" - Where is...]</ref>
** przepełnienie bufora<ref>[[w:Przepełnienie bufora|Przepełnienie bufora w wikipedii]]</ref><ref>[https://www.owasp.org/index.php/Buffer_Overflows Open Web Application Security Project]</ref><ref>[http://www1.maths.leeds.ac.uk/~read/bofs.html Smashing The Stack For Fun And Profit by Aleph One]</ref>
*** przepełnienie bufora stosu<ref>[http://duartes.org/gustavo/blog/post/journey-to-the-stack/ Journey to the Stack, Part I by Gustavo Duarte Mar 10th, 2014]</ref>
*** przepełenienieprzepełnienie bufora sterty
* [[C/Wskaźniki#Popularne_b.C5.82.C4.99dy|Błędy z użyciem wskaźników]]
* [[C/Czytanie_i_pisanie_do_plików#Obs.C5.82uga_b.C5.82.C4.99d.C3.B3w|Błędy przy obsłudze plików]]
Linia 38:
 
Może być spowodowane:
* rekursją : nieskończoną lub zbyt głęboką
* rozmiarem zmiennych statycznych ( stosu)
 
=====Rekursja=====
Program powoduje nieskończoną rekursję :
<source lang=c>
#include <stdio.h>
Linia 61:
</source>
 
Program kompiluje się bez problemów :
 
gcc c.c -Wall
ale jego uruchomienie powoduje błąd :
./a.out
Linia 71:
 
=====Rozmiar zmiennych=====
Poniższy program tworzy styczne tablice o coraz większywiększym rozmiarze aż do powstania błędu związanego z dostępem do pamięci :
 
<source lang=c>
Linia 107:
 
Tablice statyczne są zapisywane w stosie więc następuje przepełnienie stosu<ref>[[w:en:Stack overflow|Przepełnieniestosu w ang wikipedii]]</ref> :
Wynik :
 
<pre>
Linia 120:
 
 
Co dziwne największa możliwa do utworzenia tablica ma rozmiar 8376 kB, co jest większe niż ustalony maksymalny rozmiar stosu :
 
ulimit -s
Linia 129:
 
 
Potencjalne '''rozwiązania''' problemu :
* zmiana zmiennych na dynamiczne
* zmiana limitu wielkości stosu
Linia 175:
</source>
 
Kompilujemy program bez problemów :
 
gcc b.c -Wall
 
Uruchamiamy :
 
./a.out
Wynik :
strcpy() NOT executed....
Syntax: ./a.out <characters>
 
Zapomnieliśmy wprowadzić dane, program dopomina się o nie. Ponownie uruchamiamy :
 
./a.out 1234
 
Wynik :
 
mybuffer content= 1234
Linia 205:
strcpy() executed...
 
Wprowadzenie więcej niż 8 znaków :
 
./a.out 123456789
 
powoduje błąd :
mybuffer content= 123456789
Linia 219:
 
==Dokumentacja==
* ręczna ( [[C/Podstawy#Komentarze_i_styl|komentarze]] )
* automatyczna
** Doxygen<ref>[http://www.openlogic.com/wazi/bid/188121/Doxygen-Magically-Turns-Source-Code-into-Documentation Doxygen Magically Turns Source Code into Documentation by Carla Schroder]</ref>
Linia 228:
** GNU<ref>[http://www.gnu.org/prep/standards/standards.html GNU Coding Standards]</ref>
 
Wcięcia ( ang. Indent style <ref>[[wW:en:Indent_styleIndent style|Indent_style - englishangielska wikipediaWikipedia]]</ref>):
* kernel <ref>[https://www.kernel.org/doc/Documentation/CodingStyle Kernel coding style]</ref>
* K&R
* GNU
 
Automatyczne formatowanie :
 
* style Emacsa ( automatyczne formatowanie ) <ref>[http://www.emacswiki.org/emacs/IndentingC wcięcia w c - Emacs]</ref>
 
Automatyczne formatowanie :
* style Emacsa ( automatyczne formatowanie ) <ref>[http://www.emacswiki.org/emacs/IndentingC wcięcia w c - Emacs]</ref>
 
==Bezpieczne programowanie==
W C nie ma automatycznego :
* sprawdzania zakresów indeksu tablicy ( ang. no bounds checks on array )
* wskaźników ( ang. pointer references )
 
Funkcje, których należy unikać dotyczą : <ref name=":0">[http://web.archive.org/web/20120305151402/http://www.ibm.com/developerworks/library/s-buffer-defend.html Protect your code through defensive programming by Gary McGraw, John Viega]</ref>
* operacji na łańcuchach
 
Linia 249 ⟶ 247:
 
{| class="wikitable" border="1"
|+ Niebezpieczne funkcjiefunkcje i ich bezpieczne zamienniki<ref>[http name="://www.ibm.com/developerworks/library/s-buffer-defend.html0" Protect your code through defensive programming by Gary McGraw, John Viega]</ref>
! niebezpieczna !! opis ryzyka !! bezpieczna
|-
Linia 316 ⟶ 314:
 
=Wykrywanie i usuwanie=
 
 
== testy programu==
Liczbę błędów można też ograniczyć przeprowadzając testy programu.
Linia 326 ⟶ 322:
=Obsługa błędów i wyjątków=
 
W języku C są funkcje i makra do kontroli błędów :<ref>[http://prac.us.edu.pl/~siminski/cxx/pjp_cxx_06.pdf|Roman Simiński: Programowanie w C++ ]</ref><ref>[http://www.gnu.org/software/libc/manual/html_node/Floating-Point-Errors.html#Floating-Point-Errors|libc libc: Errors in Floating-Point Calculations]</ref>
]</ref>
 
* assert(),
Linia 336 ⟶ 331:
*[[Programowanie:C:Biblioteka_standardowa:Indeks_tematyczny#errno.h|errno.h]] -
* [[C/perror|perror]]
* [[C/fenv|fenv.h]] <ref>[http://pubs.opengroup.org/onlinepubs/009695399/basedefs/fenv.h.html|opengroup opengroup: fenv.h]</ref>
* FP Exceptions <ref>[http://www.gnu.org/software/libc/manual/html_node/FP-Exceptions.html#FP-Exceptions|libc libc: FP Exceptions]</ref>
 
=Źródła=
=Żródła=
 
<references/>