2008-09-14 5 views
8

J'ai une fonction qui me donne l'avertissement suivant:Comment désactiver un avertissement dans Delphi à propos de "return value ... could be undefined"?

[CDC] avertissement filename.pas (6939): W1035 Valeur de retour de la fonction 'fonction' peut être non défini

La fonction, cependant, est propre, petit et a une valeur de retour connue, attendue. La première déclaration de la fonction est:

Result := ''; 

et il n'y a pas de variable locale ou paramètre appelé Result soit.

Existe-t-il une sorte de directive de type pragma avec laquelle je peux entourer cette méthode pour supprimer cet avertissement? C'est Delphi 2007.

Malheureusement, le système d'aide sur cette installation Delphi ne fonctionne pas, donc je ne peux pas afficher l'aide pour cet avertissement en ce moment.

Quelqu'un sait-il d'avance ce que je peux faire?

+0

@NGLN Dans le doublon lié le code ne définit pas définitivement 'Result' et l'avertissement du compilateur dans ce cas pourrait être parce que le compilateur ne voit pas que' Abort' terminera la méthode sans lui permettre de retourner correctement. Dans ma question, cependant, le code définissait définitivement 'Result' puisque c'était littéralement la première déclaration de la méthode. Êtes-vous * sûr * que c'est un bon doublon? –

+0

O shoot, j'ai manié le [dupe hammer] (http://meta.stackexchange.com/questions/231625/please-remind-me-when-i-am-wielding-the-dupe-hammer); ce n'était pas mon intention. Je peux voir la différence maintenant, mais je pense que le titre aurait dû être quelque chose comme _Pourquoi cette valeur de retour est-elle indéfinie (et comment résoudre)? _. Mais si ce n'est pas un doublon, je ne suis toujours pas sûr que cette question ne devrait pas être fermée car elle ressemble à _Too Localized_. Je vais voter pour rouvrir, puisque ni l'un ni l'autre n'a été marqué comme dupe quand [cette réponse] (http://stackoverflow.com/a/4204619/757830) a été postée, et laisse la décision à la communauté. – NGLN

Répondre

6

Êtes-vous sûr que vous avez tout fait pour résoudre l'avertissement? Peut-être que vous pourriez poster le code pour nous de regarder?

Vous pouvez désactiver l'avertissement localement ainsi:

{$WARN NO_RETVAL OFF} 
function func(...): string; 
begin 
    ... 
end; 
{$WARN NO_RETVAL ON} 
+0

La première instruction de la fonction donne à la fonction une valeur de retour par défaut. Le reste de la fonction est une déclaration de cas et certains appels à d'autres fonctions à partir des points de cas. –

1

Il semble y avoir une sorte de bogue dans Delphi. Lire la suite, les derniers liens de commentaires à d'autres rapports de bogues qui peuvent être celui que vous avez:

http://qc.codegear.com/wc/qcmain.aspx?d=8144

+0

Je sais, il y a aussi un rapport de bogue similaire sur un trop grand nombre de variables locales et de paramètres combinés qui provoque cela, mais cette fonction est vraiment simple. Quoi qu'il en soit, Delphi est buggé. Quoi d'autre est nouveau :) –

1

La {$ WARN NO_RETVAL OFF} est ce que vous recherchez, mais en général, je veux savoir pourquoi des choses comme cela se produit. Vous pourriez envisager de le formater différemment et voir si cela aide.

Avez-vous des commandes de modification de flux comme Exit? Est-ce que vous soulevez directement des exceptions, etc? Est-ce que votre déclaration de cas a un autre à la fin qui définit une valeur sur Résultat?

Essayez d'ajuster ces éléments pour voir si cela élimine également l'avertissement.

1

Afin d'obtenir une bonne réponse pour cela, vous devrez poster le code. En général, le compilateur Delphi donnera cet avertissement s'il existe un chemin de code possible qui pourrait entraîner la non-définition du résultat. Parfois, ce chemin de code est moins qu'évident.

+1

Lorsque le chemin du code suit une ligne de code initiale inconditionnelle qui initialise explicitement "result" (comme expliqué dans la question), peu importe à quel point ce chemin de code n'est pas évident, l'avertissement est faux (dans ce cas). – Deltics

+0

Je suis d'accord, nous devons voir le code pour aider. Dans mon expérience, Delphi ne prévient jamais de la valeur de retour manquante lorsque le type de retour est une chaîne. Même si le résultat n'est pas défini. –

3

Je ne suis pas sûr que je veux voir le code pour cette unité ... après tout, l'erreur se produit à la ligne 6939 ... Peut-être qu'une table de compilation interne a été dépassée?

+1

Je suis d'accord. J'ai vu cet avertissement avec D2006 sur une méthode contenant une grande déclaration de cas avec branchement imbriqué. La suppression de certains chemins de code a fait disparaître l'avertissement, quelles que soient les branches supprimées. Il semble donc qu'il y ait une limite à la quantité de branchement qui peut arriver avant que le compilateur arrête de regarder et suppose qu'il doit y avoir au moins un chemin qui ne définit pas le résultat :) – WileCau

1

Il y a un tel bogue dans le compilateur Delphi puisque, au moins, Delphi4: si la somme des nombres de paramètres de la fonction (y compris Self et Result) et des variables locales dépasse 31, cela pose des problèmes. Par exemple, il peut écrire des avertissements W1035 (le résultat peut être indéfini). Il peut manquer des variables non utilisées. Il suffit d'essayer ce projet:

program TestCompilerProblems; 

procedure Proc; 
var 
    a01, a02, a03, a04, a05, a06, a07, a08, a09, a10, 
    a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, 
    a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, 
    a31, a32, a33, a34, a35, a36, a37, a38, a39, a40: Integer; 
begin 
end; 

begin 
    Proc; 
end. 

Cela provoquerait 31 indices, pas 40.

Questions connexes