Pour obtenir une clé
d'essai remplissez le formulaire ci-dessous
Demandez des tariffs
Nouvelle licence
Renouvellement de licence
--Sélectionnez la devise--
* En cliquant sur ce bouton, vous acceptez notre politique de confidentialité

Free PVS-Studio license for Microsoft MVP specialists
To get the licence for your open-source project, please fill out this form
** En cliquant sur ce bouton, vous acceptez notre politique de confidentialité.

I am interested to try it on the platforms:
** En cliquant sur ce bouton, vous acceptez notre politique de confidentialité.

Votre message a été envoyé.

Nous vous répondrons à

Si vous n'avez toujours pas reçu de réponse, vérifiez votre dossier
Spam/Junk et cliquez sur le bouton "Not Spam".
De cette façon, vous ne manquerez la réponse de notre équipe.

The warnings C4311 and C4312 generated …

The warnings C4311 and C4312 generated by the compiler when using the /Wp64 switch

11 Mar 2012

C4311 and C4312 are ones of the most frequent warnings generated by the compiler for 32-bit code not adapted for migration to 64-bit platforms. They are generated only when you use the /Wp64 key (detecting 64-bit portability issues) intended to prepare migration of applications to 64-bit systems.

Note that the /Wp64 parameter is announced deprecated beginning with Visual C++ 9.0 since the time "to prepare for 64-bit code" has passed.

The C4311 and C4312 warnings tell you about an attempt to put a pointer into a 32-bit variable or vice versa. In a 64-bit system, these conversions are incorrect. If the code is compiled on the 64-bit platform, the pointer's value (64 bits) will be truncated if it is assigned to a variable of the int type (32 bits). This is an example of code that causes the C4311 and C4312 warnings:

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

To correct the code you should use memsize-types that can store a pointer, for instance size_t, ptrdiff_t, intptr_t, LONG_PTR, etc. This is an example of correct code:

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

See the "Development of 64-bit C/C++ applications" course for detailed recommendations on creating safe 64-bit code.

If a program being developed has a short life-cycle and you do not plan to port it to the 64-bit platform, you may eliminate these warnings by disabling the /Wp64 option in the compiler settings.

Note that the /Wp64 switch carries out a rather superficial analysis and detects only crudest errors. To perform a complete analysis of your code, we recommend you to use the specialized static code analyzer Viva64 included into the PVS-Studio package. See the article "Comparing capabilities of PVS-Studio and Visual Studio 2010 in detecting defects in 64-bit programs" for comparison of diagnostic abilities of Visual C++ and Viva64.


Comments (0)

Next comments
Unicorn with delicious cookie
Nous utilisons des cookies pour améliorer votre expérience de navigation. En savoir plus