bug ?

Тема в разделе "LANGS.C", создана пользователем osox, 19 июл 2010.

  1. osox

    osox New Member

    Публикаций:
    0
    Регистрация:
    13 ноя 2009
    Сообщения:
    280
    аффтар аццкий сотона ? смотрите функции с именами

    get_word
    get_netword
    get_dword

    http://asterisk-chan-capi.sourcearchive.com/documentation/1.1.1/capi20_8c-source.html
     
  2. osox

    osox New Member

    Публикаций:
    0
    Регистрация:
    13 ноя 2009
    Сообщения:
    280
    хотел в си раздел запостить ошибся извините
     
  3. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    osox
    нет там бага.
     
  4. osox

    osox New Member

    Публикаций:
    0
    Регистрация:
    13 ноя 2009
    Сообщения:
    280
    гхм с каких пор побитовое включающее или стало определять порядок вызовов функций
    ок к примеру get_netword вот он читает в сетевом порядке big endian число
    return((get_byte(p) << 8) | get_byte(p)); с чего он взял что он прочитает старший байт первым порядок вызова не определен в подвыражении может получится так что get_byte(p) первым прочитает старший байт оставит его в младшем байте а потом (get_byte(p) << 8) прочитает младший байт и начнет задвигать его в старший байт тоесть он то расчитывал на порядок что функции по порядку вызовутся но порядок не определен для этой операции
    Код (Text):
    1. static unsigned char get_byte(unsigned char **p)
    2. {
    3.       *p += 1;
    4.       return((unsigned char)*(*p - 1));
    5. }
    6.  
    7. static unsigned short get_word(unsigned char **p)
    8. {
    9.       return(get_byte(p) | (get_byte(p) << 8));
    10. }
    11.  
    12. static unsigned short get_netword(unsigned char **p)
    13. {
    14.       return((get_byte(p) << 8) | get_byte(p));
    15. }
    16.  
    17. #if 0
    18. static unsigned int get_dword(unsigned char **p)
    19. {
    20.       return(get_word(p) | (get_word(p) << 16));
    21. }
    22. #endif
     
  5. osox

    osox New Member

    Публикаций:
    0
    Регистрация:
    13 ноя 2009
    Сообщения:
    280
    тут аффтар просто забыл что порядок вызовов функций в подвыражении не определен и написал лабуду вместо нормального кода
     
  6. osox

    osox New Member

    Публикаций:
    0
    Регистрация:
    13 ноя 2009
    Сообщения:
    280
    это вообще говоря неопределенное поведение неизвестно какая из функций первая вызовется
    return((get_byte(p) << 8) | get_byte(p));
     
  7. osox

    osox New Member

    Публикаций:
    0
    Регистрация:
    13 ноя 2009
    Сообщения:
    280
    и все три функции так через ж*** написаны
     
  8. osox

    osox New Member

    Публикаций:
    0
    Регистрация:
    13 ноя 2009
    Сообщения:
    280
    ((get_byte(p) << 8) | get_byte(p));

    правильно как то так
    word var = get_byte(p) << 8;
    var |= get_byte(p);
     
  9. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    http://www.difranco.net/cop2220/op-prec.htm
     
  10. osox

    osox New Member

    Публикаций:
    0
    Регистрация:
    13 ноя 2009
    Сообщения:
    280
    Booster
    и ?
     
  11. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    osox
    Как что? Нет бага.
     
  12. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Код (Text):
    1. i = 1;
    2. i = (i++ * 2) | i++;
    чему равно i? :)
     
  13. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    n0name
    UB.
     
  14. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    > UB.
    угу.
    а почему вызов функции с грубо говоря i++ не должен приводить к UB?
     
  15. osox

    osox New Member

    Публикаций:
    0
    Регистрация:
    13 ноя 2009
    Сообщения:
    280
    Booster

    вот авторитетное мнение книга Искусство програмироваания на C
     
  16. osox

    osox New Member

    Публикаций:
    0
    Регистрация:
    13 ноя 2009
    Сообщения:
    280
    Booster
    если уж ты говориш нет бага объясняй почему я так вот считаю что есть и не только я объяснение простое подвыражения операции | могут вычислятся в любом порядке а ты с чего решил что все ок ?
     
  17. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Возможно вы правы.
     
  18. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    osox
    Да согласен я, ub ^).