• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

[C++] Błąd debuggera

Object Storage Arubacloud
0 głosów
190 wizyt
pytanie zadane 2 sierpnia 2016 w C i C++ przez JAKUBW Nałogowiec (33,470 p.)

Witam,

mógłby mi ktoś powiedzieć na czym polega problem zaznaczany przez debugger w tym kodzie?

Ogólnie to program wypisuje swoją nazwę oraz miejsce na dysku.

#include <iostream>

int main(int argc,char *argv[] )
{
    std::string temp = argv[0];
    std::string appName = "";
    std::string appLocation = "";
    for(unsigned int i = temp.length(); i >= 0 ; i--)
    {
        if(temp[i] == '\\')
        {
            for(unsigned int j = i+1; j < temp.length() ; j++)
                appName += temp[j];
            for(unsigned int j = 0 ; j<i; j++)
                appLocation += temp[j];
            break;
        }
    }
    
    std::cout<<appName<<std::endl;
    std::cout<<appLocation<<std::endl;

    return 0;
}

Nie wiem czy można nazwać to błędem, bo działa dobrze tylko gdy włączę debugger to zatrzymuje się w miejscu:

                appLocation += temp[j];

I pisze:

W czym probelm? Co robię źle?

Używam CodeBlocks.

Pozdrawiam.

1 odpowiedź

0 głosów
odpowiedź 2 sierpnia 2016 przez MetRiko Nałogowiec (37,110 p.)
wybrane 2 sierpnia 2016 przez JAKUBW
 
Najlepsza

Co do problemu.. Sygnał SIGSEGV jest zwracany jeżeli nastąpiła próba dostania się do zabezpieczonego obszaru pamięci.
Czytaj więcej: 
https://pl.wikipedia.org/wiki/Naruszenie_ochrony_pami%C4%99ci
Jeżeli kompilujesz program w wersji debug to debuger sam zadba o to by taka wartość nie została zmieniana.. natomiast na wersji release już nie.. dlatego wywala błąd. 
Winowajcą (prawdopodobnie) jest m.in. ta linijka:
for(unsigned int i = temp.length(); i >= 0 ; i--)
Do zmiennej [i] przypisujesz długość stringa [temp].. Jak wiadomo string jest tablicą znaków.. a tablice są indeksowane od 0 w takim razie pisząc temp[i].. modyfikujesz/sprawdzasz już część pamięci, która nie jest częścią stringa. Chociaż w tym wypadku temp[i] będzie wskazywać jeszcze na stringa.. dokładnie mówiąc na znak '\0'.
A jeżeli chodzi o sam program.. tu masz prostsze rozwiązanie x)
* funkcja std::rfind zwraca indeks znaku (wprowadzonego w pierwszym argumencie), zaczynając skanowanie od końca.

#include <iostream>

int main(int argc, char *argv[] )
{
    std::string temp=argv[0];

    std::string appName = temp.substr(0,temp.rfind('\\'));
    std::string appLocation = temp.substr(temp.rfind('\\')+1);
    //Dla optymalizacji możesz zapisać wartość temp.rfind('\\') w osobnej zmiennej x)

    std::cout<<appLocation<<'\n'<<appName<<'\n';
    return 0;
}

 

komentarz 2 sierpnia 2016 przez JAKUBW Nałogowiec (33,470 p.)
Hmm, no nie wiedziałem o takich funkcjach jak string::substr() czy string::rfind(), więc zrobiłem to ręcznie. Ale dzięki za odpowiedź. Na pewno sobie poczytam o Naruszeniu ochrony pamięci.

Podobne pytania

0 głosów
1 odpowiedź 225 wizyt
0 głosów
3 odpowiedzi 3,248 wizyt
pytanie zadane 21 marca 2018 w C i C++ przez Hiskiel Pasjonat (22,830 p.)
+1 głos
1 odpowiedź 2,433 wizyt
pytanie zadane 8 grudnia 2015 w C i C++ przez niezalogowany

92,555 zapytań

141,402 odpowiedzi

319,541 komentarzy

61,939 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...