20 ловушек переноса Си++ - кода на 64-битную платформу
От: Андрей Карпов Россия https://www.viva64.com/ru/pvs-studio/
Дата: 25.04.07 14:13
Оценка: 100 (6) -2
Статья:
20 ловушек переноса Си++ — кода на 64-битную платформу
Автор(ы): Андрей Карпов
Дата: 25.04.2007
Рассмотрены программные ошибки, проявляющие себя при переносе Си++ — кода с 32-битных платформ на 64-битные платформы. Приведены примеры некорректного кода и способы его исправления. Перечислены методики и средства анализа кода, позволяющие диагностировать обсуждаемые ошибки.


Авторы:
Андрей Карпов

Аннотация:
Рассмотрены программные ошибки, проявляющие себя при переносе Си++ — кода с 32-битных платформ на 64-битные платформы. Приведены примеры некорректного кода и способы его исправления. Перечислены методики и средства анализа кода, позволяющие диагностировать обсуждаемые ошибки.
Re: 20 ловушек переноса Си++ - кода на 64-битную платформу
От: Аноним  
Дата: 26.04.07 07:57
Оценка:
Здравствуйте, Андрей Карпов, Вы писали:

АК>Статья:

АК>20 ловушек переноса Си++ — кода на 64-битную платформу
Автор(ы): Андрей Карпов
Дата: 25.04.2007
Рассмотрены программные ошибки, проявляющие себя при переносе Си++ — кода с 32-битных платформ на 64-битные платформы. Приведены примеры некорректного кода и способы его исправления. Перечислены методики и средства анализа кода, позволяющие диагностировать обсуждаемые ошибки.


АК>Авторы:

АК>Андрей Карпов

АК>Аннотация:

АК>Рассмотрены программные ошибки, проявляющие себя при переносе Си++ — кода с 32-битных платформ на 64-битные платформы. Приведены примеры некорректного кода и способы его исправления. Перечислены методики и средства анализа кода, позволяющие диагностировать обсуждаемые ошибки.

как приятно прочитать оглавление
Re[2]: 20 ловушек переноса Си++ - кода на 64-битную платформ
От: Lorenzo_LAMAS  
Дата: 26.04.07 08:14
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Андрей Карпов, Вы писали:


АК>>Статья:

АК>>20 ловушек переноса Си++ — кода на 64-битную платформу
Автор(ы): Андрей Карпов
Дата: 25.04.2007
Рассмотрены программные ошибки, проявляющие себя при переносе Си++ — кода с 32-битных платформ на 64-битные платформы. Приведены примеры некорректного кода и способы его исправления. Перечислены методики и средства анализа кода, позволяющие диагностировать обсуждаемые ошибки.


АК>>Авторы:

АК>>Андрей Карпов

АК>>Аннотация:

АК>>Рассмотрены программные ошибки, проявляющие себя при переносе Си++ — кода с 32-битных платформ на 64-битные платформы. Приведены примеры некорректного кода и способы его исправления. Перечислены методики и средства анализа кода, позволяющие диагностировать обсуждаемые ошибки.

А>как приятно прочитать оглавление

+1.
Не забудь автору сообщения еще и поставить оценку побольше!
Of course, the code must be complete enough to compile and link.
Re[3]: 20 ловушек переноса Си++ - кода на 64-битную платформ
От: zaufi Земля  
Дата: 26.04.07 08:34
Оценка: +2
Здравствуйте, Lorenzo_LAMAS, Вы писали:

L_L>Здравствуйте, Аноним, Вы писали:


А>>Здравствуйте, Андрей Карпов, Вы писали:


АК>>>Статья:

АК>>>20 ловушек переноса Си++ — кода на 64-битную платформу
Автор(ы): Андрей Карпов
Дата: 25.04.2007
Рассмотрены программные ошибки, проявляющие себя при переносе Си++ — кода с 32-битных платформ на 64-битные платформы. Приведены примеры некорректного кода и способы его исправления. Перечислены методики и средства анализа кода, позволяющие диагностировать обсуждаемые ошибки.


АК>>>Авторы:

АК>>>Андрей Карпов

АК>>>Аннотация:

АК>>>Рассмотрены программные ошибки, проявляющие себя при переносе Си++ — кода с 32-битных платформ на 64-битные платформы. Приведены примеры некорректного кода и способы его исправления. Перечислены методики и средства анализа кода, позволяющие диагностировать обсуждаемые ошибки.

А>>как приятно прочитать оглавление

L_L>+1.
L_L>Не забудь автору сообщения еще и поставить оценку побольше!

да и тема то боянистая уже... только ленивый наверное не писал про эти ловушки ))
это было актуально года 3-4 назад -- когда первые ширпотребные 64бит камни только появлялись (тогда собственно все эти грабли были и пройдены в первый раз ) -- теперь вменяемый программист автоматически пишет код с оглядкой на 32/64 бит портабельность...

но безусловно, как учебный материал для juniorов будем надеяца он хорош... ))
Re[4]: 20 ловушек переноса Си++ - кода на 64-битную платформ
От: Lorenzo_LAMAS  
Дата: 26.04.07 09:29
Оценка:
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-битную платформ
От: Кодт Россия  
Дата: 26.04.07 10:02
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>как приятно прочитать оглавление


А прочитать красный текст под оглавлением?

Полная версия этой статьи опубликована в журнале RSDN Magazine #1-2007.

То есть, это анонс.

Статьи из журнала появляются онлайн с определённой задержкой.
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
Re: 20 ловушек переноса Си++ - кода на 64-битную платформу
От: Analytic2007 Россия https://www.viva64.com/ru/pvs-studio/
Дата: 30.04.07 16:49
Оценка:
АК>Статья:
АК>20 ловушек переноса Си++ &mdash; кода на 64-битную платформу
Автор(ы): Андрей Карпов
Дата: 25.04.2007
Рассмотрены программные ошибки, проявляющие себя при переносе Си++ — кода с 32-битных платформ на 64-битные платформы. Приведены примеры некорректного кода и способы его исправления. Перечислены методики и средства анализа кода, позволяющие диагностировать обсуждаемые ошибки.


АК>Аннотация:

АК>Рассмотрены программные ошибки, проявляющие себя при переносе Си++ — кода с 32-битных платформ на 64-битные платформы. Приведены примеры некорректного кода и способы его исправления. Перечислены методики и средства анализа кода, позволяющие диагностировать обсуждаемые ошибки.

Вах! Вах! Мою статью опубликовали. Хоть бы мне сообщили... Случайно наткнулся...
Печалит одно. Опубликован старый вариант (без многих исправлений). Знал бы — выслал им новый вариант. А то больше двух месяцев как отослал и тишина. Думал уж в корзину отправили.

p.s. Рекламная пауза.
Наша команда выпустила новую версию статического анализатора Си++ кода Viva64. Будем рады отзывам по его работе и предложениям по усовершенствованию.

www.Viva64.com
Re[2]: 20 ловушек переноса Си++ - кода на 64-битную платформ
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 01.05.07 05:03
Оценка:
Здравствуйте, Analytic2007, Вы писали:

A>Печалит одно. Опубликован старый вариант (без многих исправлений). Знал бы — выслал им новый вариант. А то больше двух месяцев как отослал и тишина. Думал уж в корзину отправили.


давай новую, на сайте ее выложим. Заодно узнаем про секретную 15-ю ловушку
... << RSDN@Home 1.2.0 alpha rev. 677>>
Re[3]: 20 ловушек переноса Си++ - кода на 64-битную платформ
От: Analytic2007 Россия https://www.viva64.com/ru/pvs-studio/
Дата: 06.05.07 06:27
Оценка:
Здравствуйте, Odi$$ey, Вы писали:

OE>Здравствуйте, Analytic2007, Вы писали:


A>>Печалит одно. Опубликован старый вариант (без многих исправлений). Знал бы — выслал им новый вариант. А то больше двух месяцев как отослал и тишина. Думал уж в корзину отправили.


OE>давай новую, на сайте ее выложим. Заодно узнаем про секретную 15-ю ловушку


Новая статья отправлена рецензенту RSDN.
Re: 20 ловушек переноса Си++ - кода на 64-битную платформу
От: Аноним  
Дата: 26.07.07 12:46
Оценка: -1
Здравствуйте, Андрей Карпов, Вы писали:

АК>Статья:

АК>20 ловушек переноса Си++ &mdash; кода на 64-битную платформу
Автор(ы): Андрей Карпов
Дата: 25.04.2007
Рассмотрены программные ошибки, проявляющие себя при переносе Си++ — кода с 32-битных платформ на 64-битные платформы. Приведены примеры некорректного кода и способы его исправления. Перечислены методики и средства анализа кода, позволяющие диагностировать обсуждаемые ошибки.


АК>Авторы:

АК> Андрей Карпов

АК>Аннотация:

АК>Рассмотрены программные ошибки, проявляющие себя при переносе Си++ — кода с 32-битных платформ на 64-битные платформы. Приведены примеры некорректного кода и способы его исправления. Перечислены методики и средства анализа кода, позволяющие диагностировать обсуждаемые ошибки.

Проблема не в переходе на 64 битную платформу, проблема в языках программирования C/C++ и связанными с ними библиотеками. Все перечисленные ошибки являются следствием того безобразия — которое допускают стандарты языков при написании кода.Нормально продумманые ВЫСОКОУРОВНЕВЫЕ языки программирования, которые претендуют на ПЕРЕНОСИМОСТЬ себе такого не позволяют и отлавливают подобные ошибки на этапах компиляции.
Re: 20 ловушек переноса Си++ - кода на 64-битную платформу
От: slavik_p  
Дата: 26.07.07 13:00
Оценка:
Здравствуйте, Андрей Карпов, Вы писали:

АК>Статья:

АК>20 ловушек переноса Си++ &mdash; кода на 64-битную платформу
Автор(ы): Андрей Карпов
Дата: 25.04.2007
Рассмотрены программные ошибки, проявляющие себя при переносе Си++ — кода с 32-битных платформ на 64-битные платформы. Приведены примеры некорректного кода и способы его исправления. Перечислены методики и средства анализа кода, позволяющие диагностировать обсуждаемые ошибки.


АК>Авторы:

АК> Андрей Карпов

Проблема не в переходе на 64 битную платформу, проблема в языках программирования C/C++ и связанными с ними библиотеками. Все перечисленные ошибки являются следствием того безобразия — которое допускают стандарты языков при написании кода.Нормально продумманые ВЫСОКОУРОВНЕВЫЕ языки программирования, которые претендуют на ПЕРЕНОСИМОСТЬ себе такого не позволяют и отлавливают подобные ошибки на этапах компиляции.

-----------------------------------------
Чтож так движок сайта тормозит, да и управление не очивидно !?
Re[2]: 20 ловушек переноса Си++ - кода на 64-битную платформ
От: MShura  
Дата: 26.07.07 13:02
Оценка:
А>Проблема не в переходе на 64 битную платформу, проблема в языках программирования C/C++ и связанными с ними библиотеками. Все перечисленные ошибки являются следствием того безобразия — которое допускают стандарты языков при написании кода.Нормально продумманые ВЫСОКОУРОВНЕВЫЕ языки программирования, которые претендуют на ПЕРЕНОСИМОСТЬ себе такого не позволяют и отлавливают подобные ошибки на этапах компиляции.

Расскажите более подробно о том, что хотите сказать.
Лучше с примерами, которые могут компилится на 16,32 и 64 битовый платформах.
Re[3]: 20 ловушек переноса Си++ - кода на 64-битную платформ
От: IvnAR Россия  
Дата: 28.09.07 10:15
Оценка:
Здравствуйте, 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-битную платформ
От: MShura  
Дата: 28.09.07 13:07
Оценка:
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-битную платформ
От: IvnAR Россия  
Дата: 02.10.07 15:32
Оценка:
MS>Вы не правы. Если нужны фиксированные размеры, то и пользоваться нужно специальными типами.
MS>Так на некоторых платформах sizeof(char)=sizeof(short)=sizeof(int)=sizeof(long)=1 (32 бита)
MS>B это ни коим образом не противоречит стандарту.
да вы правы, стандарту не противоречит, что крайне не удобно...
Re: 20 ловушек переноса Си++ - кода на 64-битную платформу
От: Axil Германия  
Дата: 15.04.08 19:25
Оценка:
Здравствуйте, Андрей Карпов, Вы писали:

АК>Рассмотрены программные ошибки, проявляющие себя при переносе Си++ — кода с 32-битных платформ на 64-битные платформы. Приведены примеры некорректного кода и способы его исправления. Перечислены методики и средства анализа кода, позволяющие диагностировать обсуждаемые ошибки.


Не понятно чем руководствовался микрософт когда long делал 32-битным на 64-битных системах??? моё мнение, что они просто перестраховались что бы меньше проблем разработчикам делать и те меньше за багами охотились .
И вот ещё что, хотел бы напомнить о "гениальном" ходе от всё того же микрософта для 64-битных систем, а именно предать анафеме весь FPU вместе с MMX и SSE. Процессор формально имеет команды FPU,MMX и SSE в режиме 64-бит, но монополисты в лице интела и микрософта решили видимо со временем полностью избавиться от этих рудиментов и сэкономить на силиконе, и поэтому вся арифметика идёт теперь только на SSE2 и более. Это тоже источник проблем, хотя бы потому что точность другая, вернее настраиваится она по другому и обработка исключений соответственно другая. Ну а тот кто решится на написание комманды __asm для 64-бит тот вообще будет послан компилятором очень далеко, что в принципе правильно, но неприятно .
Не хочу каркать, но тенденция такая, что микрософт со временем вообще скажет типа забудьте о С и С++ и рисуйте всё на С# под .net, потому что новые камушки от интела работают на суперпупер микрокоде гениальном а потому закрытом и известному только микрософту, да ещё и обновляется каждый вторник через апдейты.
Re[2]: 20 ловушек переноса Си++ - кода на 64-битную платформ
От: Lepsik Гондурас https://www.kirdyk.club/
Дата: 15.04.08 19:55
Оценка: +1
A>Не понятно чем руководствовался микрософт когда long делал 32-битным на 64-битных системах??? моё мнение, что они просто

а зачем перелопачивать тонны кода из-за перехода на другую платформу ?
большинство типов типа ptrdiff, size_t иметь достаточно чтобы не заморачиваться с переносимостью

A>Не хочу каркать, но тенденция такая, что микрософт со временем вообще скажет типа забудьте о С и С++ и рисуйте всё на С#


пока не видать такой тенденции все новое пишется на С++ как среды, ОС , сервисы, office.

С# и дотнет — это майстрим для разработчков домашней кухни.
Re[3]: 20 ловушек переноса Си++ - кода на 64-битную платформ
От: Кодёнок  
Дата: 16.04.08 06:28
Оценка:
Здравствуйте, Lepsik, Вы писали:

L>С# и дотнет — это майстрим для разработчков домашней кухни.


6 лет назад говорили, что .Net вообще бессмысленная поделка, которая даже яву потеснить не сможет.
Re: double-word atomic operations
От: remark Россия http://www.1024cores.net/
Дата: 16.04.08 06:33
Оценка: 2 (1)
Здравствуйте, Андрей Карпов, Вы писали:

АК>Статья:

АК>20 ловушек переноса Си++ &mdash; кода на 64-битную платформу
Автор(ы): Андрей Карпов
Дата: 25.04.2007
Рассмотрены программные ошибки, проявляющие себя при переносе Си++ — кода с 32-битных платформ на 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-битных платформах.

Вот на такие извращения приходится идти из-за криворукости производителей процессоров...



1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.