64 бита, /Wp64, Visual Studio 2008,Viva64 и все, все, все...Автор: Андрей КарповДата: 15.04.2008Аннотация.Данная статья ст...
#endifvoid foo() {    MyInt32 value32 = 10;    MySSizet size = 20;    value32 = size;}Выражение "value32 = size;" на 64-би...
2. Зачем нужен анализатор Viva64, если есть /Wp64?Этот вопрос является одним из наиболее часто задаваемых, но, по сути, он...
3. Почему в Visual Studio 2008 ключ /Wp64 объявлен устаревшим?Есть ошибочное мнение о том, что /Wp64 объявлен устаревшим п...
...Или, например:int x, y, z, w, h;int position = x + y * w + z * w * h;bigArray[position] = 0.0f;Это канонические, широко...
Upcoming SlideShare
Loading in …5
×

64 бита, /Wp64, Visual Studio 2008, Viva64 и все, все, все...

207 views
154 views

Published on

Данная статья ставит своей задачей ответить на ряд вопросов, касающихся безопасного переноса Си/Си++ кода на 64-битные системы. Статья написана как ответ на часто обсуждаемую в форумах тематику, связанную с использованием ключа /Wp64 и инструмента Viva64.

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
207
On SlideShare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
4
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

64 бита, /Wp64, Visual Studio 2008, Viva64 и все, все, все...

  1. 1. 64 бита, /Wp64, Visual Studio 2008,Viva64 и все, все, все...Автор: Андрей КарповДата: 15.04.2008Аннотация.Данная статья ставит своей задачей ответить на ряд вопросов, касающихся безопасного переносаСи/Си++ кода на 64-битные системы. Статья написана как ответ на часто обсуждаемую в форумахтематику, связанную с использованием ключа /Wp64 и инструмента Viva64.ВведениеЯ являюсь разработчиком статического анализатора кода Viva64 [1], предназначенного длядиагностики ошибок в 64-битных программах. Анализатор интегрируется в среду Visual Studio2005/2008 и позволяет проверить корректность Си/Си++ кода, руководствуясь наборомсоответствующих правил [2]. Потенциально опасные участки кода, обнаруживаемыеинструментом Viva64, могут быть своевременно проанализированы и исправлены, чтозначительно сокращает издержки на тестирование и сопровождение [3].Общаясь с разработчиками программного обеспечения в форумах, по почте или на конференциях,я заметил, что существует несколько заблуждений, которые приводят к некорректным вопросам,замечаниям и комментариям. В рамках этой статьи я хочу попробовать пролить свет на этитемные места, связанные с использованием 64-битных компиляторов, ключа /Wp64 истатического анализатора Viva64. Для этого я задам несколько обобщенных вопросов и отвечу наних. Надеюсь, эти ответы помогут лучше Вам ориентироваться в 64-битных технологиях иправильно подходить к решению задач.1. Что такое ключ /Wp64?Ключ /Wp64 указывает компилятору искать потенциальные ошибки, которые могут возникнутьпри компиляции кода для 64-битных систем. Проверка заключается в том, что типы, которыеотмечены в 32-битном коде ключевым словом __w64 интерпретируются при проверке как 64-битные типы.Например, пусть мы имеем следующий код:typedef int MyInt32;#ifdef _WIN64 typedef __int64 MySSizet;#else typedef int MySSizet;
  2. 2. #endifvoid foo() { MyInt32 value32 = 10; MySSizet size = 20; value32 = size;}Выражение "value32 = size;" на 64-битной системе приведет к урезанию значения, аследовательно к потенциальной ошибке. Мы хотим это диагностировать. Но при компиляции 32-битного приложения, все корректно и мы не получим предупреждения.Чтобы подготовиться к 64-битным системам нам следует добавить ключ /Wp64 и вставитьключевое слово __w64 при описании типа MySSizet в 32-битном варианте. В результате код станетвыглядеть так:typedef int MyInt32;#ifdef _WIN64 typedef __int64 MySSizet;#else typedef int __w64 MySSizet; // Add __w64 keyword#endifvoid foo() { MyInt32 value32 = 10; MySSizet size = 20; value32 = size; // C4244 64-bit int assigned to 32-bit int}Теперь мы получим предупреждение C4244, которое поможет подготовиться к переносу кода на64-битную платформу.Обратите внимание, что для 64-битного режима компиляции ключ /Wp64 значения не имеет, таккак все типы уже имеют необходимый размер и компилятор произведет необходимые проверки.То есть при компиляции 64-битной версии даже с выключенным ключом /Wp64 мы получимпредупреждение C4244.Поэтому, если Вы регулярно компилируете свой код в 64-битном режиме, то Вы вполне можетеотказаться от использования /Wp64 в 32-битном коде, поскольку в 64-битном режиме проверкапроизводится более полно. Кроме того, система диагностики с ключом /Wp64 не совершенна ичасто приводит к ложным срабатываниям или, наоборот, к замалчиванию предупреждений.Более подробно с этой проблемой Вы можете познакомиться по следующим ссылкам [4, 5].
  3. 3. 2. Зачем нужен анализатор Viva64, если есть /Wp64?Этот вопрос является одним из наиболее часто задаваемых, но, по сути, он некорректен. Вначалеприведем аналогию. Современные компиляторы языка Си/Си++ выдают большое количествосообщений, предупреждающих о потенциальных ошибках. Но это совершенно не уменьшаетактуальность существования и использования таких инструментов как lint, Gimpel PC-Lint, ParasoftC++Test или Abraxas CodeCheck. И никто не ставит вопрос, зачем нужны эти анализаторы, если вкомпиляторе Visual C++, есть ключ /W4 или /Wall.Задача компилятора состоит в обнаружении синтаксических ошибок в программах и выдачипредупреждений на основные типовые потенциальные ошибки. Ограничение на подробностьдиагностики потенциально опасных конструкций связано с необходимостью выбора разумногоподмножества диагностик, с большой вероятностью полезных всем программистам. Другойпричиной являются требования к производительности компилятора. Некоторые проверки требуютдостаточно много времени, но совершенно могут быть не востребованы многимипрограммистами.Статические анализаторы общего назначения позволяют диагностировать обширные классыпотенциальных ошибок и плохой стиль кодирования. В общем, все то, что отсутствует вкомпиляторе. Настройки статического анализатора затачиваются под конкретные задачи иподробно выводят информацию по интересующим разработчика ошибкам. Статическиеанализаторы хотя и запускаются регулярно, но не при компиляции каждого файла в процессеразработки. Это позволяет выполнять достаточно глубокий анализ, требующий дополнительныхзатрат времени. Статический анализ занимает достойное место среди других методологийповышения качества и надежности кода.Похожая ситуация и с проверкой совместимости кода с 64-битными системами. Мы уже краткорассмотрели, что дает ключ /Wp64. Этот ключ является хорошим подспорьем программисту, нопомощь следует ждать от него только в ограниченном наборе случаев. К сожалению, типовыхошибок связанных с использованием 64-битных систем гораздо больше. Эти типовые ошибкиподробно описаны в статье "20 ловушек переноса Си++ - кода на 64-битную платформу" [6], скоторой я прошу обязательно познакомиться. Именно из-за большой разницы в количествепроверок, предоставляемых /Wp64, и необходимого количества проверок возникает потребностьв специализированном инструменте. Таким специализированным инструментов и являетсяViva64.Задают еще один попутный вопрос: "Некоторые анализаторы, такие как Gimpel PC-Lint илиParasoft C++Test, также заявляют о поддержке диагностики 64-битных ошибок. Зачем тогда ещеодин - Viva64?". Да, заявляют и поддерживают. Но, во-первых, менее подробно. Например, неучитывается ряд ошибок, связанных с особенностями современного языка Си++. А во-вторых, этианализаторы ориентированы на модели данных Unix-систем и плохо подходят для анализа 64-битных программ разрабатываемых в среде Visual Studio. Более подробно обо всем этом можнопочитать в статье "Забытые проблемы разработки 64-битных программ" [7].Вывод: наличие ключа /Wp64 и других статических анализаторов, никак не уменьшаетактуальность использования Viva64.
  4. 4. 3. Почему в Visual Studio 2008 ключ /Wp64 объявлен устаревшим?Есть ошибочное мнение о том, что /Wp64 объявлен устаревшим по причине, что диагностика 64-битных ошибок в Visual Studio 2008 стала намного лучше. Нет, это не так.Ключ /Wp64 в Visual Studio 2008 объявлен устаревшим по той простой причине, что он больше ненужен. Прошло время "готовиться к 64-битному коду", пора уже создавать 64-битные программы.А для этого в Visual Studio 2008, да и в Visual Studio 2005 есть 64-битный компилятор.Ключ /Wp64 полезен только в режиме компиляции 32-битных программ. Он был создан для того,чтобы заранее увидеть ряд проблем, с которыми программа столкнется в будущем на 64-битныхсистемах.При компиляции 64-битной программы ключ /Wp64 не имеет смысла. Компилятор 64-битныхприложений автоматически делает проверки, аналогичные /Wp64, но более аккуратно. Прикомпиляции 32-битных программ режим /Wp64 иногда давал сбои, что приводило к ложнымпредупреждениям. Это не очень приятно и многие разработчики жаловались на это и просилидоработать данный режим компилятора. Разработчики Visual C++ поступили, на мой взгляд, оченьразумно. Вместо того, чтобы тратить время на доработку /Wp64 они объявляют его устаревшим.Тем самым они: • дополнительно стимулируют программистов компилировать свои программы 64-битным компилятором; • упрощают и без того перегруженную систему команд компилятора, убирая временный вспомогательный ключ; • устраняют просьбы по доработке данного ключа.4. Актуален ли инструмент Viva64 при переходе на Visual Studio2008?Да, актуален. Ничего ведь не изменилось. Никаких новых существенных изменений компилятор вплане создания 64-битных программ не претерпел. В 32-битном компиляторе ключ /Wp64объявили устаревшим, чтобы стимулировать переход на 64-битные системы, но к Viva64 этоникакого отношения не имеет. Анализатор Viva64 обнаруживает намного больше потенциальных"64-битных" ошибок, чем 64-битный компилятор Visual C++ 2005/2008 и успешно используетсямногими разработчиками.Напоследок хочу еще раз уделить немного времени борьбе с Евангелистами, которыепроповедуют, что компилятор способен диагностировать все 64-битные ошибки и отказ от /Wp64тому подтверждение.Прошу, перечитайте еще раз статью "20 ловушек переноса Си++ - кода на 64-битную платформу"[6]. Прошу - ЗАДУМАЙТЕСЬ!Не может, не может компилятор выдавать предупреждения на конструкции вида:unsigned i;size_t size;for (i = 0; i != size; i++)
  5. 5. ...Или, например:int x, y, z, w, h;int position = x + y * w + z * w * h;bigArray[position] = 0.0f;Это канонические, широко используемые конструкции. Чаще всего они безопасны. Иразработчики компиляторов не внесут предупреждения на подобные конструкции, хотя припереходе на 64-битные системы они несут потенциальную опасность! И их следует хотя бы одинраз проанализировать. Такие ошибки трудно обнаружимы и проявляются только на большихмассивах данных или при обработке большого количества элементов.Но все эти проблемы легко можно обнаружить, просматривая код с использованием Viva64.Прошу, не обманывайте разработчиков, убеждая, что в их программах все хорошо. Вы не сделаетеим этим лучше. Но легко можете спровоцировать осуществить переход на 64-битную системынебрежно и тем самым посеять несколько редких ошибок, которые выявятся уже на этапеэксплуатации.Выводы 1. Ключ /Wp64 полезен, но вовсе не достаточен, чтобы гарантировать работоспособность 64- битной программы. 2. Для более тщательного анализа 64-битного кода следует использовать статические анализаторы, реализующие соответствующие проверки. 3. Для проверки Си/Си++ кода для 64-битной операционный системы Windows лучшим решением является специализированный инструмент Viva64.Библиографический список 1. Евгений Рыжков. Viva64: что это и для кого? http://viva64.com/art-1-1-2081052208.html 2. Андрей Карпов, Евгений Рыжков. Статический анализ кода для верификации 64-битных приложений. http://www.viva64.com/art-1-1-1630333432.html 3. Андрей Карпов. Проблемы тестирования 64-битных приложений. 4. http://www.viva64.com/art-1-1-929024801.html 5. Keith Brown, SetWindowLongPtr and /Wp64. http://www.viva64.com/go.php?url=66 6. MSDN Forum, http://www.viva64.com/go.php?url=67 7. Андрей Карпов, Евгений Рыжков. 20 ловушек переноса Си++ - кода на 64-битную платформу. http://www.viva64.com/art-1-1-1958348565.html 8. Андрей Карпов. Забытые проблемы разработки 64-битных программ. http://www.viva64.com/art-1-1-1609701563.html

×