Omission de l'instruction Return en C
En C , il est d'usage de terminer une fonction non vide avec une instruction return. Cependant, un événement étrange a été observé dans une version Windows spécifique de g distribuée avec Strawberry Perl. Cette version permet l'omission d'une instruction return dans les fonctions qui renvoient une valeur non vide, conduisant à un comportement inattendu.
Considérez la fonction membre suivante :
struct boundTag Box::getBound(int side) { struct boundTag retBoundTag; retBoundTag.box = this; switch (side) { // set retBoundTag.bound based on value of "side" } }
Cette fonction est conçue pour renvoie une structure représentant les balises liées. Cependant, le développeur a omis par inadvertance l'instruction return :
// ... code from above }
Lors du test de cette fonction, le développeur a reçu une sortie valide malgré l'instruction return manquante. Même après avoir supprimé l'instruction return, le code se compile sans aucun avertissement.
Le problème sous-jacent est que l'omission de l'instruction return dans une fonction non vide appelle un comportement indéfini. La norme ISO C -98 indique explicitement que le fait de découler de la fin d'une fonction non vide équivaut à un retour sans valeur, ce qui entraîne un comportement indéfini.
// ... code from above // Undefined behavior }
Dans ce scénario, g renvoie probablement un valeur poubelle car le compilateur ne peut pas déterminer la valeur de retour prévue. L'utilisation de cette valeur renvoyée dans votre code est dangereuse et peut conduire à des résultats imprévisibles.
Bien que g ne puisse pas émettre d'avertissement par défaut, l'utilisation de l'option -Wall lors de la compilation oblige le compilateur à avertir de ces cas. Cette option mettra en évidence l'instruction return manquante et aidera à éviter un tel comportement indéfini.
Par conséquent, il est essentiel de toujours inclure une instruction return dans les fonctions non vides, même si la valeur de retour n'est pas utilisée immédiatement. Cette pratique garantit que le code est conforme au standard C et évite tout comportement potentiel non défini.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!