Мы занимаемся вопросами разработки и тестирования 64-битных приложений. Недавно мы написали новую статью: 20 issues of porting C++ code on the 64-bit platform.
Аннотация. Рассмотрены программные ошибки, проявляющие себя при переносе Си++ — кода с 32-битных платформ на 64-битные платформы. Приведены примеры некорректного кода и способы его исправления. Перечислены методики и средства анализа кода, позволяющие диагностировать обсуждаемые ошибки.
Здравствуйте, Analytic2007, Вы писали:
A>Мы занимаемся вопросами разработки и тестирования 64-битных приложений. Недавно мы написали новую статью: 20 issues of porting C++ code on the 64-bit platform.
Пролистал половину, остальное вечером дочитаю. Статья вроде дельная. Спасибо за работу.
A>Мы занимаемся вопросами разработки и тестирования 64-битных приложений. Недавно мы написали новую статью: 20 issues of porting C++ code on the 64-bit platform.
Мне кажется, что эта статья опоздала примерно на год.
P.S.
Ничего полезного не обнаружил.
Re[2]: 20 ловушек переноса Си++ - кода на 64-битную платформ
От:
Аноним
Дата:
19.03.07 14:32
Оценка:
Здравствуйте, MShura, Вы писали:
A>>Мы занимаемся вопросами разработки и тестирования 64-битных приложений. Недавно мы написали новую статью: 20 issues of porting C++ code on the 64-bit platform.
MS>Мне кажется, что эта статья опоздала примерно на год.
В смысле?
Уже все системы перенесли на 64-битную архитектуру?
Re[3]: 20 ловушек переноса Си++ - кода на 64-битную платформ
Где здесь safe cast? sizeof(ENumbers) <= sizeof(int), это платформенно-зависимо. Если компилятор захочет, он запихает его в 1 байт, и всё поплывёт ровно так же, как поплыло с 8-байтным size_t в //unsafe cast
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
Re[2]: 20 ловушек переноса Си++ - кода на 64-битную платформ
К>Где здесь safe cast? sizeof(ENumbers) <= sizeof(int), это платформенно-зависимо. Если компилятор захочет, он запихает его в 1 байт, и всё поплывёт ровно так же, как поплыло с 8-байтным size_t в //unsafe cast
Согласен с замечанием. Схалтурил.
p.s.
Прошу продолжать.
Re: 20 ловушек переноса Си++ - кода на 64-битную платформу
Здравствуйте, Analytic2007, Вы писали:
A>Мы занимаемся вопросами разработки и тестирования 64-битных приложений. Недавно мы написали новую статью: 20 issues of porting C++ code on the 64-bit platform.
Что за бред товарищи ?
time_t — 64 bit на 32-битной тоже. Вы с миграцией на VS8 попутали
Re: 20 ловушек переноса Си++ - кода на 64-битную платформу
От:
Аноним
Дата:
19.03.07 15:37
Оценка:
A>Мы будем рады получить ваши отзывы, замечания, поправки, дополнения, которые будут внесены следующие версии статьи. A>---- A>Viva64 team, www.Viva64.com
сходу не увидел про работу с файлами и off_t и f_pos.
имхо надо бы добавить
Re: 20 ловушек переноса Си++ - кода на 64-битную платформу
Здравствуйте, Analytic2007, Вы писали:
A>Мы будем рады получить ваши отзывы, замечания, поправки, дополнения, которые будут внесены следующие версии статьи.
Английский язык корявый.
Re: 20 ловушек переноса Си++ - кода на 64-битную платформу
Обычно все проблемы решаются, когда пишешь изначально кросплатформенный код.
Пишется библиотека, определяются общие типы, которые уже опредлеляются для каждой платформы, операции над типам, учитываются BigEngian, LittleEndian или другая платформа.
После чего в своем коде используются не стандартные int, long и т д... а свои введенные, аля
INT8, INT16, INT24, INT32, INT64, а так же размеры адресного пространства и многие другие вещи.
После чего имеем код, который компилится под любую платформу и прекрасно там работает =)
Re[2]: 20 ловушек переноса Си++ - кода на 64-битную платформ
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, korzhik, Вы писали:
K>>1. Off-warnings
K>>unsigned char *array[50]; K>>unsigned char size = sizeof(array); K>>32-bit system: sizeof(array) = 200 K>>64-bit system: sizeof(array) = 400
А>А в чем ловушка-то? Только в том что 400 не лезет в unsigned char?
ну да
Re[4]: 20 ловушек переноса Си++ - кода на 64-битную платформ
От:
Аноним
Дата:
21.03.07 08:41
Оценка:
Здравствуйте, korzhik, Вы писали:
K>>>1. Off-warnings
K>>>unsigned char *array[50]; K>>>unsigned char size = sizeof(array); K>>>32-bit system: sizeof(array) = 200 K>>>64-bit system: sizeof(array) = 400
А>>А в чем ловушка-то? Только в том что 400 не лезет в unsigned char?
K>ну да
Ну так это проблема не 64-битных систем, а кривости рук разработчика. Если ему придется заменить на char *array[100] возникнет точно такая проблема.
Re[5]: 20 ловушек переноса Си++ - кода на 64-битную платформ
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, korzhik, Вы писали:
K>>>>1. Off-warnings
K>>>>unsigned char *array[50]; K>>>>unsigned char size = sizeof(array); K>>>>32-bit system: sizeof(array) = 200 K>>>>64-bit system: sizeof(array) = 400
А>>>А в чем ловушка-то? Только в том что 400 не лезет в unsigned char?
K>>ну да
А>Ну так это проблема не 64-битных систем, а кривости рук разработчика. Если ему придется заменить на char *array[100] возникнет точно такая проблема.
ну да
Re: 20 ловушек переноса Си++ - кода на 64-битную платформу
Здравствуйте, Analytic2007, Вы писали: A>Текст статьи на английском языке (PDF) A>Мы будем рады получить ваши отзывы, замечания, поправки, дополнения, которые будут внесены следующие версии статьи.
-1. Что у вас с кернингом? В evince под линуксом (движок xpdf) буквы просто наезжают друг на друга, в acrobat reader'е под виндой эффект меньше, но все равно есть.
0. Английский язык, мягко говоря, стремный. Например "capable to keep" --> "capable of keeping" и многое другое, русскоязычное построение предложений просто выпирает.
Далее по разделам.
1. Off-warnings. Ну опять английский... "WTF!", подумал я, переведя это дело как "внешне-предупреждения" Я бы вообще сделал заголовки в активной форме, т.е. не что неправильно, а как поступить чтобы было правильно. В частности, название этого раздела написал бы в виде "Enable full warnings for the whole project". Ну и то что это проблема кривых рук вообще (увеличение массива в два раза тоже приведет к проблемам) тут уже написали.
2. Это не проблема функций с переменным числом аргументов. Функция int sum_int(unsigned count,...); от этого не страдает. Это проблема функций с c-style форматными строками.
3. Я бы разделил на два раздела. Одно дело магические числа, когда предполагается что размер указателя 4 байта, а другое -- когда константы без явного указания размера предполагаются имеющими тип int.
4. Дас ист фантастиш. Программиста, который так делает (на любой платформе) надо засушить и выставить в музее, в назидание остальным. Ну или хотя бы не подпускать к плавучке.
8. Ну то что размер enum'а не обязан совпадать с размером int'а тут уже сказали. За это надо программиста бить по рукам независимо от платформы.
12. Тоже в общем-то проблема непонимания целочисленной арифметики в C, а не
17. См. комментарий внизу. Впечатление притянутости за уши. Рассматриваемый дизайн вообще сам по себе стремный, это аккуратно подложенные грабли независимо от платформы.
19. То же самое, садизм какой-то. Эти грабли должны были быть найдены гораздо раньше портирования, например если бы кто-то завел привычку кидаться не только int'ами, но еще и скажем long long
Почему я вообще делал комментарии вида "За это надо программиста бить по рукам" -- это потому, что если быть до конца последовательными в этом вопросе, надо перечислять вообще ВСЕ ошибки, совершаемые неопытными программистами В противном случае это производит впечатление притягивания за уши, чисто для объема статьи.
Re[3]: 20 ловушек переноса Си++ - кода на 64-битную платформ
Заключение
…
Мы будем рады получить ваши отзывы, замечания, поправки, дополнения и непременно внесу их в следующую версию статьи.
6. Упаковка указателей
…
В конце хочется заметить, что плохим стилем будет упаковка указателя в типы всегда равные 64-битам. Показанный далее код вновь придётся исправлять с приходом 128-битных систем.
PVOID p;
// Bad style. The 128-bit time will come.__int64 n = __int64(p);
p = PVOID(n);
А что, существуют 128-битные платформы? Хотя бы в планах?
Здравствуйте, 0x8000FFFF, Вы писали: FFF>После чего в своем коде используются не стандартные int, long и т д... а свои введенные, аля FFF>INT8, INT16, INT24, INT32, INT64, а так же размеры адресного пространства и многие другие вещи.
Int24 – это на каких платформах бывает?
Пётр Седов (ушёл с RSDN)
Re[4]: 20 ловушек переноса Си++ - кода на 64-битную платформ
ПС>Здравствуйте, 0x8000FFFF, Вы писали: FFF>>После чего в своем коде используются не стандартные int, long и т д... а свои введенные, аля FFF>>INT8, INT16, INT24, INT32, INT64, а так же размеры адресного пространства и многие другие вещи. ПС>Int24 – это на каких платформах бывает?
Здравствуйте, Lepsik, Вы писали: ПС>>А что, существуют 128-битные платформы? Хотя бы в планах? L>PlayStation 2 computer entertainment system's Emotion Engine CPU is a 128-bit processor.
PlayStation 2 – это 32-битная платформа (там всего лишь 32 MB оперативной памяти). int и указатели там 32-битные.
Пётр Седов (ушёл с RSDN)
Re[5]: 20 ловушек переноса Си++ - кода на 64-битную платформ
Здравствуйте, Аноним, Вы писали:
K>>>>unsigned char *array[50]; K>>>>unsigned char size = sizeof(array); K>>>>32-bit system: sizeof(array) = 200 K>>>>64-bit system: sizeof(array) = 400
А>Ну так это проблема не 64-битных систем, а кривости рук разработчика. Если ему придется заменить на char *array[100] возникнет точно такая проблема.
Да. Но, смысл был в том, чтобы подчеркнуть важность предупреждений выдаваемых компилятором, при переносе
программы на новую платформу.
Re[2]: 20 ловушек переноса Си++ - кода на 64-битную платформ
Здравствуйте, Аноним, Вы писали:
А>сходу не увидел про работу с файлами и off_t и f_pos. А>имхо надо бы добавить
Лично я с проблемами при работе с файлами не сталкивался. А, фантазировать не хочется. Буду благодарен Вам за пример подобных ошибок (связанных с off_t и f_pos).
Re[4]: 20 ловушек переноса Си++ - кода на 64-битную платформ
Ну, по поводу оперативности.... Статья на русском ужу готова была. При чем мы месяц назад хотели ее здесь на RSDN выложить. Написали письмо. В ответ уже месяц тишина.
Re[4]: 20 ловушек переноса Си++ - кода на 64-битную платформ
Здравствуйте, Пётр Седов, Вы писали:
ПС>Мы будем рады получить ваши отзывы, замечания, поправки, дополнения и непременно внесу их в следующую версию
Эх. Учтем. Спасибо.
ПС>А что, существуют 128-битные платформы? Хотя бы в планах?
Если и нет — то будут.
Re[2]: 20 ловушек переноса Си++ - кода на 64-битную платформ
Здравствуйте, 0x8000FFFF, Вы писали:
FFF>Обычно все проблемы решаются, когда пишешь изначально кросплатформенный код. FFF>Пишется библиотека, определяются общие типы, которые уже опредлеляются для каждой платформы, операции над типам, учитываются BigEngian, LittleEndian или другая платформа.
FFF>После чего в своем коде используются не стандартные int, long и т д... а свои введенные, аля FFF>INT8, INT16, INT24, INT32, INT64, а так же размеры адресного пространства и многие другие вещи.
FFF>После чего имеем код, который компилится под любую платформу и прекрасно там работает =)
1) Мы сами пробовали такой подход и остались недовольны. Но спорить не буду.
Это отдельную статью писать надо.
2) То, что предлагается, к сожалению никак не может помочь при переносе УЖЕ существующего кода.
Re[2]: 20 ловушек переноса Си++ - кода на 64-битную платформ
Здравствуйте, Eugene Kilachkoff, Вы писали:
EK>-1. Что у вас с кернингом? В evince под линуксом (движок xpdf) буквы просто наезжают друг на друга, в acrobat reader'е под виндой эффект меньше, но все равно есть.
Будем смотреть. Спасибо.
EK>0. Английский язык, мягко говоря, стремный. Например "capable to keep" --> "capable of keeping" и многое другое, русскоязычное построение предложений просто выпирает.
Знаем. Постараемся улучшить. Кто читает английский вариант — большая просьба присылать пометки (karpov@viva64 .dot. com). Будем очень благодарны.
EK>Далее по разделам.
EK>2. Это не проблема функций с переменным числом аргументов. Функция int sum_int(unsigned count,...); от этого не страдает. Это проблема функций с c-style форматными строками.
Не обязательно. Можно и нечто новое придумать. Проблема функций с c-style форматными строками — просто самая распространенная.
Here is a table of the common data models that Lua supports:
Data model
short
int
long
long long
void*
size_t
ptrdiff_t
Platform examples
LP32
16
16
32
-
32
16
32
WIN16, MSDOS-large
ILP32
16
32
32
[64]
32
32
32
WIN32, Unix-32bit
L64
16
32
64
-
32
32
32
PS2
LP64
16
32
64
64
64
64
64
Unix-64bit
LLP64
16
32
32
64
64
64
64
WIN64
ILP64
16
64
64
64
64
64
64
(abandoned ~'95)
Поэтому с точки зрения C/C++-программиста PlayStation 2 – это 32-битная платформа. Оно и понятно: чтобы адресовать 32 MB оперативной памяти, 32-битного указателя вполне достаточно (а вот 128-битный указатель – это был бы перебор).