The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

Основы написания переносимого кода

26.03.2008 10:59

Сергей Каличев представил перевод статьи с описанием типичных проблем, возникающих при написании переносимого кода, некоторые из проблемы очевидны, но ошибки, с ними связанные, продолжают регулярно появляться в реальном коде.

  1. Главная ссылка к новости (http://lex.iki.rssi.ru/~serj/d...)
Лицензия: CC BY 3.0
Короткая ссылка: https://opennet.ru/14963-porting
Ключевые слова: porting, gcc
При перепечатке указание ссылки на opennet.ru обязательно


Обсуждение (16) Ajax | 1 уровень | Линейный | +/- | Раскрыть всё | RSS
  • 1.1, Аноним (-), 11:18, 26/03/2008 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Куча грамматических ошибок :(
     
  • 1.2, Konwin (ok), 11:19, 26/03/2008 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Мне вот интересно - написание переносимого кода описывается уже лет 20 так - зачем писать что-то еще?
     
  • 1.3, Ivan_Dives (ok), 11:43, 26/03/2008 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    revision 1.8
    date: 2001/11/29 22:55:57; author: ross; state: Exp; lines: +1 -6
    Delete the old BUGS section entry:
    > On the VAX bytes are handled backwards from most everyone else in
    > the world. This is not expected to be fixed in the near future.

    не понял при чём тут вакс. Это, насколько я знаю, компьютеры, которые использовались ещё в 1970... так к чему они здесь?

     
     
  • 2.4, whirlwind (?), 12:12, 26/03/2008 [^] [^^] [^^^] [ответить]  
  • +/
    это такой тончайший юмор, в конце статьи пояснение:
    >В названии (''Fighting the lemmings'') нет какого-то особого смысла. Раньше мы говорили >''весь мир VAX'', а теперь весь мир -- i386 и везде работает linux. Все авторы просто >следуют за этим ''леммингом -- вожаком'' и пишут (а ещё хуже -- тестируют) код >исключительно под i386/linux.
     
  • 2.5, Ivan_Dives (ok), 12:15, 26/03/2008 [^] [^^] [^^^] [ответить]  
  • +/
    >revision 1.8
    >date: 2001/11/29 22:55:57; author: ross; state: Exp; lines: +1 -6
    >Delete the old BUGS section entry:
    >> On the VAX bytes are handled backwards from most everyone else in
    >> the world. This is not expected to be fixed in the near future.
    >
    >не понял при чём тут вакс. Это, насколько я знаю, компьютеры, которые
    >использовались ещё в 1970... так к чему они здесь?

    всё, понял

     

  • 1.6, послушайте (?), 12:17, 26/03/2008 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    > Хотя портирование на NetBSD/sparc64 практически является таким тестом ;-)

    собственно я сейчас там на sparc64.

    и вот такая конструкция:
    uint8_t a[] = { 41, 0, 0, 0, 1, 0, 0, 2, 0, 0, 0, 3 };

    uint32_t u32 = *((uint32_t *) &a[1]);

    дает Bus error.

    это просто пример, пришлось определить (не дословно):
    #define LOAD32(p, b)    b=(((((((uint32_t)(((b) & 0) | *(((uint8_t *)p) + 3)) << 8) | *(((uint8_t *)p) + 2)) << 8) | *(((uint8_t *)p) + 1)) << 8) | *((uint8_t *)p))

    но это думаю медленно, можно как нибудь оптимизировать?

     
     
  • 2.7, a (??), 14:15, 26/03/2008 [^] [^^] [^^^] [ответить]  
  • +/
    typedef union {
      char a[4];
      uint32_t b;
    } c_t;

    c_t c;

    c.a[0] = 41;c.a[1] = 0;c.a[2] = 0;c.a[0] = 0;

    printf("%u", c.b);

     
  • 2.8, Аноним (8), 18:06, 26/03/2008 [^] [^^] [^^^] [ответить]  
  • +/
    и вот такая конструкция:
    uint8_t a[] = { 41, 0, 0, 0, 1, 0, 0, 2, 0, 0, 0, 3 };

    uint32_t u32 = *((uint32_t *) &a[1]);

    дает Bus error.


    ЧУВАААК, почитай доки к gcc, в частности non-bugs.txt или как там. ЗАПРЕЩЕНО такое делать.
    Чтобы это заработало у gcc есть ключик, но они говорят что в стандартах на C такое поведение не описано, поэтому сосямба. Ну и ничего что этот код совершенно непереносим из-за endianess?

     
     
  • 3.13, послушайте (?), 10:34, 27/03/2008 [^] [^^] [^^^] [ответить]  
  • +/

    >ЧУВАААК, почитай доки к gcc, в частности non-bugs.txt или как там. ЗАПРЕЩЕНО
    >такое делать.
    >Чтобы это заработало у gcc есть ключик, но они говорят что в
    >стандартах на C такое поведение не описано, поэтому сосямба. Ну и
    >ничего что этот код совершенно непереносим из-за endianess?

    ЧУВАК это просто ПРИМЕР чтобы смысл в чем ОШИБКА показать..

     
  • 2.9, Аноним (8), 20:02, 26/03/2008 [^] [^^] [^^^] [ответить]  
  • +/
    > и вот такая конструкция:
    > uint8_t a[] = { 41, 0, 0, 0, 1, 0, 0, 2, 0, 0, 0, 3 };
    > uint32_t u32 = *((uint32_t *) &a[1]);
    > дает Bus error.

    И это ты типа удивлен? 'Вон из профессии!' (C)

     
  • 2.11, очень жаль (?), 10:30, 27/03/2008 [^] [^^] [^^^] [ответить]  
  • +/
    ну чи то разорались? умные все что ли?
    пытаюсь перенести игрушку одну с DOS с РЕСУРСАМИ это вам вообще о чем нибудь говорит?
    а
     
     
  • 3.12, очень жаль (?), 10:31, 27/03/2008 [^] [^^] [^^^] [ответить]  
  • +/
    для тех кто все еще ТРАМВАЕ - РЕСУРСЫ БИНАРНЫЕ
     

  • 1.10, pavlinux (ok), 23:26, 26/03/2008 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Сергей Каличев - статья полезная, перевод нужный...

    Давеча, пролетало, https://www.securecoding.cert.org/confluence/display/seccode/CERT+C+Secure+Cod

    Уже можете переводить :)

     
  • 1.14, vle (?), 11:10, 27/03/2008 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Мда, "К сожалению, NetBSD заботится о двоичной совместимости".
    Как раз к счастью NetBSD заботиться о бинарной совместимости, и очень жаль тех, кто о ней не заботится.
     
  • 1.15, Аноним (15), 12:56, 28/03/2008 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Статья на слабую тройку Перечислено только около 10 типичных ошибок программ... большой текст свёрнут, показать
     
     
  • 2.16, gena2x (?), 14:34, 12/02/2009 [^] [^^] [^^^] [ответить]  
  • +/
    >Как можно перепутать обращение к невыравненным данным (по их размеру) с проблеммой strict алиасинга в (я бы посоветовал gena2x попробовать свой тест на ветке 2.x.x - 3.x.x например )?

    Пример приводился для x86/linux/gcc. sizeof(int)==sizeof(long) - о каком выравнивании (по размеру) речь?

    Да, надо было дописать что -fstrict-aliasing только в четвертой ветке по умолчанию включается в -O2.

    >Wstrict-aliasing=2 тогда все проблемные места будет сразу видно:

    Не все, к сожалению, посему придётся разобраться в проблеме.

    > То дает инструкцию компилятору считать что все указатели разных типов указывают на непересекающиеся области памяти.

    Почти все, char* например - исключение.

     
     Добавить комментарий
    Имя:
    E-Mail:
    Текст:



    Партнёры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2024 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру