Winuser's Blog

5 grudnia 2011

część I : Dlaczego ten kod źle działa ? (C++)

Filed under: C++,Programowanie — winuser @ 3:09
Tags: , ,

Tak to już jest w życiu kodera, że często popełnia głupie błędy. Często te błędy są banalne, kuriozalne, groteskowe i jak chcecie je jeszcze nazywajcie. Sam już nieraz się z tym spotkałem (we własnym kodzie). Było to jakiś miesiąc temu kiedy siedziałem nad pewnym błędem a debugowanie aplikacji wcale nie dawało tak jasnych odpowiedzi na pytania jak wtedy tego chciałem. Zdarza się, że w człowiek jest tak „zagoniony” że poprostu nie zauważa jak oto walnął pięknego byka w kodzie (dla osoby z zewnątrz może być on widzialny dosłownie na pierwszy rzut oka).

Pierwszym przykładem, jest operator != bardzo często zresztą stosowany w przeróżnych pętlach, if`ach itd. Dlaczego może on być zagrożeniem ? Popatrzmy na przykład w kodzie :

void Fun()
{
    static unsigned int ret = 0;
    char* buf = NULL;

    ret = klasa->recv()

    if(ret != 0)
    {
        buf = new char[ret];
        // tutaj cos robimy z buf
        delete [] buf;
    }
}

Przykład trywialny, pod pewnym względem z nie wiadomo skąd wzięty. Załóżmy że metoda recv z klasy klasa zwróci nam -1 (dajmy na to kod błędu). Samo sprawdzenie czy nie jest równe 0 nie daje nam w tym przypadku bezpieczeństwa. Zostanie utworzona (złe słowo, będzie próba utworzenia) tablicy z ujemnym rozmiarem, co oczywiscie zaowocuje access violation. Sam na czymś podobnym się złapałem i postanowiłem troszkę bardziej myśleć przy warunkach.

Kolejny ładny przykład, znów groteskowy. Łatwo o niego gdy już jesteśmy mocno zmęczeni :

void Fun(int elem_id)
{
    for(int current_id = 0;
    current_id < elem_id; ++elem_id)
    {
        cout << current_id;
    }
}

Istnieje wiele wersji tej pętli („dlaczego te gówno nie chce działać ?!”), np

void Fun(int elem_id)
{
    for(int current_id = 0; current_id < elem_id; ++current_id)
    {
        klasa->Operacja(--current_id);
    }
}

Może ci się to wydawać śmieszne (albo i nie jeśli sam przeżywasz często to co ja) ale po 20 h pisania niemal non stop naprawde trudno to dostrzec. Po prostu wiesz, że produkujesz shit (bo jak inaczej nazwać podobne konstrukcje), męczysz się, podnosisz ciśnienie 6 kawą i nie możesz dostrzec tego głupiego błędu ! Ale to już w sumie temat na innego posta.

W najbliższym czasie wrzucę część drugą wpisu, tym razem będzie ona dotyczyć języka PHP.

Advertisements

1 komentarz »

  1. Że te dwie ostatnie funkcje są jednymi z „wielu wersji tej samej pętli”, to bym nie powiedziała. Ale fakt – oba te błędy są fantastyczne. Człowiek je znajduje i nie wie, co ma o sobie myśleć XD

    Komentarz - autor: Astroni — 15 grudnia 2012 @ 0:10 | Odpowiedz


RSS feed for comments on this post. TrackBack URI

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Log Out / Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Log Out / Zmień )

Facebook photo

Komentujesz korzystając z konta Facebook. Log Out / Zmień )

Google+ photo

Komentujesz korzystając z konta Google+. Log Out / Zmień )

Connecting to %s

%d blogerów lubi to: