Для получения триального ключа
заполните форму ниже
Team License (базовая версия)
Enterprise License (расширенная версия)
* Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

** На сайте установлена reCAPTCHA и применяются
Политика конфиденциальности и Условия использования Google.
Запросите информацию о ценах
Новая лицензия
Продление лицензии
--Выберите валюту--
USD
EUR
GBP
RUB
* Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

** На сайте установлена reCAPTCHA и применяются
Политика конфиденциальности и Условия использования Google.
Для получения лицензии для вашего открытого
проекта заполните, пожалуйста, эту форму
* Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

** На сайте установлена reCAPTCHA и применяются
Политика конфиденциальности и Условия использования Google.
Для получения лицензии для вашего открытого
проекта заполните, пожалуйста, эту форму
* Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

** На сайте установлена reCAPTCHA и применяются
Политика конфиденциальности и Условия использования Google.
Мне интересно попробовать плагин на:
* Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

** На сайте установлена reCAPTCHA и применяются
Политика конфиденциальности и Условия использования Google.
Ваше сообщение отправлено.

Мы ответим вам на


Если вы так и не получили ответ, пожалуйста, проверьте папку
Spam/Junk и нажмите на письме кнопку "Не спам".
Так Вы не пропустите ответы от нашей команды.

>
>
>
Поиск явного приведения указателя к 32-…

Поиск явного приведения указателя к 32-битному типу

19 Окт 2010

В компиляторе Visual Studio C++ имеется warning C4311 ('variable' : pointer truncation from 'type' to 'type') предназначенный для выявления ошибок приведения указателя к 32-битным типам данных. В Intel C++ этому предупреждению соответствует warning #810.

Пример обнаруживаемого дефекта:

void *ptr = x;
int y = (int)ptr;

В Win64 размер указателя стал 64-битным, а размер int остался по-прежнему 32 бита. Явное приведение типа обрежет значение указателя, что приведет к ошибке, если указатель ссылается на объект находящимся за пределами младших 4 Гбайт памяти (0x00000000FFFFFFFF).

Подобные ошибки коварны тем, что могут проявляться нерегулярно. Однако их можно легко обнаружить, просмотрев все предупреждения компилятора с номером C4311. Но вот с использованием самой этой проверки есть некоторый неприятный нюанс.

Если вы просто создадите 64-битный проект в Visual Studio 2008/2010, и напишите приведенный выше код, то вы не получите предупреждения C4311. Разберемся в причинах этой неожиданной ситуации.

В Visual Studio 2003/2005 имеется ключ /Wp64 предназначенный для выявления некоторых проблем, с которыми столкнется программист при сборке своего кода в 64-битном варианте. К группе этих предупреждений относится и предупреждение C4311. Если, создать проект в Visual Studio 2005, то даже в 32-битной конфигурации для строки int y = (int)ptr; будет сгенерировано предупреждение:

warning C4311: 'type cast' : 
pointer truncation from 'void *' to 'int'.

Ключ /Wp64 был предназначен, чтобы хоть как-то подготовить приложения к 64-битной платформе без необходимости создания 64-битной конфигурации. Однако, время "подготавливаться" прошло. Начиная с Visual Studio 2005, имеется 64-битный компилятор. Если есть желание поддерживать Win32 и Win64 платформу, то необходимо иметь две конфигурации проекта. В конфигурации x64 использовать ключ /Wp64 бессмысленно, и именно поэтому в Visual Studio 2008/2010 он объявлен устаревшим.

Все было бы хорошо, но как мне кажется разработчики Visual Studio допустили логическую ошибку. Если вы создадите новый проект в Visual Studio 2008/2010 или конвертируете старый проект в новый, то ключ /Wp64 будет не установлен. Это правильно. Если даже специально в "Additional Options" проекта прописать /Wp64, то будет выдано сообщение:

Command line warning D9035: 
option 'Wp64' has been deprecated 
and will be removed in a future release.

Юмор ситуации в том, что такие предупреждения как C4311, C4312, C4313 почему-то по-прежнему связаны с ключом /Wp64. И если его нет, то и нет этих предупреждений, хотя уровень их опасности Level 1.

Эти предупреждения вернутся, если включить /Wp64 и получить предупреждения D9035 об устаревшей опции. Другой вариант - включить /Wall. Сообщения будут выданы, но это путь, как вы понимаете, только для отважных. Видимо наиболее разумным вариантом является использование #pragma warning в stdafx.h.

Теперь перейдем к Intel C++. Начиная изучение вопроса, я ожидал, что в своем поведении относительно /Wp64 он эквивалентен Visual C++. Оказалось, что у него все по-своему. Ошибку приведения вида int y = (int)ptr; он обнаружил и без ключа /Wp64, выдав warning #810. А вот warning #967 (эквивалентный C4312) уже требует /Wp64. Получается, что в компиляторе Intel C++ также есть набор предупреждений связанный с /Wp64, но сам этот набор другой. Поскольку исторически сложилось, что с документацией по экзотическим особенностям Intel C++ туго, то я не нашел что именно включает /Wp64.

После всего этого потока мыслей у читателя может возникнуть вопрос:

А в чем все-таки заковырка то? Прошу еще раз кратко.

Ответ. Если вы имеете проект для Visual Studio 2008/2010 и создадите 64-битную конфигурацию, то вы не увидите предупреждения для таких банальных ошибок как:

void *ptr = x;
int y = (int)ptr; // C4311

int i = x;
return (void*)i; // C4312

int * pI = 0;
printf("%d", pI); // C4313

И видимо некоторых других. Собирая этот же проект с помощью Intel C++, вы не увидите другой набор ошибок.

Чтобы получить все эти благотворные предупреждения вы должны явно самостоятельно включить их! Это не сложно сделать, при условии, что вы знаете про это. Я вот долгое время не знал, хотя интересуюсь тематикой разработки 64-битных приложений.

Подчеркну, что победа над этими предупреждениями вовсе не означает корректность 64-битной программы. Это только означает, что были исправлены наиболее очевидные дефекты. Так сказать "кто не спрятался, я не виноват". А вот для обнаружения "тех, кто спрятался" в большом проекте есть смысл использовать специализированные инструменты (Viva64).

Я конечно не первый заметил эту недоделку касательно 64-битных предупреждений. Совсем недавно здесь оставили комментарий на эту тему. Обратите внимание, что критика совсем свежая.

Из всего этого я могу сделать вывод, что люди только начинают интересоваться созданием Win64-приложений. Эту фразу я писал год назад, и сейчас опять повторил ее. Это очень странно. Я не верю, что можно разрабатывать нормальные программы, не интересуясь даже тем, где указатель запихивается в int. Отсутствие массовых обсуждений в интернете подобных вопросов меня крайне смущает. Я не понимаю, как устроен мир.

Популярные статьи по теме
Любите статический анализ кода!

Дата: 16 Окт 2017

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

Я в шоке от возможностей статического анализа кода, хотя сам участвую в разработке инструмента PVS-Studio. На днях я был искренне удивлён тому, что анализатор оказался умнее и внимательнее меня.
Как и почему статические анализаторы борются с ложными срабатываниями

Дата: 20 Мар 2017

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

В своей предыдущей статье я писал, что мне не нравится подход, при котором статические анализаторы кода оцениваются с помощью синтетических тестов. В статье приводился пример, воспринимаемый анализат…
Статический анализ как часть процесса разработки Unreal Engine

Дата: 27 Июн 2017

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

Проект Unreal Engine развивается - добавляется новый код и изменятся уже написанный. Неизбежное следствие развития проекта - появление в коде новых ошибок, которые желательно выявлять как можно раньш…
Характеристики анализатора PVS-Studio на примере EFL Core Libraries, 10-15% ложных срабатываний

Дата: 31 Июл 2017

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

После большой статьи про проверку операционной системы Tizen мне было задано много вопросов о проценте ложных срабатываний и о плотности ошибок (сколько ошибок PVS-Studio выявляет на 1000 строк кода)…
Эффект последней строки

Дата: 31 Май 2014

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

Я изучил множество ошибок, возникающих в результате копирования кода. И утверждаю, что чаще всего ошибки допускают в последнем фрагменте однотипного кода. Ранее я не встречал в книгах описания этого …
PVS-Studio ROI

Дата: 30 Янв 2019

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

Время от времени нам задают вопрос, какую пользу в денежном эквиваленте получит компания от использования анализатора PVS-Studio. Мы решили оформить ответ в виде статьи и привести таблицы, которые по…
Как PVS-Studio оказался внимательнее, чем три с половиной программиста

Дата: 22 Окт 2018

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

PVS-Studio, как и другие статические анализаторы кода, часто выдаёт ложные срабатывания. Но не стоит спешить считать странные срабатывания ложными. Это короткая история о том, как PVS-Studio вновь ок…
Зло живёт в функциях сравнения

Дата: 19 Май 2017

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

Возможно, читатели помнят мою статью под названием "Эффект последней строки". В ней идёт речь о замеченной мной закономерности: ошибка чаще всего допускается в последней строке однотипных блоков текс…
Бесплатный PVS-Studio для тех, кто развивает открытые проекты

Дата: 22 Дек 2018

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

В канун празднования нового 2019 года команда PVS-Studio решила сделать приятный подарок всем контрибьюторам open-source проектов, хостящихся на GitHub, GitLab или Bitbucket. Им предоставляется возмо…
Технологии, используемые в анализаторе кода PVS-Studio для поиска ошибок и потенциальных уязвимостей

Дата: 21 Ноя 2018

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

Краткое описание технологий, используемых в инструменте PVS-Studio, которые позволяют эффективно обнаруживать большое количество паттернов ошибок и потенциальных уязвимостей. Статья описывает реализа…

Комментарии (0)

Следующие комментарии

На сайте установлена reCAPTCHA и применяются
Политика конфиденциальности и Условия использования Google.
Этот сайт использует куки и другие технологии, чтобы предоставить вам более персонализированный опыт. Продолжая просмотр страниц нашего веб-сайта, вы принимаете условия использования этих файлов. Если вы не хотите, чтобы ваши данные обрабатывались, пожалуйста, покиньте данный сайт. Подробнее →
Принять