| 20 ловушек переноса Си++ - кода на 64-битную платформу | |
| От: | Андрей Карпов | ||
| Дата: | 25.04.07 13:13 | ||
| Оценка: | 100 (6) -2 | ||
| Статья: 20 ловушек переноса Си++ — кода на 64-битную платформу Автор(ы): Андрей Карпов Дата: 25.04.2007 Рассмотрены программные ошибки, проявляющие себя при переносе Си++ — кода с 32-битных платформ на 64-битные платформы. Приведены примеры некорректного кода и способы его исправления. Перечислены методики и средства анализа кода, позволяющие диагностировать обсуждаемые ошибки. Авторы: Андрей Карпов Аннотация: Рассмотрены программные ошибки, проявляющие себя при переносе Си++ — кода с 32-битных платформ на 64-битные платформы. Приведены примеры некорректного кода и способы его исправления. Перечислены методики и средства анализа кода, позволяющие диагностировать обсуждаемые ошибки. |
| Re: 20 ловушек переноса Си++ - кода на 64-битную платформу | |
| От: | Аноним 817 | ||
| Дата: | 26.04.07 06:57 |
| Здравствуйте, Андрей Карпов, Вы писали: АК>Статья: АК>20 ловушек переноса Си++ — кода на 64-битную платформу Автор(ы): Андрей Карпов Дата: 25.04.2007 Рассмотрены программные ошибки, проявляющие себя при переносе Си++ — кода с 32-битных платформ на 64-битные платформы. Приведены примеры некорректного кода и способы его исправления. Перечислены методики и средства анализа кода, позволяющие диагностировать обсуждаемые ошибки. АК>Авторы: АК>Андрей Карпов АК>Аннотация: АК>Рассмотрены программные ошибки, проявляющие себя при переносе Си++ — кода с 32-битных платформ на 64-битные платформы. Приведены примеры некорректного кода и способы его исправления. Перечислены методики и средства анализа кода, позволяющие диагностировать обсуждаемые ошибки. как приятно прочитать оглавление |
| Re[2]: 20 ловушек переноса Си++ - кода на 64-битную платформ | |
| От: | Lorenzo_LAMAS | ||
| Дата: | 26.04.07 07: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 07:34 | ||
| Оценка: | +2 | ||
| Здравствуйте, Lorenzo_LAMAS, Вы писали: L_L>Здравствуйте, Аноним, Вы писали: А>>Здравствуйте, Андрей Карпов, Вы писали: АК>>>Статья: АК>>>20 ловушек переноса Си++ — кода на 64-битную платформу Автор(ы): Андрей Карпов Дата: 25.04.2007 Рассмотрены программные ошибки, проявляющие себя при переносе Си++ — кода с 32-битных платформ на 64-битные платформы. Приведены примеры некорректного кода и способы его исправления. Перечислены методики и средства анализа кода, позволяющие диагностировать обсуждаемые ошибки. АК>>>Авторы: АК>>>Андрей Карпов АК>>>Аннотация: АК>>>Рассмотрены программные ошибки, проявляющие себя при переносе Си++ — кода с 32-битных платформ на 64-битные платформы. Приведены примеры некорректного кода и способы его исправления. Перечислены методики и средства анализа кода, позволяющие диагностировать обсуждаемые ошибки. А>>как приятно прочитать оглавление L_L>+1. L_L>Не забудь автору сообщения еще и поставить оценку побольше! да и тема то боянистая уже... только ленивый наверное не писал про эти ловушки это было актуально года 3-4 назад -- когда первые ширпотребные 64бит камни только появлялись (тогда собственно все эти грабли были и пройдены в первый раз но безусловно, как учебный материал для juniorов будем надеяца он хорош... |
| Re[4]: 20 ловушек переноса Си++ - кода на 64-битную платформ | |
| От: | Lorenzo_LAMAS | ||
| Дата: | 26.04.07 08:29 |
| Z>да и тема то боянистая уже... только ленивый наверное не писал про эти ловушки Z>это было актуально года 3-4 назад -- когда первые ширпотребные 64бит камни только появлялись (тогда собственно все эти грабли были и пройдены в первый раз Z>но безусловно, как учебный материал для juniorов будем надеяца он хорош... На самом рсдн уже раза два была тема и даже название там было такое же, я так понимаю, это та же статья, но только теперь она уже в рсдн опубликована Of course, the code must be complete enough to compile and link. |
| Re[2]: 20 ловушек переноса Си++ - кода на 64-битную платформ | |
| От: | Кодт модератор | ||
| Дата: | 26.04.07 09:02 |
| Здравствуйте, <Аноним>, Вы писали: А>как приятно прочитать оглавление А прочитать красный текст под оглавлением? То есть, это анонс. Статьи из журнала появляются онлайн с определённой задержкой. ... << RSDN@Home 1.2.0 alpha rev. 655>> Перекуём баги на фичи! |
| Re: 20 ловушек переноса Си++ - кода на 64-битную платформу | |
| От: | Analytic2007 | ||
| Дата: | 30.04.07 15:49 |
| АК>Статья: АК>20 ловушек переноса Си++ — кода на 64-битную платформу Автор(ы): Андрей Карпов Дата: 25.04.2007 Рассмотрены программные ошибки, проявляющие себя при переносе Си++ — кода с 32-битных платформ на 64-битные платформы. Приведены примеры некорректного кода и способы его исправления. Перечислены методики и средства анализа кода, позволяющие диагностировать обсуждаемые ошибки. АК>Аннотация: АК>Рассмотрены программные ошибки, проявляющие себя при переносе Си++ — кода с 32-битных платформ на 64-битные платформы. Приведены примеры некорректного кода и способы его исправления. Перечислены методики и средства анализа кода, позволяющие диагностировать обсуждаемые ошибки. Вах! Вах! Мою статью опубликовали. Хоть бы мне сообщили... Случайно наткнулся... Печалит одно. Опубликован старый вариант (без многих исправлений). Знал бы — выслал им новый вариант. А то больше двух месяцев как отослал и тишина. Думал уж в корзину отправили. p.s. Рекламная пауза. Наша команда выпустила новую версию статического анализатора Си++ кода Viva64. Будем рады отзывам по его работе и предложениям по усовершенствованию. www.Viva64.com |
| Re[2]: 20 ловушек переноса Си++ - кода на 64-битную платформ | |
| От: | Odi$$ey админ | ||
| Дата: | 01.05.07 04:03 |
| Здравствуйте, Analytic2007, Вы писали: A>Печалит одно. Опубликован старый вариант (без многих исправлений). Знал бы — выслал им новый вариант. А то больше двух месяцев как отослал и тишина. Думал уж в корзину отправили. давай новую, на сайте ее выложим. Заодно узнаем про секретную 15-ю ловушку ... << RSDN@Home 1.2.0 alpha rev. 677>> |
| Re[3]: 20 ловушек переноса Си++ - кода на 64-битную платформ | |
| От: | Analytic2007 | ||
| Дата: | 06.05.07 05:27 |
| Здравствуйте, Odi$$ey, Вы писали: OE>Здравствуйте, Analytic2007, Вы писали: A>>Печалит одно. Опубликован старый вариант (без многих исправлений). Знал бы — выслал им новый вариант. А то больше двух месяцев как отослал и тишина. Думал уж в корзину отправили. OE>давай новую, на сайте ее выложим. Заодно узнаем про секретную 15-ю ловушку Новая статья отправлена рецензенту RSDN. |
| Re: 20 ловушек переноса Си++ - кода на 64-битную платформу | |
| От: | Аноним 274 | ||
| Дата: | 26.07.07 11:46 | ||
| Оценка: | -1 | ||
| Здравствуйте, Андрей Карпов, Вы писали: АК>Статья: АК>20 ловушек переноса Си++ — кода на 64-битную платформу Автор(ы): Андрей Карпов Дата: 25.04.2007 Рассмотрены программные ошибки, проявляющие себя при переносе Си++ — кода с 32-битных платформ на 64-битные платформы. Приведены примеры некорректного кода и способы его исправления. Перечислены методики и средства анализа кода, позволяющие диагностировать обсуждаемые ошибки. АК>Авторы: АК> Андрей Карпов АК>Аннотация: АК>Рассмотрены программные ошибки, проявляющие себя при переносе Си++ — кода с 32-битных платформ на 64-битные платформы. Приведены примеры некорректного кода и способы его исправления. Перечислены методики и средства анализа кода, позволяющие диагностировать обсуждаемые ошибки. Проблема не в переходе на 64 битную платформу, проблема в языках программирования C/C++ и связанными с ними библиотеками. Все перечисленные ошибки являются следствием того безобразия — которое допускают стандарты языков при написании кода.Нормально продумманые ВЫСОКОУРОВНЕВЫЕ языки программирования, которые претендуют на ПЕРЕНОСИМОСТЬ себе такого не позволяют и отлавливают подобные ошибки на этапах компиляции. |
| Re: 20 ловушек переноса Си++ - кода на 64-битную платформу | |
| От: | slavik_p | ||
| Дата: | 26.07.07 12:00 |
| Здравствуйте, Андрей Карпов, Вы писали: АК>Статья: АК>20 ловушек переноса Си++ — кода на 64-битную платформу Автор(ы): Андрей Карпов Дата: 25.04.2007 Рассмотрены программные ошибки, проявляющие себя при переносе Си++ — кода с 32-битных платформ на 64-битные платформы. Приведены примеры некорректного кода и способы его исправления. Перечислены методики и средства анализа кода, позволяющие диагностировать обсуждаемые ошибки. АК>Авторы: АК> Андрей Карпов Проблема не в переходе на 64 битную платформу, проблема в языках программирования C/C++ и связанными с ними библиотеками. Все перечисленные ошибки являются следствием того безобразия — которое допускают стандарты языков при написании кода.Нормально продумманые ВЫСОКОУРОВНЕВЫЕ языки программирования, которые претендуют на ПЕРЕНОСИМОСТЬ себе такого не позволяют и отлавливают подобные ошибки на этапах компиляции. ----------------------------------------- Чтож так движок сайта тормозит, да и управление не очивидно !? |
| Re[2]: 20 ловушек переноса Си++ - кода на 64-битную платформ | |
| От: | MShura | ||
| Дата: | 26.07.07 12:02 |
| А>Проблема не в переходе на 64 битную платформу, проблема в языках программирования C/C++ и связанными с ними библиотеками. Все перечисленные ошибки являются следствием того безобразия — которое допускают стандарты языков при написании кода.Нормально продумманые ВЫСОКОУРОВНЕВЫЕ языки программирования, которые претендуют на ПЕРЕНОСИМОСТЬ себе такого не позволяют и отлавливают подобные ошибки на этапах компиляции. Расскажите более подробно о том, что хотите сказать. Лучше с примерами, которые могут компилится на 16,32 и 64 битовый платформах. |
| Re[3]: 20 ловушек переноса Си++ - кода на 64-битную платформ | |
| От: | IvnAR | ||
| Дата: | 28.09.07 09: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 12: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 14:32 |
| MS>Вы не правы. Если нужны фиксированные размеры, то и пользоваться нужно специальными типами. MS>Так на некоторых платформах sizeof(char)=sizeof(short)=sizeof(int)=sizeof(long)=1 (32 бита) MS>B это ни коим образом не противоречит стандарту. да вы правы, стандарту не противоречит, что крайне не удобно... |
| Re: 20 ловушек переноса Си++ - кода на 64-битную платформу | |
| От: | Axil | ||
| Дата: | 15.04.08 18:25 |
| Здравствуйте, Андрей Карпов, Вы писали: АК>Рассмотрены программные ошибки, проявляющие себя при переносе Си++ — кода с 32-битных платформ на 64-битные платформы. Приведены примеры некорректного кода и способы его исправления. Перечислены методики и средства анализа кода, позволяющие диагностировать обсуждаемые ошибки. Не понятно чем руководствовался микрософт когда long делал 32-битным на 64-битных системах??? моё мнение, что они просто перестраховались что бы меньше проблем разработчикам делать и те меньше за багами охотились И вот ещё что, хотел бы напомнить о "гениальном" ходе от всё того же микрософта для 64-битных систем, а именно предать анафеме весь FPU вместе с MMX и SSE. Процессор формально имеет команды FPU,MMX и SSE в режиме 64-бит, но монополисты в лице интела и микрософта решили видимо со временем полностью избавиться от этих рудиментов и сэкономить на силиконе, и поэтому вся арифметика идёт теперь только на SSE2 и более. Это тоже источник проблем, хотя бы потому что точность другая, вернее настраиваится она по другому и обработка исключений соответственно другая. Ну а тот кто решится на написание комманды __asm для 64-бит тот вообще будет послан компилятором очень далеко, что в принципе правильно, но неприятно Не хочу каркать, но тенденция такая, что микрософт со временем вообще скажет типа забудьте о С и С++ и рисуйте всё на С# под .net, потому что новые камушки от интела работают на суперпупер микрокоде гениальном а потому закрытом и известному только микрософту, да ещё и обновляется каждый вторник через апдейты. |
| Re[2]: 20 ловушек переноса Си++ - кода на 64-битную платформ | |
| От: | Lepsik | ||
| Дата: | 15.04.08 18:55 | ||
| Оценка: | +1 | ||
| A>Не понятно чем руководствовался микрософт когда long делал 32-битным на 64-битных системах??? моё мнение, что они просто а зачем перелопачивать тонны кода из-за перехода на другую платформу ? большинство типов типа ptrdiff, size_t иметь достаточно чтобы не заморачиваться с переносимостью A>Не хочу каркать, но тенденция такая, что микрософт со временем вообще скажет типа забудьте о С и С++ и рисуйте всё на С# пока не видать такой тенденции все новое пишется на С++ как среды, ОС , сервисы, office. С# и дотнет — это майстрим для разработчков домашней кухни. |
| Re[3]: 20 ловушек переноса Си++ - кода на 64-битную платформ | |
| От: | Кодёнок | ||
| Дата: | 16.04.08 05:28 |
| Здравствуйте, Lepsik, Вы писали: L>С# и дотнет — это майстрим для разработчков домашней кухни. 6 лет назад говорили, что .Net вообще бессмысленная поделка, которая даже яву потеснить не сможет. |
| Re: double-word atomic operations | |
| От: | remark | ||
| Дата: | 16.04.08 05:33 | ||
| Оценка: | 2 (1) | ||
| Здравствуйте, Андрей Карпов, Вы писали: АК>Статья: АК>20 ловушек переноса Си++ — кода на 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-битных платформах. Вот на такие извращения приходится идти из-за криворукости производителей процессоров... |