Веселый баг :: C++ Builder 6.0

Тема в разделе "WASM.ZEN", создана пользователем UTeX, 14 ноя 2007.

  1. UTeX

    UTeX New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2007
    Сообщения:
    584
    В приаттаченом проекте на билдере тупа студенческая прога.
    Не в этом суть.
    Тут в коде таится интересная ошибка.
    Парились часа 3 так и не нашли.
    Вопрос решила только обертка в критическую секцию.

    Код (Text):
    1.                     float tek = fabs(Ft);
    2.                     float pred = fabs(tan(i-Ht));
    3.                     float rez = tek-pred;
    4.  
    5.                   CRITICAL_SECTION CritSec;
    6.                   InitializeCriticalSection(&CritSec);
    7.                   //EnterCriticalSection(&CritSec);
    8.  
    9.                     float  y = fabs(rez);
    10.  
    11.                             if ( y > 100)            //тут даже при y<1 после проверки выполняется break;
    12.                             {
    13.                          //LeaveCriticalSection(&CritSec);
    14.                              break;
    15.                             }
    16.                         //LeaveCriticalSection(&CritSec);
    код ужасен т к написан новичком - суть в баге.

    приятно отдохнуть.
     
  2. UTeX

    UTeX New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2007
    Сообщения:
    584
    Хмм... не могу сделать аттач

    Как приаттачить? 70Кб всего ведь
     
  3. twgt

    twgt New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    1.494
    Аттачи до 50кб. Ложи на огненник какой-нибудь.
     
  4. UTeX

    UTeX New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2007
    Сообщения:
    584
    twgt

    Пасиба. Аттач приложил
     
  5. shurik

    shurik Александр

    Публикаций:
    0
    Регистрация:
    27 авг 2006
    Сообщения:
    52
    Адрес:
    Украина
    UTeX

    В C++Bulder'е 6 у меня строчка с break не скомпилилась компилятором вообще :) И при любом условии туда не заходила. Бывает у него иногда какие-то приколы нехорошие. Я добавил фиктивную команду, типа:
    Код (Text):
    1.                            
    2. if ( y > 100)
    3. {
    4.    iii = iii;
    5.    break;
    6. }
    - и компилятор скомпилил инструкцию и после этого при у > 100 он заходит в тело условия :) С чем это связано к сожалению сказать не могу.
     
  6. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    я хз как в недоделфи с приводимостью к одному типу. поэтому (y > 100.0) не пробовал?
     
  7. UTeX

    UTeX New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2007
    Сообщения:
    584
    n0name

    ) не, не катит)
     
  8. UTeX

    UTeX New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2007
    Сообщения:
    584
    если кто то увидел в чем проблема отпишитесь плиз
     
  9. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    UTeX
    Смею предположить, что раз помогла критическая секция, то проблема в многопоточности.
    Маловероятно что у борланда такой баг в компиляторе. А вот если один поток вошёл в функцию, а другой из неё ещё не выходил, то может быть что угодно.
    К сожалению архив посмотреть не могу, так как на теперешней работе стоит прокся с фильтром на архивы.
     
  10. UTeX

    UTeX New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2007
    Сообщения:
    584
    аттач для тех кто за прокси
     
  11. hamper

    hamper Member

    Публикаций:
    0
    Регистрация:
    21 ноя 2005
    Сообщения:
    37
    Адрес:
    Russia
    А в чём ошибка?
    Если отлаживать по шагам, или поставить точку остановки, то отладчик действительно пройдётся по или остановится на
    break;
    внутри if ( y > 100)....,
    даже если на самом деле условие не выполняется.
    НО, цикл НЕ прерывается - переходим на следующую после блока if команду. Т.е. реально break; не выполняется! И при отладке в окне CPU всё в порядке. Просто такая особенная реакция отладчика на блок if, в котором ничего кроме break нет.
    Стоит добавить любую команду, например y=y; перед или даже после break; (!!!) и отладчик будет благополучно проскакивать мимо содержимого блока if когда условие не выполняется. Это, конечно, для особо впечатлительных, так как логика программы не меняется.
    CRITICAL_SECTION ни причём, просто вариант типа y=y.
     
  12. Atlantic

    Atlantic Member

    Публикаций:
    0
    Регистрация:
    22 июн 2005
    Сообщения:
    322
    Адрес:
    Швеция
    Здесь все, ИМХО, связано с тем, как (криво) Builder сопоставляет адреса машинных команд реальным строкам кода. То есть реально break не исполняется, даже когда на него показывает отладчик. То есть:
    Код (Text):
    1. if ( y > 100 )
    2. {
    3.   break; // пустой блок - адрес его начала совпадает с адресом следующего оператора после него.
    4. }
    5. AnyOperator;
    Если же внутрь блока поставить любой оператор, делающий хоть что-то, то все встанет на свои места.
     
  13. k3internal

    k3internal New Member

    Публикаций:
    0
    Регистрация:
    11 янв 2007
    Сообщения:
    607
    Странно, а оптимизатор такое не почикал ??
    в смысле iii = iii;
     
  14. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    А как этот баг выглядит в скомпиленном коде?
     
  15. Vov4ick

    Vov4ick Владимир

    Публикаций:
    0
    Регистрация:
    8 окт 2006
    Сообщения:
    581
    Адрес:
    МО
    Похоже на глюк оптимизатора. Я с похожим встречался в BC++ 3.1 - однажды не прикомпиливались куски printf, scanf для работы с плавающей запятой, и что-то похожее на описаное бывало. Приходилось шаманствовать с настройками компилятора, исходники и спец. батники для этого правда потеряны :-(
    Как вариант - попробуй переменные определить как глобальные, или локальные, но не в середине кода.
    Вариант2 - явное задание типа ( y < (float)100 ), но вряд ли.

    На дату не посмотрел :derisive:
     
  16. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    UTeX
    Это случаем не баг, связанный с установкой BreakPoint? У меня тоже на Билдере 6.* "проскакивает" одну инструкцию (приходится ставить BP на следующую).
    А еще это м.б. действительно связано с оптимизацией (вроде ставишь BP на один break или continue, а на деле нужно ее ставить совсем в другом месте.
     
  17. MrHammer

    MrHammer New Member

    Публикаций:
    0
    Регистрация:
    9 июл 2003
    Сообщения:
    197
    Показал бы автор лучше машинный код, и я больше склоняюсь к тому что это вовсе не глюк оптимизатора. Наверно ИДЕ билдера глючит.
     
  18. Dimedrol

    Dimedrol New Member

    Публикаций:
    0
    Регистрация:
    2 дек 2007
    Сообщения:
    1
    Еще интереснее:

    //баг есть:

    int y = 0;

    for( y = 0; y < 100; ++y)
    if( y == 10 )
    break;

    //бага НЕТ:

    int y = 0;

    for( ; y < 100; ++y)
    if( y == 10 )
    break;
     
  19. UTeX

    UTeX New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2007
    Сообщения:
    584
    Dimedrol
    херня какая-то короче ))