Аннотация:
Рассмотрены программные ошибки, проявляющие себя при переносе Си++ — кода с 32-битных платформ на 64-битные платформы. Приведены примеры некорректного кода и способы его исправления. Перечислены методики и средства анализа кода, позволяющие диагностировать обсуждаемые ошибки.
Re: 20 ловушек переноса Си++ - кода на 64-битную платформу
АК>Авторы: АК>Андрей Карпов
АК>Аннотация: АК>Рассмотрены программные ошибки, проявляющие себя при переносе Си++ — кода с 32-битных платформ на 64-битные платформы. Приведены примеры некорректного кода и способы его исправления. Перечислены методики и средства анализа кода, позволяющие диагностировать обсуждаемые ошибки.
как приятно прочитать оглавление
Re[2]: 20 ловушек переноса Си++ - кода на 64-битную платформ
АК>>Авторы: АК>>Андрей Карпов
АК>>Аннотация: АК>>Рассмотрены программные ошибки, проявляющие себя при переносе Си++ — кода с 32-битных платформ на 64-битные платформы. Приведены примеры некорректного кода и способы его исправления. Перечислены методики и средства анализа кода, позволяющие диагностировать обсуждаемые ошибки.
А>как приятно прочитать оглавление
+1.
Не забудь автору сообщения еще и поставить оценку побольше!
Of course, the code must be complete enough to compile and link.
Re[3]: 20 ловушек переноса Си++ - кода на 64-битную платформ
АК>>>Авторы: АК>>>Андрей Карпов
АК>>>Аннотация: АК>>>Рассмотрены программные ошибки, проявляющие себя при переносе Си++ — кода с 32-битных платформ на 64-битные платформы. Приведены примеры некорректного кода и способы его исправления. Перечислены методики и средства анализа кода, позволяющие диагностировать обсуждаемые ошибки.
А>>как приятно прочитать оглавление L_L>+1. L_L>Не забудь автору сообщения еще и поставить оценку побольше!
да и тема то боянистая уже... только ленивый наверное не писал про эти ловушки ))
это было актуально года 3-4 назад -- когда первые ширпотребные 64бит камни только появлялись (тогда собственно все эти грабли были и пройдены в первый раз ) -- теперь вменяемый программист автоматически пишет код с оглядкой на 32/64 бит портабельность...
но безусловно, как учебный материал для juniorов будем надеяца он хорош... ))
Re[4]: 20 ловушек переноса Си++ - кода на 64-битную платформ
Z>да и тема то боянистая уже... только ленивый наверное не писал про эти ловушки )) Z>это было актуально года 3-4 назад -- когда первые ширпотребные 64бит камни только появлялись (тогда собственно все эти грабли были и пройдены в первый раз ) -- теперь вменяемый программист автоматически пишет код с оглядкой на 32/64 бит портабельность...
Z>но безусловно, как учебный материал для juniorов будем надеяца он хорош... ))
На самом рсдн уже раза два была тема и даже название там было такое же, я так понимаю, это та же статья, но только теперь она уже в рсдн опубликована
Of course, the code must be complete enough to compile and link.
Re[2]: 20 ловушек переноса Си++ - кода на 64-битную платформ
АК>Аннотация: АК>Рассмотрены программные ошибки, проявляющие себя при переносе Си++ — кода с 32-битных платформ на 64-битные платформы. Приведены примеры некорректного кода и способы его исправления. Перечислены методики и средства анализа кода, позволяющие диагностировать обсуждаемые ошибки.
Вах! Вах! Мою статью опубликовали. Хоть бы мне сообщили... Случайно наткнулся...
Печалит одно. Опубликован старый вариант (без многих исправлений). Знал бы — выслал им новый вариант. А то больше двух месяцев как отослал и тишина. Думал уж в корзину отправили.
p.s. Рекламная пауза.
Наша команда выпустила новую версию статического анализатора Си++ кода Viva64. Будем рады отзывам по его работе и предложениям по усовершенствованию.
Здравствуйте, Analytic2007, Вы писали:
A>Печалит одно. Опубликован старый вариант (без многих исправлений). Знал бы — выслал им новый вариант. А то больше двух месяцев как отослал и тишина. Думал уж в корзину отправили.
давай новую, на сайте ее выложим. Заодно узнаем про секретную 15-ю ловушку
... << RSDN@Home 1.2.0 alpha rev. 677>>
Re[3]: 20 ловушек переноса Си++ - кода на 64-битную платформ
Здравствуйте, Odi$$ey, Вы писали:
OE>Здравствуйте, Analytic2007, Вы писали:
A>>Печалит одно. Опубликован старый вариант (без многих исправлений). Знал бы — выслал им новый вариант. А то больше двух месяцев как отослал и тишина. Думал уж в корзину отправили.
OE>давай новую, на сайте ее выложим. Заодно узнаем про секретную 15-ю ловушку
Новая статья отправлена рецензенту RSDN.
Re: 20 ловушек переноса Си++ - кода на 64-битную платформу
АК>Авторы: АК> Андрей Карпов
АК>Аннотация: АК>Рассмотрены программные ошибки, проявляющие себя при переносе Си++ — кода с 32-битных платформ на 64-битные платформы. Приведены примеры некорректного кода и способы его исправления. Перечислены методики и средства анализа кода, позволяющие диагностировать обсуждаемые ошибки.
Проблема не в переходе на 64 битную платформу, проблема в языках программирования C/C++ и связанными с ними библиотеками. Все перечисленные ошибки являются следствием того безобразия — которое допускают стандарты языков при написании кода.Нормально продумманые ВЫСОКОУРОВНЕВЫЕ языки программирования, которые претендуют на ПЕРЕНОСИМОСТЬ себе такого не позволяют и отлавливают подобные ошибки на этапах компиляции.
Re: 20 ловушек переноса Си++ - кода на 64-битную платформу
Проблема не в переходе на 64 битную платформу, проблема в языках программирования C/C++ и связанными с ними библиотеками. Все перечисленные ошибки являются следствием того безобразия — которое допускают стандарты языков при написании кода.Нормально продумманые ВЫСОКОУРОВНЕВЫЕ языки программирования, которые претендуют на ПЕРЕНОСИМОСТЬ себе такого не позволяют и отлавливают подобные ошибки на этапах компиляции.
-----------------------------------------
Чтож так движок сайта тормозит, да и управление не очивидно !?
Re[2]: 20 ловушек переноса Си++ - кода на 64-битную платформ
А>Проблема не в переходе на 64 битную платформу, проблема в языках программирования C/C++ и связанными с ними библиотеками. Все перечисленные ошибки являются следствием того безобразия — которое допускают стандарты языков при написании кода.Нормально продумманые ВЫСОКОУРОВНЕВЫЕ языки программирования, которые претендуют на ПЕРЕНОСИМОСТЬ себе такого не позволяют и отлавливают подобные ошибки на этапах компиляции.
Расскажите более подробно о том, что хотите сказать.
Лучше с примерами, которые могут компилится на 16,32 и 64 битовый платформах.
Re[3]: 20 ловушек переноса Си++ - кода на 64-битную платформ
Здравствуйте, MShura, Вы писали: А>>Проблема не в переходе на 64 битную платформу, проблема в языках программирования C/C++ и связанными с ними библиотеками. Все перечисленные ошибки являются следствием того безобразия — которое допускают стандарты языков при написании кода.Нормально продумманые ВЫСОКОУРОВНЕВЫЕ языки программирования, которые претендуют на ПЕРЕНОСИМОСТЬ себе такого не позволяют и отлавливают подобные ошибки на этапах компиляции. MS>Расскажите более подробно о том, что хотите сказать. MS>Лучше с примерами, которые могут компилится на 16,32 и 64 битовый платформах.
Извиняюсь что вклиниваюсь...
Если раньше на 16&32 битных платформах (до 64бит платформ) нужен был стандартный тип заданной разрядности 8/16/32 были char/short/long. То теперь нет в принципе возможности создать переносимый код на три платформы т.к. long теперь толи 32 толи 64. В итоге чтоб написать банальный перенос/связь данных, нет возможности использовать один простой (без дефайнов и переопределний типов) заголовочник с описанием форматов данных переноса.
Re[4]: 20 ловушек переноса Си++ - кода на 64-битную платформ
IAR>Извиняюсь что вклиниваюсь... IAR>Если раньше на 16&32 битных платформах (до 64бит платформ) нужен был стандартный тип заданной разрядности 8/16/32 были char/short/long. То теперь нет в принципе возможности создать переносимый код на три платформы т.к. long теперь толи 32 толи 64. В итоге чтоб написать банальный перенос/связь данных, нет возможности использовать один простой (без дефайнов и переопределний типов) заголовочник с описанием форматов данных переноса.
Вы не правы. Если нужны фиксированные размеры, то и пользоваться нужно специальными типами.
Так на некоторых платформах sizeof(char)=sizeof(short)=sizeof(int)=sizeof(long)=1 (32 бита)
B это ни коим образом не противоречит стандарту.
Re[5]: 20 ловушек переноса Си++ - кода на 64-битную платформ
MS>Вы не правы. Если нужны фиксированные размеры, то и пользоваться нужно специальными типами. MS>Так на некоторых платформах sizeof(char)=sizeof(short)=sizeof(int)=sizeof(long)=1 (32 бита) MS>B это ни коим образом не противоречит стандарту.
да вы правы, стандарту не противоречит, что крайне не удобно...
Re: 20 ловушек переноса Си++ - кода на 64-битную платформу
Здравствуйте, Андрей Карпов, Вы писали:
АК>Рассмотрены программные ошибки, проявляющие себя при переносе Си++ — кода с 32-битных платформ на 64-битные платформы. Приведены примеры некорректного кода и способы его исправления. Перечислены методики и средства анализа кода, позволяющие диагностировать обсуждаемые ошибки.
Не понятно чем руководствовался микрософт когда long делал 32-битным на 64-битных системах??? моё мнение, что они просто перестраховались что бы меньше проблем разработчикам делать и те меньше за багами охотились .
И вот ещё что, хотел бы напомнить о "гениальном" ходе от всё того же микрософта для 64-битных систем, а именно предать анафеме весь FPU вместе с MMX и SSE. Процессор формально имеет команды FPU,MMX и SSE в режиме 64-бит, но монополисты в лице интела и микрософта решили видимо со временем полностью избавиться от этих рудиментов и сэкономить на силиконе, и поэтому вся арифметика идёт теперь только на SSE2 и более. Это тоже источник проблем, хотя бы потому что точность другая, вернее настраиваится она по другому и обработка исключений соответственно другая. Ну а тот кто решится на написание комманды __asm для 64-бит тот вообще будет послан компилятором очень далеко, что в принципе правильно, но неприятно .
Не хочу каркать, но тенденция такая, что микрософт со временем вообще скажет типа забудьте о С и С++ и рисуйте всё на С# под .net, потому что новые камушки от интела работают на суперпупер микрокоде гениальном а потому закрытом и известному только микрософту, да ещё и обновляется каждый вторник через апдейты.
Re[2]: 20 ловушек переноса Си++ - кода на 64-битную платформ
A>Не понятно чем руководствовался микрософт когда long делал 32-битным на 64-битных системах??? моё мнение, что они просто
а зачем перелопачивать тонны кода из-за перехода на другую платформу ?
большинство типов типа ptrdiff, size_t иметь достаточно чтобы не заморачиваться с переносимостью
A>Не хочу каркать, но тенденция такая, что микрософт со временем вообще скажет типа забудьте о С и С++ и рисуйте всё на С#
пока не видать такой тенденции все новое пишется на С++ как среды, ОС , сервисы, office.
С# и дотнет — это майстрим для разработчков домашней кухни.
Re[3]: 20 ловушек переноса Си++ - кода на 64-битную платформ
Ещё одна ловушка. Она, правда, не относится именно к С/С++. Не на всех 64-битных платформах есть атомарные операции над двойным словом (128 бит). На последних x86-64 они уже присутствуют, а вот на самых первых не было. B это большая подстава со стороны Intel/AMD — вначале дали фичу в руки разработчиков на 32-битных платформах, а потом жёстко отобрали на 64-битных. А что делать с разработанными алгоритмами — не понятно...
Под Windows надо проверять наличие этой возможности с помощью IsProcessorFeaturePresent(PF_COMPARE_EXCHANGE128).
Если не доступна, то тут есть несколько вариантов.
1. Можно добавить к переменной легковесный спин-лок, и защищать все модификации с помощью этого спин-лока.
Чтение, кстати, не обязательно защищать, если все модификации будут производиться с помощью атомарных 128-битных сохранений (а загрузки соотв. с помощью атомарных 128-битных загрузок).
2. Если в переменной хранились 2 32-битных числа (не указатели), то можно их так и оставить 32-битными. Тогда никакой проблемы не будет.
3. Если в переменной хранились 2 указателя, то можно с помощью VirtualAlloc() зарезервировать пулы памяти (по 4 Гб), и выделять память из этих пулов. Тогда размер указателя фактически остаётся 32 бита.
4. Если в переменной хранился указатель и число, то можно попробовать упаковать из в одно 64-битное слово. Под Windows 64 в одно 64-битное слово можно упаковать указатель и 25-битное (!) число. Этот приём используется в SList API (InitializeSListHead) на 64-битных платформах.
Вот на такие извращения приходится идти из-за криворукости производителей процессоров...