﻿# Предупреждения компилятора C4311 и C4312, выдаваемые при использовании ключа /Wp64

C4311 и C4312 – это одни из распространенных предупреждений, генерируемых компилятором для 32\-битного кода, не адаптированного для переноса на 64\-разрядные платформы\. Они выводятся только в случае использования параметра /Wp64 \(выявление проблем переносимости на 64\-разрядные платформы\), предназначенного для подготовки миграции приложений на 64\-битные системы\.

Заметим, что начиная с Visual C\+\+ 9\.0 параметр /Wp64 объявлен устаревшим, поскольку время "готовиться к 64\-битному коду" [уже прошло](https://pvs-studio.ru/ru/blog/posts/cpp/a0021/)\.

Предупреждения C4311 и C4312 сообщают о попытке поместить указатель в 32\-разрядную переменную или наоборот\. В 64\-битной системе эти преобразования некорректны\. Если код скомпилирован на 64\-разрядной платформе, значение указателя \(64 разряда\) будет усечено, если оно присваивается переменной типа int \(32 разряда\)\. Пример кода, вызывающего предупреждение C4311 и C4312:

```cpp
   int *p;
   int a = (int)p; //C4311
   p = (int *)a; //C4312
```

Исправление кода заключается в использовании [memsize\-типов](https://pvs-studio.ru/ru/blog/terms/0030/), способных хранить в себе указатель, например size\_t, ptrdiff\_t, intptr\_t, LONG\_PTR и так далее\. Пример корректного кода:

```cpp
   int *p;
   INT_PTR b = (INT_PTR)p; //OK
```

Подробные рекомендации по созданию безопасного 64\-битного кода даны в курсе "[Разработка 64\-битных приложений на языке Си/Си\+\+](https://pvs-studio.ru/ru/blog/lessons/)"\.

Если разрабатываемая программа имеет короткий жизненный цикл и не планируется её портирование на 64\-битную платформу, данные предупреждения могут быть устранены путём отключения в настройках компилятора параметра /Wp64\. 

Следует отметить, что ключ /Wp64 осуществляет достаточно поверхностный анализ и выявляет только наиболее грубые ошибки\. Для полноценной проверки кода мы предлагаем использовать специализированный статический анализатор кода Viva64, входящий в пакет [PVS\-Studio](https://pvs-studio.ru/ru/pvs-studio/)\. Со сравнением диагностических возможностей Visual C\+\+ и Viva64 можно ознакомиться в статье "[Сравнение возможностей PVS\-Studio и Visual Studio 2010 по выявлению дефектов в 64\-битных программах](https://pvs-studio.ru/ru/blog/posts/a0066/)"\.

## Библиографический список

1. Андрей Карпов\. [64 бита, /Wp64, Visual Studio 2008, Viva64 и все, все, все\.\.\.](https://pvs-studio.ru/ru/blog/posts/cpp/a0021/)
1. MSDN Library\. [Compiler Warning \(level 1\) C4311](https://msdn.microsoft.com/en-us/library/4t91x2k5(VS.90).aspx)
1. MSDN Library\. [Compiler Warning \(level 1\) C4312](https://www.microsoft.com/en-us/download/details.aspx?id=55984)