Здравей,
Ще допълня ilinovster с още и по-подробна информация за бъга.
Софтуерният бъг означава грешка в компютърната програма или система, която предизвиква резултат, различен от очаквания. Повечето бъгове са породени от грешките на хората – грешка, допусната в сорс кода или дизайна, или фреймъурковете и операционните системи, на които е качена самата програма. Някои, пък, са поради грешка на компилатора.
Когато един софтуер или нещо от заобикалящия ни свят има много бъгове и/или не работи както трябва, се казва, че е бъгав/дефектен. Рапортите, които описват откритите бъгове се наричат бъг рапорти (бъг репорти) ,например bug/defect/fault/problem/trouble reports , change request и др.
Защо бъговете могат да бъдат пагубни?
Има бъгове, които могат да останат неоткрити, понеже много трудно или рядко се прояват, но има и такива, които биха били критични и биха причинили freeze-ове или crash-ове.
Бъговете могат да причинят грешки в системата, които биха причинили както малки неприятности, свързани със загуба на време, така и на големи като загуба на много пари и на най-вече на човешки животи.
Едини бърз пример: Бъгове в кода, контролиращ Therac-25 (машина за радиотерапия), са били причината за смъртта на няколко пациента през 80-те.
Най-известните типове бъгове са:
От аритметичните:
Делене на 0;
Артитметично пренатоварване или сгъстяване – Arithmetic overflow/underflow
Първото е когато имаме като резултат от една операция едно огромно число – толкова голямо,че не може да бъде изписано и поражда eror или при операции с еднакви или различни знаци да не може да определи верният знак на резултата, а второто е когато числотото е прекалено малко (с по-малка абсолютна стойност от колкото може компютърът да запази в паметта).
Загуба на аритметичната точност, поради закръгляне или числово нестабилни алгоритми.
Логически бъгове – това са бъгове при обработването на информацията в софтуера:
Infinite loops (безкрайни цикли) и infinite recursion (безкрайна рекурсия). Рекурсия какво означава го имаме в предишен въпрос и е отговорен, а infinite loops – това са безкрайни цикли, които нямат терминиращо условие или terminating condition на български и затова се повтарят безкрайно и могат да затлачат компютъра така, че без рестарт да не може да се оправи.
Пример за безкраен цикъл:
while (true) {
console.log("Infinite Loop");
}
и пример за безкрайна рекурсия:
(define Ω
(let ([ω (lambda (f) (f f))])
(ω ω)))
Syntax bugs или синтактични бъгове – това са бъгове свързани със синтаксиса в кода. Грешна операция, например x=5 вместо x==5 , при някои езици х=5 ще сложи на х стойността 5, докато в други х==5 ще провери дали х в момента е 5 или някое друго число.
С добър компилатор ще ви покаже, ако имате грешка и ще ви излезе предупреждение или грешка, но в противен случай няма как да разбере докато не видите 2-ри път.
Resource bugs – бъгове свързани с ресурсите:
Null pointer – има референция към празен или невалиден обект;
Ползване на неинициализирана променлива;
Ползване на грешен тип данни;
Нарушаване на достъпа (Access violation или също така segmentation fault) – бъг породен от хардуер с memory protection, който съобщава на операционната система, че има нарушение на достъпа;
Memory leaks – теч на паметта. Едно приложение може да работи идеално до някое време и след това да почне да изисква много повече ресурс за вършене на същата работа, бъг породен от постоянна алокация на реурси без освобождаване. Често срещан проблем при игри, програми и драйвъри;
Buffer overflow;
Double free error и др.
Multi-threading programming bugs:
Deadlock – бъг при който една задача или един task (А) не може да продължи преди друг task (B) да свърши и в същото време B не може да продължи преди A да свърши;
Race condition – компютърът не прави задачите в оказаният му ред.
Interfacing bugs – бъгове свързани с интерфейса:
Incorrect API usage – неправилно използване на приложно програмния интерфейс;
Incorrect protocol implementation;
Incorrect hardware handling;
Incompatible systems - несъвместими системи.
Performance bugs:
Бъгове свързани с RAM-та (random access memory-то) или RDM (random disk memory-то);
Прекалено голямата сложност на един алгоритъм.
И не на последно място – нещо свързано с QA-ството:
Teamworking bugs:
Липса или грешни коментари по дадената работа, които е трябвало да остави;
Разлики между документацията и актуалния продукт.