niedziela, 7 marca 2010

Bug się rodzi...

Chyba znalazłem buga w kompilatorze gcc-4.3.2. No, może za dużo powiedziane. Pewną niekonsekwencję.

Przykład: oto kod, który nic nie wyświetli na ekranie:

    if(0) for(;;) if(1) ;
    else if(1) printf(":)\n");

Natomiast jeśli dodasz w 1 linijce nawiasy, to dostaniesz buźkę ":)"

    if(0) for(;;) { if(1) ; }
    else if(1) printf(":)\n");

Z tego, co się uczyłem, po if oraz po for można napisać 1 komendę i nie trzeba używać nawiasów. Czyli pierwszy i drugi przykład powinny dawać ten sam wynik. A nie dają.

Zdumiewające!

Sprawdziłem że:
- coś takiego działa:

    if(1) for(int i=0; i<1; i++) if(1) printf(":)\n");

- oraz coś takiego działa:

    if(0) for(;;) ;
    else if(1) printf(":)\n");

Czyli tylko jak połączysz te 2 przypadki razem i napiszesz to co w pierwszym przykładzie, kompilator gubi się w kolejności wykonywanych operacji. I trzeba użyć nawiasów, żeby mu pomóc.

3 komentarze:

  1. Wszystko się zgadza. Pierwszy kod jest równoważny kodowi:

    if(0) {
    for(;;) {
    if(1) ;
    else if(1) {
    printf(":)\n");
    }
    }
    }

    Czyli zamieszanie polega na tym, że w drugim przypadku else jest dopasowywany do zewnętrznego if'a. W pozostałych przypadkach również nie ma problemu z matchowaniem else'a.

    OdpowiedzUsuń
  2. Racja. Mój błąd. Czyli to jednak ja jestem głupi, a twórcy gcc mądrzy.

    Jeśli jesteś tym Kamilem, o którym myślę, że jesteś, to strzeż się. Gonię Cię na SPOJu (ech, zabrałem się za te zadanka o 6 lat za późno...). Mimo wszystko 50 punktów w 5 dni nie jest złym wynikiem.

    OdpowiedzUsuń
  3. No, to tam powodzenia! Coś chyba za proste zajęcia Wam w tej Danii zrobili, że spoja robisz... Koleżanki też nie-tego? ;)

    OdpowiedzUsuń