Czy optymalizacja kompilatora może wprowadzać błędy?

Dzisiaj odbyĹ ' em dyskusjÄ ™ z moim przyjacielem i przez kilka godzin debatowaliĺ "my nad"optymalizacjÄ ... kompilatora".

Broniłem punktu, że czasami optymalizacja kompilatora może wprowadzać błędy lub przynajmniej niepożądane zachowania.

Mój przyjaciel całkowicie się nie zgodził, mówiąc, że "Kompilatory są budowane przez mądrych ludzi i robią mądre rzeczy" i w ten sposób, może nigdy pójść źle.

W ogóle mnie nie przekonał, ale muszę przyznać, że brak mi prawdziwego przykłady, które wzmocnią mój punkt widzenia.

Kto tu jest? Jeśli tak, to czy masz jakiś prawdziwy przykład, gdzie optymalizacja kompilatora spowodowała błąd w oprogramowaniu wynikowym? Jeśli się mylę, czy powinienem przestać programować i zamiast tego nauczyć się łowienia ryb?

Author: Tshepang, 2010-04-27

22 answers

Optymalizacje kompilatorów mogą wprowadzać błędy lub niepożądane zachowania. Dlatego możesz je wyłączyć.

Jeden przykład: kompilator może zoptymalizować dostęp odczytu/zapisu do pamięci, wykonując takie czynności, jak eliminacja duplikatów odczytów lub duplikatów zapisów lub zmiana kolejności pewnych operacji. Jeśli dana lokalizacja pamięci jest używana tylko przez pojedynczy wątek i w rzeczywistości jest pamięcią, może być ok. Ale jeśli lokalizacja pamięci jest rejestrem IO urządzenia sprzętowego, to ponowne zamówienie lub eliminowanie zapisów może być całkowicie błędne. W takiej sytuacji zwykle trzeba pisać kod wiedząc, że kompilator może go "zoptymalizować", a tym samym wiedząc, że naiwne podejście nie działa.

Update: Jak zauważył Adam Robinson w komentarzu, scenariusz, który opisuję powyżej, jest bardziej błędem programowania niż błędem optymalizatora. Ale chciałem zilustrować, że niektóre programy, które w przeciwnym razie są poprawne, połączone z pewnymi optymalizacjami, które w przeciwnym razie działa poprawnie, może wprowadzać błędy w programie po ich połączeniu. W niektórych przypadkach specyfikacja języka mówi: "musisz robić rzeczy w ten sposób, ponieważ mogą wystąpić tego rodzaju optymalizacje i twój program zawiedzie", w którym to przypadku jest to błąd w kodzie. Ale czasami kompilator ma (zazwyczaj opcjonalną) funkcję optymalizacji, która może wygenerować nieprawidłowy kod, ponieważ kompilator zbyt mocno stara się zoptymalizować kod lub nie może wykryć, że optymalizacja jest nieodpowiednia. W w tym przypadku programista musi wiedzieć, kiedy można bezpiecznie włączyć daną optymalizację.

Inny przykład: Jądro Linuksa miało błąd , w którym potencjalnie zerowy wskaźnik był dereferowany przed testem na to, że wskaźnik ten jest null. Jednak w niektórych przypadkach możliwe było mapowanie pamięci na adres zero, co pozwoliło na sukces dereferencji. Kompilator, po zauważeniu, że wskaźnik został dereferenced, założył, że nie może być NULL, a następnie usunął test NULL później i cały kod w tej gałęzi. wprowadziło to lukę w zabezpieczeniach do kodu , Ponieważ funkcja używałaby nieprawidłowego wskaźnika zawierającego dane dostarczone przez atakującego. W przypadkach, gdy wskaźnik był prawomocnie null, a pamięć nie była mapowana do adresu zero, jądro nadal ZACHOWYWAŁOBY się tak, jak wcześniej. Tak więc przed optymalizacją kod zawierał jeden błąd, po nim dwa, a jeden z nich pozwalał na lokalny exploit root.

CERT posiada prezentacja zatytułowana "Dangerous Optimizations and the Loss of Causality" autorstwa Roberta C. Seacorda, która wymienia wiele optymalizacji wprowadzających (lub ujawniających) błędy w programach. Omawia różne rodzaje optymalizacji, które są możliwe, od "robienia tego, co robi sprzęt" do "pułapki wszystkich możliwych niezdefiniowanych zachowań" do "robienia wszystkiego, co nie jest niedozwolone".

Kilka przykładów kodu, który jest idealny, dopóki agresywnie optymalizujący kompilator nie dostanie się w swoje ręce it:

  • Sprawdzanie przepełnienia

    // fails because the overflow test gets removed
    if (ptr + len < ptr || ptr + len > max) return EINVAL;
    
  • Używanie w ogóle artithmetic overflow:

    // The compiler optimizes this to an infinite loop
    for (i = 1; i > 0; i += i) ++j;
    
  • Czyszczenie pamięci poufnych informacji:

    // the compiler can remove these "useless writes"
    memset(password_buffer, 0, sizeof(password_buffer));
    

Problem polega na tym, że Kompilatory przez dziesięciolecia były mniej agresywne w optymalizacji, a więc generacje programistów C uczą się i rozumieją rzeczy takie jak dodawanie dwójek o stałej wielkości i jak to przepełnia. Następnie standard języka C jest zmieniany przez kompilator deweloperów, a subtelne Zasady się zmieniają, mimo że sprzęt się nie zmienia. Specyfikacja języka C jest umową między programistami i kompilatorami, ale warunki umowy mogą ulec zmianie w czasie i nie każdy rozumie każdy szczegół, lub zgadza się, że szczegóły są nawet sensowne.

Dlatego większość kompilatorów oferuje flagi do wyłączania (lub włączania) optymalizacji. Czy twój program jest napisany ze zrozumieniem, że liczby całkowite mogą się przepełnić? Następnie należy wyłączyć optymalizacje przepełnienia, ponieważ mogą wprowadzać błędy. Czy twój program ściśle unika aliasowania wskaźników? Następnie można włączyć optymalizacje, które zakładają, że wskaźniki nigdy nie są aliasowane. Czy twój program próbuje wyczyścić pamięć, aby uniknąć wycieku informacji? W takim przypadku masz pecha: albo musisz wyłączyć usuwanie martwego kodu, albo musisz wiedzieć, że Twój kompilator wyeliminuje Twój "martwy" kod i użyć do tego trochę obejścia.

 38
Author: Mr. Shiny and New 安宇,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-27 18:46:44

Tak, oczywiście.
Zobacz Tutaj, tutaj (który nadal istnieje - "z założenia"!?!), Tutaj, Proszę., Proszę., tutaj ...

 24
Author: BlueRaja - Danny Pflughoeft,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-27 15:14:01

Gdy błąd zniknie po wyłączeniu optymalizacji, przez większość czasu jest to nadal twoja wina

Odpowiadam za komercyjną aplikację, napisaną głównie w C++ - zaczynałem od VC5, wcześniej przeportowałem do VC6, teraz z powodzeniem przeportowałem do VC2008. W ciągu ostatnich 10 lat liczba linii wzrosła do ponad 1 miliona.

W tym czasie mogłem potwierdzić pojedynczy błąd generowania kodu, który wystąpił podczas agresywnych optymalizacji, gdzie włączone.

Więc dlaczego narzekam? Ponieważ w tym samym czasie, były dziesiątki błędów, które sprawiły, że zwątpiłem w kompilator - ale okazało się, że to moje niewystarczające zrozumienie standardu C++. Standard daje miejsce na optymalizacje, które kompilator może lub nie może wykorzystać.

Przez lata na różnych forach widziałem wiele postów obwiniających kompilator, ostatecznie okazujących się błędami w oryginalnym kodzie. Bez wątpienia wiele z nich niejasne błędy, które wymagają szczegółowego zrozumienia pojęć używanych w standardzie, ale błędy w kodzie źródłowym niemniej jednak.

Dlaczego odpowiadam tak późno: przestań obwiniać kompilator zanim potwierdzisz, że to wina kompilatora.

 21
Author: peterchen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-24 08:25:15

Optymalizacja kompilatora (i środowiska uruchomieniowego) z pewnością może wprowadzić niepożądane zachowanie - ale przynajmniej powinno się zdarzyć tylko wtedy, gdy polegasz na nieokreślonym zachowaniu (lub rzeczywiście dokonujesz błędnych założeń dotyczących dobrze określonego zachowania).

Poza tym, oczywiście Kompilatory mogą mieć w sobie błędy. Niektóre z nich mogą dotyczyć optymalizacji, a konsekwencje mogą być bardzo subtelne - rzeczywiście są one prawdopodobnie, ponieważ oczywiste błędy są bardziej prawdopodobne naprawione.

Zakładając, że dołączasz JIT jako Kompilatory, widziałem błędy w wydanych wersjach zarówno JIT. NET, jak i Hotspot JVM (niestety nie mam szczegółów w tej chwili), które były odtwarzalne w szczególnie dziwnych sytuacjach. Czy wynikały one z konkretnych optymalizacji, czy Nie, Nie wiem.

 11
Author: Jon Skeet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-27 15:08:07

Aby połączyć pozostałe posty:

  1. Kompilatory czasami mają błędy w kodzie, jak większość programów. Argument "inteligentnych ludzi" jest całkowicie nieistotny, ponieważ satelity NASA i inne aplikacje zbudowane przez inteligentnych ludzi również mają błędy. Kodowanie, które optymalizuje, różni się od tego, które nie, więc jeśli błąd pojawi się w optymalizatorze, to rzeczywiście zoptymalizowany kod może zawierać błędy, podczas gdy nie zoptymalizowany kod będzie nie.

  2. Jak zauważył Pan Shiny and New, możliwe jest, aby kod, który jest naiwny w odniesieniu do współbieżności i / lub problemów z czasem działał zadowalająco bez optymalizacji, ale nie powiódł się z optymalizacją, ponieważ może to zmienić czas wykonania. Możesz winić taki problem na kodzie źródłowym, ale jeśli pojawi się on tylko wtedy, gdy zostanie zoptymalizowany, niektórzy ludzie mogą winić optymalizację.

 9
Author: Carl Smotricz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-27 15:12:19

Tylko jeden przykład: kilka dni temu ktośodkrył , że gcc 4.5 z opcją -foptimize-sibling-calls (co jest sugerowane przez -O2) produkuje plik wykonywalny Emacs, który segfaultuje się przy starcie.

To zostało najwyraźniej naprawione od tego czasu.

 7
Author: legoscia,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-27 15:07:18

Nigdy nie słyszałem ani nie używałem kompilatora, którego dyrektywy nie mogłyby zmienić zachowania programu. Ogólnie jest to dobra rzecz , ale wymaga to przeczytania instrukcji.

A miaĹ 'em ostatnio sytuacjÄ™, w ktĂłrej dyrektywa kompilatora "usunÄ ™ Ĺ' a " bĹ ' Ä ™ d. Oczywiście błąd nadal istnieje, ale mam tymczasowe obejście, dopóki nie naprawię poprawnie programu.

 7
Author: High Performance Mark,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-27 15:09:10

Tak. Dobrym przykładem jest podwójnie sprawdzony wzór blokowania. W C++ nie ma sposobu na bezpieczne zaimplementowanie funkcji double-checked locking, ponieważ kompilator może ponownie zamówić instrukcje w sposób, który ma sens w systemie jednowątkowym, ale nie w systemie wielowątkowym. Pełna dyskusja znajduje się na stronie http://www.aristeia.com/Papers/DDJ_Jul_Aug_2004_revised.pdf

 6
Author: tloach,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-27 15:11:52

Czy to możliwe? Nie w głównym produkcie, ale to jest z pewnością możliwe. Optymalizacje kompilatorów to generowany kod; bez względu na to, skąd pochodzi kod (piszesz go lub coś go generuje), może zawierać błędy.

 5
Author: Adam Robinson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-27 15:06:52

SpotkaĹ ' em siÄ ™ z tym kilka razy z nowszym kompilatorem budujÄ ... cym stary kod. Stary kod działał, ale w niektórych przypadkach opierał się na niezdefiniowanym zachowaniu, np. nieprawidłowo zdefiniowanym przeciążeniu operatora / cast. Działałoby to w vs2003 lub VS2005 debug build, ale w wydaniu uległoby awarii.

Otwarcie wygenerowanego zestawu było jasne, że kompilator właśnie usunął 80% funkcjonalności danej funkcji. Przepisanie kodu tak, aby nie używał niezdefiniowanego zachowania wyczyściło go w górę.

Bardziej oczywisty przykład: VS2008 vs GCC

Zadeklarowane:

Function foo( const type & tp ); 

Wywołane:

foo( foo2() );

Gdzie foo2() zwraca obiekt klasy type;

Ma tendencję do awarii w GCC, ponieważ obiekt nie jest w tym przypadku przypisany do stosu, ale VS robi pewną optymalizację, aby to obejść i prawdopodobnie zadziała.

 5
Author: peter karasev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-03 12:17:29

Aliasing może powodować problemy z niektórymi optymalizacjami, dlatego Kompilatory mają opcję wyłączenia tych optymalizacji. Z Wikipedii :

Aby umożliwić takie optymalizacje w przewidywalny sposób, norma ISO dla języka programowania C (w tym jego nowszej edycji C99) określa, że jest nielegalne (z pewnymi wyjątkami), aby wskaźniki różnych typów odwoływały się do tej samej lokalizacji pamięci. Zasada ta, znana jako "strict aliasing", pozwala na imponujące zwiększa wydajność [potrzebne cytowanie], ale wiadomo, że łamie jakiś inny poprawny kod. Kilka projektów oprogramowania celowo narusza tę część standardu C99. Na przykład Python 2.x zrobił to, aby zaimplementować zliczanie referencji [1] i wymagał zmian w podstawowych strukturach obiektów w Pythonie 3, aby umożliwić tę optymalizację. Jądro Linuksa robi to, ponieważ ścisłe aliasowanie powoduje problemy z optymalizacją kodu inlined.[2] w takich przypadkach, po skompilowaniu z gcc, opcja -FNO-strict-aliasing jest wywoływany, aby zapobiec niechcianym lub nieprawidłowym optymalizacjom, które mogłyby wytworzyć nieprawidłowy kod.

 4
Author: Mark Ransom,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-27 17:14:24

Tak, optymalizacje kompilatorów mogą być niebezpieczne. Zazwyczaj trudne Projekty oprogramowania w czasie rzeczywistym zabraniają optymalizacji z tego właśnie powodu. W każdym razie, czy znasz jakieś oprogramowanie bez błędów?

Agresywne optymalizacje mogą buforować lub nawet robić dziwne założenia ze zmiennymi. Problem polega nie tylko na stabilności kodu, ale także może oszukać debuggera. Widziałem kilka razy debugger nie reprezentować zawartości pamięci, ponieważ niektóre optymalizacje zachowały wartość zmiennej w rejestrach mikro

To samo może się zdarzyć z Twoim kodem. Optymalizacja umieszcza zmienną w rejestrze i nie zapisuje jej do czasu jej zakończenia. Teraz wyobraź sobie, jak różne mogą być rzeczy, jeśli twój kod ma wskaźniki do zmiennych w stosie i ma kilka wątków

 3
Author: SystematicFrank,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-27 15:14:38

To teoretycznie możliwe, jasne. Ale jeśli nie ufasz narzędziom do robienia tego, co powinny, po co z nich korzystać? Ale od razu każdy argumentujący z pozycji

"Kompilatory budują mądrzy ludzie i robić mądre rzeczy " i w ten sposób można nigdy się nie mylisz.

To głupi argument.

Więc, dopóki nie masz powodów, aby sądzić, że kompilator tak robi, dlaczego o tym mówisz?

 2
Author: Daniel DiPaolo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-27 15:03:59

Z całą pewnością zgadzam się, że głupio jest mówić, że Kompilatory są pisane przez "mądrych ludzi", dlatego są nieomylne. Inteligentni ludzie zaprojektowali także Hindenberg i Tacoma Narrows Bridge. Nawet jeśli prawdą jest, że twórcy kompilatorów należą do najmądrzejszych programistów, prawdą jest również, że Kompilatory należą do najbardziej złożonych programów. Oczywiście, że mają robaki.

Z drugiej strony doświadczenie mówi nam, że niezawodność komercyjnych kompilatorów jest bardzo wysoko. Miałem wiele razy, że ktoś mi powiedział, że powodem, dla którego program nie działa, musi być błąd w kompilatorze, ponieważ sprawdził go bardzo dokładnie i jest pewien, że jest w 100% poprawny ... i wtedy okaże się, że w rzeczywistości program ma błąd, a nie kompilator. Staram się myśleć o czasach, że osobiście natknąłem się na coś, co byłem naprawdę pewien, że było błędem w kompilatorze, i mogę sobie przypomnieć tylko jeden przykład.

Tak ogólnie: zaufaj swojemu kompilator. Ale czy kiedykolwiek się mylą? Jasne.

 2
Author: Jay,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-27 17:02:43

To się może zdarzyć. Dotyczy to nawet Linuksa.

 2
Author: Jean Azzopardi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-09 16:20:51

O ile dobrze pamiętam, wczesny Delphi 1 miał błąd, w którym wyniki Min i Max zostały odwrócone. Wystąpił również niejasny błąd z niektórymi wartościami zmiennoprzecinkowymi tylko wtedy, gdy wartość zmiennoprzecinkowa była używana w bibliotece dll. Co prawda minęło już ponad dekadę, więc moja pamięć może być nieco zamazana.

 1
Author: Mike Chess,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-27 21:04:10

Miałem problem w. NET 3.5 jeśli budujesz z optymalizacją, dodaj kolejną zmienną do metody, która jest nazwana podobnie do istniejącej zmiennej tego samego typu w tym samym zakresie, to jedna z dwóch (Nowa lub stara zmienna)nie będzie ważna w czasie wykonywania i wszystkie odwołania do nieprawidłowej zmiennej zostaną zastąpione odwołaniami do drugiej.

Więc, na przykład, jeśli mam abcd typu MyCustomClass i mam abdc typu MyCustomClass i ustawiam abcd.a = 5 i abdc.a = 7 wtedy oba zmienne będą miały właściwość a=7. Aby rozwiązać problem, obie zmienne powinny zostać usunięte, program skompilowany (miejmy nadzieję, że bez błędów), a następnie powinny zostać ponownie dodane.

Myślę, że napotkałem ten problem kilka razy z. NET 4.0 i C# również podczas wykonywania aplikacji Silverlight. W mojej ostatniej pracy dość często spotykaliśmy się z tym problemem w C++. Być może dlatego, że Kompilacje trwały 15 minut, więc budowaliśmy tylko potrzebne biblioteki, ale czasami zoptymalizowany kod był dokładnie tak samo jak w poprzedniej kompilacji, mimo że dodano nowy kod i nie zgłoszono żadnych błędów kompilacji.

Tak, optymalizatory kodu są budowane przez inteligentnych ludzi. Są one również bardzo skomplikowane, więc posiadanie błędów jest powszechne. Proponuję w pełni przetestować każdą zoptymalizowaną wersję dużego produktu. Zazwyczaj produkty o ograniczonym zastosowaniu nie są warte pełnego wydania, ale nadal powinny być ogólnie testowane, aby upewnić się, że prawidłowo wykonują swoje typowe zadania.

 1
Author: Trisped,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-30 17:40:58

Optymalizacja kompilatora może ujawnić (lub aktywować) uśpione (lub ukryte) błędy w kodzie. Może być błąd w kodzie C++, O którym nie wiesz, że po prostu go nie widzisz. W takim przypadku jest to błąd ukryty lub uśpiony, ponieważ ta gałąź kodu nie jest wykonywana [wystarczająco dużo razy].

Prawdopodobieństwo wystąpienia błędu w kodzie jest znacznie większe (tysiące razy większe) niż błąd w kodzie kompilatora: ponieważ Kompilatory są intensywnie testowane. Przez TDD plus praktycznie przez wszyscy ludzie, którzy używają ich od czasu ich wydania!). Jest więc praktycznie mało prawdopodobne, aby błąd został odkryty przez Ciebie i nie został odkryty dosłownie setki tysięcy razy, kiedy jest używany przez innych ludzi.

A uśpiony błąd lub ukryty błąd jest tylko błędem, który nie jest jeszcze ujawniony programiście. Osoby, które mogą twierdzić, że ich kod C++ nie ma (ukrytych) błędów są bardzo rzadkie. Wymaga znajomości C++ (bardzo niewielu może się o to ubiegać) i obszernego testowania kodu. On nie tylko o programistę, ale o sam kod (styl tworzenia). Bycie podatnym na błędy jest w charakterze kodu (jak rygorystycznie jest testowany) lub / i programisty (jak zdyscyplinowany jest w teście i jak dobrze zna C++ i programowanie).

Bezpieczeństwo + błędy współbieżności: jest to jeszcze gorsze, jeśli uwzględnimy współbieżność i bezpieczeństwo jako błędy. Ale przecież to " są " robaki. Pisanie kodu, który jest w pierwszej kolejności wolny od błędów pod względem współbieżności i bezpieczeństwa jest prawie niemożliwe. Dlatego w kodzie zawsze pojawia się błąd, który można ujawnić (lub zapomnieć) w optymalizacji kompilatora.

 1
Author: Sohail Si,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-03 12:51:43

Wszystko, co możesz sobie wyobrazić robiąc z lub do programu, wprowadzi błędy.

 0
Author: Jay,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-27 17:14:12

Więcej i bardziej agresywne optymalizacje mogą być włączone, jeśli skompilowany program ma dobry pakiet testowy. Następnie można uruchomić ten pakiet i być nieco bardziej pewnym, że program działa poprawnie. Możesz również przygotować własne testy, które ściśle pasują do tych, które planujesz wykonać w produkcji.

Prawdą jest również, że każdy duży program może mieć (i prawdopodobnie ma) pewne błędy niezależnie od przełączników, których używasz do kompilacji.

 0
Author: h22,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-08 06:52:30

Ze względu na wyczerpujące testy i względną prostotę rzeczywistego kodu C++ (C++ ma poniżej 100 słów kluczowych / operatorów) błędy kompilatora są stosunkowo rzadkie. Zły styl programowania często jest jedyną rzeczą, która je spotyka. I zwykle kompilator się zawiesi lub wytworzy wewnętrzny błąd kompilatora. Jedynym wyjątkiem od tej reguły jest GCC. GCC, szczególnie starsze wersje, miały wiele eksperymentalnych optymalizacji włączonych w O3, a czasami nawet na innych poziomach O. GCC również celuje w tak wiele backendów, że pozostawia to więcej miejsca na błędy w ich pośredniej reprezentacji.

 -1
Author: unixman83,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-30 17:26:11

Wczoraj miałem problem z. Net 4 z czymś, co wygląda...

double x=0.4;
if(x<0.5) { below5(); } else { above5(); }

I wywoła above5(); ale jeśli faktycznie użyję x gdzieś, wywoła below5();

double x=0.4;
if(x<0.5) { below5(); } else { System.Console.Write(x); above5(); }

Nie ten sam kod, ale podobny.

 -2
Author: niknah,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-03 12:18:44