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. #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: #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? |
|
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 |
|
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. |
|
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. |
|
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()? |
|
Elaine |
» 2017-07-14 14:01:26 Dlatego pytam z czystej ciekawości - jest jakakolwiek szansa na [crash]? |
Tak: #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
|
|
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? |
|
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). |
|
« 1 » 2 |