/RTC (Vérifications des erreurs au moment de l'exécution)
Mise à jour : novembre 2007
Permet d'activer et de désactiver la fonctionnalité de vérification des erreurs au moment de l'exécution, conjointement avec le pragma runtime_checks.
/RTC1
/RTCc
/RTCs
/RTCu
Arguments
1
Équivalent de /RTCsu.c
Signale quand une valeur est assignée à un type de données plus petit qui se traduit par une perte de données. Par exemple, si vous avez assigné une valeur de type short 0x101 à une variable de type char.Cette option signale les situations où vous avez l'intention de tronquer, par exemple quand vous voulez que les huit premiers bits d'un int soient retournés en tant que char. Comme /RTCc génère une erreur au moment de l'exécution si des informations risquent d'être perdues à la suite de l'assignation, vous pouvez masquer les informations dont vous avez besoin pour éviter une erreur au moment de l'exécution en raison de /RTCc. Par exemple :
#include <crtdbg.h> char get8bits(int value, int position) { _ASSERT(position < 32); return (char)(value >> position); // Try the following line instead: // return (char)((value >> position) && 0xff); } int main() { get8bits(12341235,3); }
s
Active les vérifications des erreurs au moment de l'exécution pour le frame de pile, comme suit :Initialisation de variables locales à une valeur différente de zéro. Cela permet d'identifier les bogues qui n'apparaissent pas lors d'une exécution en mode débogage. Les chances sont plus grandes de voir les variables de la pile rester à zéro dans une version Debug par rapport à une version Release en raison des optimisations qu'applique le compilateur aux variables de la pile dans cette dernière. Une fois que le programme a utilisé une zone de sa pile, il n'est jamais remis à 0 par le compilateur. Par conséquent, les variables de pile suivantes non initialisées qui utilisent par hasard la même zone de pile peuvent retourner les valeurs datant de l'utilisation précédente de la mémoire de cette pile.
Détection des dépassements de capacité positifs et négatifs des variables locales, telles que des tableaux. /RTCs ne détecte pas les dépassements de capacité positifs lors de l'accès à de la mémoire qui provient du remplissage du compilateur au sein d'une structure. Le remplissage peut se produire à la suite de l'utilisation de align (C++), /Zp (Alignement des membres de la structure) ou pack, ou si vous ordonnez les éléments de la structure d'une façon qui impose au compilateur d'exécuter un remplissage.
Vérification du pointeur de pile, qui détecte l'altération des pointeurs de pile. L'altération des pointeurs de pile peut être due à une discordance de convention d'appel. Par exemple, vous utilisez un pointeur fonction pour appeler une fonction dans une DLL qui est exportée en tant que __stdcall, mais vous déclarez le pointeur désignant la fonction en tant que __cdecl.
u
Signale quand une variable est utilisée alors qu'elle n'a pas été initialisée. Par exemple, une instruction qui génère Avertissement du compilateur (niveau 4) C4701 peut également générer une erreur au moment de l'exécution sous /RTCu. Toute instruction qui génère Avertissement du compilateur (niveaux 1 et 4) C4700 générera également une erreur au moment de l'exécution sous /RTCu.Cependant, considérons le fragment de code suivant :
int a, *b, c; if ( 1 ) b = &a; c = a; // No run-time error with /RTCu
Si une variable aurait pu être initialisée, elle n'est pas signalée au moment de l'exécution par /RTCu. Par exemple, après l'utilisation d'un alias via un pointeur pour une variable, le compilateur ne suit pas la variable et n'indique pas des emplois non initialisés. En fait, vous pouvez initialiser une variable en acceptant son adresse. L'opérateur & fonctionne comme un opérateur d'assignation dans ce cas.
Notes
Les vérifications des erreurs au moment de l'exécution sont un moyen de rechercher les problèmes dans votre code en cours ; pour plus d'informations, consultez Comment : utiliser les contrôles natifs à l'exécution.
Si vous compilez votre programme sur la ligne de commande en utilisant l'une des options du compilateur /RTC, les instructions du pragma optimize figurant dans votre code échoueront silencieusement. La raison en est que les vérifications des erreurs au moment de l'exécution ne sont pas valides dans une version Release (optimisée).
Vous devez utiliser /RTC pour les versions de développement ; /RTC ne doit pas être utilisé pour une version commerciale. /RTC ne peut pas être utilisé avec les optimisations du compilateur (/O (Optimiser le code), options). Une image de programme générée avec /RTC sera légèrement plus grande et plus lente qu'une image générée avec /Od (jusqu'à 5 pour cent plus lente qu'une génération /Od).
La directive du préprocesseur __MSVC_RUNTIME_CHECKS sera définie lorsque vous utiliserez une option /RTC ou /GZ.
Pour définir cette option du compilateur dans l'environnement de développement Visual Studio
Ouvrez la boîte de dialogue Pages de propriété du projet. Pour plus d'informations, consultez Comment : ouvrir les pages de propriétés d'un projet.
Cliquez sur le dossier C/C++.
Cliquez sur la page de propriétés Génération de code.
Modifiez l'une des deux propriétés suivantes : Vérifications de base à l'exécution ou Vérification des types les plus petits, ou les deux.
Pour définir cette option du compilateur par programme
- Consultez les propriétés BasicRuntimeChecks et SmallerTypeCheck.
Notes du développeur sur Smart Device
Pour les compilateurs de périphérique, la fonctionnalité RTC n'est prise en charge que sur x86 et n'est pas exposée comme paramètre de propriété pour les projets Smart Device Visual C++ dans l'IDE de Visual Studio. Toutefois, si vous ciblez x86, cette option peut être définie au sein de l'IDE, dans le volet Options supplémentaires de la page de propriétés C/C++ ligne de commande.
Voir aussi
Tâches
RTC, exemple : vérifications des erreurs au moment de l'exécution