2012-03-29 18 views
5

Powiel możliwe:
Why do I see strange values when I print uninitialized variables?
Fun with uninitialized variables and compiler (GCC)Niespójność w niezainicjowanej zmiennej logicznej

Chcę wiedzieć o tajemniczej problem, który wychodził podczas rozwiązywania problemu kodu.

Kod występujący w produkcji ma niezainicjowaną zmienną binarną, a biblioteka sprawdza wartość tej wartości logicznej. W witrynie LIVE ta zmienna zachowuje się zawsze jako PRAWDA zawsze Ten sam kod w środowisku programistycznym zachowuje się zawsze jako FALSE.

Wiem, ze względu na różnicę środowiskową między NAJBARDZIEJ & DEV, niezainicjowana zmienna bool może mieć niezdefiniowaną wartość.

Ale tutaj jest mój problem.

Jeśli umieściłem w kodzie instrukcję log, skompiluję ją i umieściłem plik binarny w środowisku programistycznym, zmienna bool ma zawsze wartość PRAWDA, natomiast FALSE z kodem w LIVE.

W jaki sposób wyrażenie dziennika wpływa na wartość niezainicjowanej zmiennej bool? Chciałbym poznać możliwości.

+2

możliwe duplikat http://stackoverflow.com/questions/4879045/fun-with-uninitialized-variables-and-compiler-gcc http://stackoverflow.com/questions/2154132/printing-an-uninitialized -bool-using-cout-c – Kasma

Odpowiedz

14

Nieanitialiazowana zmienna jest po prostu kawałkiem surowej pamięci i pokaże jako wartość, cokolwiek się tam wydarzy. Myślisz, że "w systemie na żywo zawsze jest prawdą" jest całkowicie błędne. Wszystko, co możesz powiedzieć, to to, że za każdym razem, gdy go obserwowałeś, , wydawało się to prawdą. Może być w następny wtorek zamiast tego stanie się fałszywy, ponieważ dobrze wiadomo, że niezainicjowane boole nienawidzą wtorki.

Zauważ, że jest całkiem możliwe, że niezainicjowana wartość logiczna może wydawać się prawdziwa dla jednej funkcji, a dla drugiej dla wartości false (zwykle bajt jest przydzielony dla wartości bool, ale do reprezentacji wartości potrzebny jest tylko bit: możliwe, że niezainicjowany bool będzie zawierał magiczną rozmytą wartość bool, która jest prawdziwa dla kogoś, a fałsz dla kogoś innego).

Co do standardu mówi, że dostęp do niezainicjowanej zmiennej do czytania może rzeczywiście być niezdefiniowanym zachowaniem, bez ograniczeń co do tego, co może się zdarzyć, w tym awarie (i na przykład łatwo jest program "zatrzymać", gdy czyta niezainicjowaną zmienną , po prostu skompiluj z konkretnym narzędziem do śledzenia tego rodzaju problemu). Zawsze występowanie awarii programu przy dostępie do niezainicjowanej zmiennej byłoby wspaniałe, ale niestety jest to dość kosztowne dla obecnych procesorów i nie stanie się tak, dopóki nie zostaną użyte określone narzędzia.

Oczywiście dodanie nawet połączenia printf może zmienić pozorne zachowanie kodu obsługi niezainicjowanych zmiennych. Tego rodzaju błąd jest często określany jako "heisenbug" i faktycznie zachowanie przypadkowe lub heisenbug często wskazuje na niezainicjowaną zmienną lub problem z synchronizacją wątków.

+1

przegłosowano tylko dla "dobrze wiadomo, że niezainicjowane boole nienawidzą we wtorki" – dberm22

2

Ty stwierdził:

zmiennej bool niezainicjowany może mieć wartość niezdefiniowana.

W rzeczywistości, że powinno być: "an niezainicjowany bool zmienna zawsze wartość niezdefiniowana."

To, że Twoja wartość się zmienia, nie zmienia faktu, że jest nieokreślona. Jedyną gwarancją zachowania jest to, co określają specyfikacje. Dopóki nie jest zdefiniowany z definicją statycznego magazynu, zachowanie jest dokładnie takie: undefined. Kompilator może wykonać dowolną czynność za pomocą tej zmiennej - może ją zainicjować, może nie, może ją całkowicie zoptymalizować, jeśli nie jest zalogowany (tj. Użyty), itp.

Zasadniczo trzeba poprawnie zainicjuj bool i nie możesz się tym martwić.

+0

Wiem, że zawsze jest nieokreślona. Chciałbym jednak wiedzieć, dlaczego drobna zmiana może wpłynąć na jej wartość. Zawsze jest fałszywe w środowisku deweloperów, dopóki nie wprowadzę drobnej zmiany i ponownej kompilacji. – cppcoder

+0

Jest * niezdefiniowany *. * Wszystko, co robisz, może spowodować, że kompilator wygeneruje program z różnymi wynikami i niekoniecznie będzie to miało jakiś oczywisty powód. –

Powiązane problemy