Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
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 и все, все, все...

270 views

Published on

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

Published in: Technology
  • Be the first to comment

  • Be the first to like this

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

×