26.03.2008 10:59
Основы написания переносимого кода
|
 |
|
Сергей Каличев представил перевод статьи с описанием типичных проблем, возникающих при написании переносимого кода, некоторые из проблемы очевидны, но ошибки, с ними связанные, продолжают регулярно появляться в реальном коде.
|
|
|
- Главная ссылка к новости (http://lex.iki.rssi.ru/~serj/docs/...)
|
| Ключевые слова: porting, gcc, (найти похожие документы)
| | Параметры:
|
| Вид: яз. русский |
Тип: Практикум |
|
| При перепечатке указание ссылки на opennet.ru обязательно |
| Реклама |
|
|
|
| |
| Основы написания переносимого кода, Ivan_Dives, 11:43, 26/03/2008 [ответить] (3)
| +/– |
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... так к чему они здесь?
|
| |
| Основы написания переносимого кода, whirlwind, 12:12, 26/03/2008 [ответить] (4)
| +/– |
это такой тончайший юмор, в конце статьи пояснение:
>В названии (''Fighting the lemmings'') нет какого-то особого смысла. Раньше мы говорили >''весь мир VAX'', а теперь весь мир -- i386 и везде работает linux. Все авторы просто >следуют за этим ''леммингом -- вожаком'' и пишут (а ещё хуже -- тестируют) код >исключительно под i386/linux. |
| Основы написания переносимого кода, Ivan_Dives, 12:15, 26/03/2008 [ответить] (5)
| +/– |
>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... так к чему они здесь?
всё, понял
|
|
| OpenNews: Основы написания переносимого , послушайте, 12:17, 26/03/2008 [ответить] (6)
| +/– | |
> Хотя портирование на 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))
но это думаю медленно, можно как нибудь оптимизировать?
|
| |
| |
| OpenNews: Основы написания переносимого , послушайте, 10:34, 27/03/2008 [ответить] (13)
| +/– |
>ЧУВАААК, почитай доки к gcc, в частности non-bugs.txt или как там. ЗАПРЕЩЕНО
>такое делать.
>Чтобы это заработало у gcc есть ключик, но они говорят что в
>стандартах на C такое поведение не описано, поэтому сосямба. Ну и
>ничего что этот код совершенно непереносим из-за endianess?
ЧУВАК это просто ПРИМЕР чтобы смысл в чем ОШИБКА показать..
|
|
|
| Основы написания переносимого кода, pavlinux, 23:26, 26/03/2008 [ответить] (10)
| +/– | |
Сергей Каличев - статья полезная, перевод нужный...
Давеча, пролетало, https://www.securecoding.cert.org/confluence/display/seccode/CERT+C+Secure+Coding+Standard
Уже можете переводить :)
|
| Основы написания переносимого кода, vle, 11:10, 27/03/2008 [ответить] (14)
| +/– |
Мда, "К сожалению, NetBSD заботится о двоичной совместимости".
Как раз к счастью NetBSD заботиться о бинарной совместимости, и очень жаль тех, кто о ней не заботится.
|
| |
| Гм..., gena2x, 14:34, 12/02/2009 [ответить] (16)
| +/– | |
>Как можно перепутать обращение к невыравненным данным (по их размеру) с проблеммой strict алиасинга в (я бы посоветовал gena2x попробовать свой тест на ветке 2.x.x - 3.x.x например )?
Пример приводился для x86/linux/gcc. sizeof(int)==sizeof(long) - о каком выравнивании (по размеру) речь?
Да, надо было дописать что -fstrict-aliasing только в четвертой ветке по умолчанию включается в -O2.
>Wstrict-aliasing=2 тогда все проблемные места будет сразу видно:
Не все, к сожалению, посему придётся разобраться в проблеме.
> То дает инструкцию компилятору считать что все указатели разных типов указывают на непересекающиеся области памяти.
Почти все, char* например - исключение.
|
|
|
|
| Ваш комментарий |
|
|
| |
|