Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Czy niezainicjalizowana zmienna może spowodować crash?

Ostatnio zmodyfikowano 2017-07-14 14:32
Autor Wiadomość
RazzorFlame
Temat założony przez niniejszego użytkownika
Czy niezainicjalizowana zmienna może spowodować crash?
» 2017-07-14 13:23:50
Witam, mam szybkie pytanie.
C/C++
#include <iostream>

int main()
{
    int x;
    std::cout << x << std::endl;
    return 0;
}
Jeśli kompilator sam nie przypisze wartości "0" zmiennej x to czy jest jakakolwiek szansa, że poza jakąś losową wartością w zmiennej x, program się scrashuje przy wyświetlaniu jej? Na logikę, jedyne co może się stać to właśnie śmieci w pamięci po poprzedniej zawartości, ale jak dobrze wszyscy wiemy - różnie bywa. Dlatego pytam z czystej ciekawości - jest jakakolwiek szansa na to?

// Taki protip:
// dobrze wiem, że niezainicjalizowane zmienne bardzo łatwo mogą spowodować crashe/błędy dalej w programie ale interesuje mnie tylko kod podany powyżej, lub coś podobnego z użyciem innych funkcji
Dzięki.

// Edit:
Jeszcze taki przypadek:
C/C++
#include <iostream>

int main()
{
    int x;
    int y = x;
    std::cout << x << " " << y << std::endl;
    return 0;
}
Z cppreference dowiedziałem się, że int x; przyjmuje po prostu niezdefiniowaną wartość ale już int y = x; to UB. Czy w takim wypadku może wystąpić crash?
P-163266
Monika90
» 2017-07-14 13:41:54
A skąd wiesz ze zmienna jest w pamięci, może jest w rejestrze procesora. Są procesory które przechowują informację o tym które rejestry zawierają poprawną wartość, a które nie. Próba użycia wartości rejestru, który jest pusty, powoduje wyjątek sprzętowy.

Ale tak naprawdę sprzęt nie ma znaczenia, liczy się standard, a standard mówi że zachowanie jest niezdefiniowane. Kompilator ma prawo wstawić do takiego kodu instrukcje jmp dump_core
P-163268
RazzorFlame
Temat założony przez niniejszego użytkownika
» 2017-07-14 13:47:29
Nie wiem co taka "jmp dump_core" robi. Z Twojej wypowiedzi wynika, jest możliwość wystąpienia takiego crasha, w takim razie zostawianiu niezainicjalizowanych zmiennych powinno się powiedzieć kategoryczne nie? W praktycznie każdym kursie programowania jedyne co jest o tym napisane, to że taka zmienna przyjmuje wartość taką, jaką miały komórki pamięci przed jej zaalokowaniem. Przez coś takiego ludzie często właśnie nie zdają sobie sprawy z tego co piszą.
@DejaVu może wypadałoby o tym też wspomnieć w kursie.
P-163269
Monika90
» 2017-07-14 13:56:13
Nie wiem co taka "jmp dump_core" robi.
Powiedzmy, że wyświetla komunikat o błędzie i przerywa program.
P-163270
RazzorFlame
Temat założony przez niniejszego użytkownika
» 2017-07-14 13:59:36
Właśnie przeczytałem gdzieś na stackoverflow o tym abort(), jednak chciałbym wiedzieć coś więcej o tym.
Co dokładnie oznacza pojęcie "core dump"? Czy wywołanie abort() może mieć jakieś praktycznie zastosowanie pisząc program samemu i w jakich wypadkach tego powinno się używać? Czy jest to jakiś zamiennik dla rzucania std::runtime_error? Lepiej jest się postarać "pokojowo" wyłączyć program czy drastycznie przy użyciu abort()?
P-163272
Elaine
» 2017-07-14 14:01:26
Dlatego pytam z czystej ciekawości - jest jakakolwiek szansa na [crash]?
Tak:
C/C++
#include <iostream>
#include <immintrin.h>

double foo( double x )
{
    double y;
    return x + y;
}

int main()
{
    _mm_setcsr( _mm_getcsr() & ~0b1110000000 );
    std::cout << foo( 10.0 ) << '\n';
}
>> g++ x.cc && ./a.out   
zsh: floating point exception  ./a.out
P-163273
RazzorFlame
Temat założony przez niniejszego użytkownika
» 2017-07-14 14:10:38
Za co odpowiada funkcja _mm_setcsr? Może inaczej, w dokumentacji pisze że ustawia wartość rejestru kontroli (? - ang. "control register"), ale co to w konsekwencji robi?
Bez tego program zachowa się inaczej?
P-163274
Elaine
» 2017-07-14 14:16:03
Tutaj modyfikuje MXCSR tak, by niepoprawne operacje zmiennoprzecinkowe, podnormalne argumenty i zmiennoprzecinkowe dzielenie przez zero zgłaszały wyjątek. Domyślnie te wyjątki są maskowane, więc niepoprawne operacje zwracają NaN (poza paroma wyjątkami), dzielenie przez zero daje odpowiednią nieskończoność, a podnormalne argumenty działają normalnie (chyba że flaga DAZ w tym samym rejestrze jest ustawiona, wtedy podnormalne argumenty są traktowane jako zera).
P-163276
« 1 » 2
  Strona 1 z 2 Następna strona