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ł''' (
'''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 (
* Naruszenie ochrony pamięci (
** przepełnieniem stosu (
** dostęp do tablicy z użyciem indeksu poza jego zakresem (
** 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>
***
* [[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ą
* rozmiarem zmiennych statycznych (
=====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
<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 (
* 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 (
* kernel <ref>[https://www.kernel.org/doc/Documentation/CodingStyle Kernel coding style]</ref>
* K&R
* GNU
* style Emacsa (
▲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 (
* wskaźników (
Funkcje, których należy unikać dotyczą
* operacji na łańcuchach
Linia 249 ⟶ 247:
{| class="wikitable" border="1"
|+ Niebezpieczne
! 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
* 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
* FP Exceptions <ref>[http://www.gnu.org/software/libc/manual/html_node/FP-Exceptions.html#FP-Exceptions
=Źródła=
<references/>
|