Как заставить компилятор выполнять сравнение в нужном мне порядке?

Тема в разделе "LANGS.C", создана пользователем Magnum, 17 янв 2012.

  1. Magnum

    Magnum New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2007
    Сообщения:
    925
    Отлаживаю чужой код, написанный не под студийный компилятор.
    Код большой.
    В коде есть серьезный недочет: проверка валидности указателя на структуру и валидности первого члена структуры выполняются в одном IF-е. Т.е.:

    Код (Text):
    1. PIXEL_INFO* pPixel;
    2. //...
    3. if (pPixel !=0 && pPixel->ndt!=0)
    4. {
    5. // ...
    6. };
    Я думаю проблема очевидна.
    Студийный компилятор не обязательно выполняет сравнения в указанном порядке, и если указатель нулевой - происходит вылет.
    Кода много. Такой недочет встречается по многим структурам.
    Просто выполнить замену по солюшну не получится.
    Реально ли комплиятор заставить выполнять сравнение в заданном кодером порядке?
     
  2. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    он тут не причем, порядок может быть любым по стандарту.

    Magnum
    имеется в виду именно компилятор заставить? или можно может вложенные ифы заюзать?
     
  3. Magnum

    Magnum New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2007
    Сообщения:
    925
    spa
    Без разницы. Надо код рабочий собрать.
    Если проект большой и такое в проекте встречается часто, значит у него ж оно в нужном порядке работало...
    Нужно как-то сделать так, чтобы при сборке оно и у меня работало в правильном порядке.
     
  4. Phyber

    Phyber New Member

    Публикаций:
    0
    Регистрация:
    27 мар 2010
    Сообщения:
    96
    так тоже пишу часто код, в студии, нареканий не было ни разу.
    предположительно компиль должен видеть, что это указатель и его сначала проверить... не?
     
  5. Magnum

    Magnum New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2007
    Сообщения:
    925
    Phyber
    Выражение pPixel->ncb автоматом подразумевает, что pPixel - указатель на структуру/класс/юнион
     
  6. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    Magnum
    Код (Text):
    1. PIXEL_INFO* pPixel;
    2. //...
    3. if (pPixel !=0)
    4. if (pPixel->ndt!=0)
    5.    {
    6.    // ...
    7.    };
    не?
     
  7. Magnum

    Magnum New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2007
    Сообщения:
    925
    spa
    Мысль! :)
    Ща попробуем правка->заменить все на ваш вариант :)
    спасибо!

    Phyber
    Вообще код на примере первого поста лучше не делать. Иначе человек, который будет ваш код поддерживать в будущем - будет ловить непонятные баги.
     
  8. Phyber

    Phyber New Member

    Публикаций:
    0
    Регистрация:
    27 мар 2010
    Сообщения:
    96
    так много людей код пишут и нет подтверждения тому, что подобное, ктото, как то после сборки, перепутает местами. фраза от spa, "по стандарту" как то не вдохновляет, нужен пруф :)
    даже по логике смотреть на сравнение если (!lala && lala->lolo) { }; слева на право всё адекватно...
    как минимум арабы не вкурят что к чему...

    и дак вы баги ловите чтоли?
     
  9. Magnum

    Magnum New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2007
    Сообщения:
    925
    Phyber
    Да :) Второе условие проверяется первым в моем дизасм-листинге
     
  10. Phyber

    Phyber New Member

    Публикаций:
    0
    Регистрация:
    27 мар 2010
    Сообщения:
    96
    нихрена себе. а студия у вас какая?
     
  11. Magnum

    Magnum New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2007
    Сообщения:
    925
    Phyber
    vs2010 team system
    в проекте:
    1. оптимизация кода отключена
    2. сборка: DEBUG
     
  12. Phyber

    Phyber New Member

    Публикаций:
    0
    Регистрация:
    27 мар 2010
    Сообщения:
    96
    у меня 2010 ультимейт, вроде адекватно всё же воспринимало.
    хорошо, будем иметь виду, спасибо )))
     
  13. scf

    scf Member

    Публикаций:
    0
    Регистрация:
    12 сен 2005
    Сообщения:
    385
    Стоп. Булевы выражения должны вычисляться слева направо, однозначно. Какая студия?
     
  14. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    scf
    это с чего это? && и & разные вещи, и компилятор волен сам выбирать порядок проверки для &&
     
  15. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    spa
    В стандарт давно заглядывал? В операторе && первый операнд всегда вычисляется первым и если он = false, то второй операнд не вычисляется вообще. И студийный && должен работать также - см.мсдн.
    Может просто скобочки добавить, чтобы компиль не дурил? ;)
    if ((pPixel) && (pPixel->ndt))
     
  16. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    leo
    хм, а это давно так? просто когда касался этой темы было еще что право выбора за компилятором для лучшей оптимизации.
     
  17. h0t

    h0t Member

    Публикаций:
    0
    Регистрация:
    3 апр 2011
    Сообщения:
    735
    нет, это прописано в стандарте, и оптимизатор тут бессилен!

    P.S. всегда так было!
     
  18. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    h0t
    leo
    да наверное я перепутал со порядком в switch
     
  19. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Вообще-то ещё в С++ ISO 2003 указан порядок слева на право для &&.
     
  20. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    spa
    Видимо ты перепутал && и &, т.к. именно в побитовом & всегда вычисляются оба операнда и соотв-но порядок их вычисления м.б. любым