47 votes

Avertissement C Sentinelle manquante dans l'appel de fonction

C'est mon avertissement.

Missing sentinel in function call

Comment je peux l'enlever.

J'utilise linux et le compilateur gcc.

12 votes

Pouvez-vous afficher une partie du code ? Vous semblez utiliser une fonction sentinelle et ne pas terminer la liste des arguments par NULL.

10 votes

Difficile à dire sans voir le code que vous essayez de compiler.

2 votes

Erreur de frappe dans mon commentaire précédent, je ne voulais pas dire "fonction sentinelle", mais une fonction qui prend une liste de paramètres et qui utilise une sentinelle pour marquer la fin de la série de données.

68voto

Michael Gaylord Points 2728

Il semble que vous n'ayez pas terminé une déclaration de tableau avec NULL . Sans le null, vous risquez d'avoir des problèmes de mémoire car le runtime ne saura pas où se termine le tableau et où commence la partie suivante de la mémoire.

2 votes

nil ? Cela n'existe pas en C, il n'y a que NULL. Comment cette réponse peut-elle avoir autant de votes positifs ? Je dois rater quelque chose.

1 votes

Vous avez raison. J'ai mis à jour la réponse en conséquence.

1 votes

@Mawg stackoverflow.com/a/21076928/895245 est la meilleure réponse, car elle montre le sentinel qui est le coupable :-)

53voto

Peter Bagnall Points 738

Je viens de rencontrer le même problème. Le code qui a causé le problème pour moi était...

execl("/bin/bash", "/bin/bash", fname, '\0');

mais ça devrait l'être...

execl("/bin/bash", "/bin/bash", fname, (char *)0);

Le problème de la première version est que la liste des paramètres est censée se terminer par un pointeur nul. Mais ' \0 ' n'est pas un pointeur nul, c'est un caractère nul. Donc la valeur (0) est correcte, c'est juste le type qui est faux.

Le (char *)0 est aussi un zéro, mais il est converti en un char. pointeur qui est un pointeur nul (c'est-à-dire qu'il pointe vers l'adresse 0). Ceci est nécessaire pour que le système puisse savoir où la liste des paramètres se termine et ne continue pas à rechercher des paramètres après le dernier. En faisant cela, il obtiendrait des pointeurs invalides qui pourraient pointer vers n'importe quelle mémoire - ce qui causerait probablement une erreur de segmentation.

Ce (char *)0 est appelé la sentinelle, et c'est ce qui manquait dans le premier exemple.

Enfin, notez que NULL est défini comme (void *)0, donc

execl("/bin/bash", "/bin/bash", fname, NULL);

Il fonctionne tout aussi bien, et est un peu plus pratique. (Merci à @mah pour cela).

3 votes

J'ai rencontré le même problème il y a quelques minutes. Dans mon cas, mon appel s'était déjà terminé avec 0 mais l'avertissement était là ; quand je l'ai remplacé par NULL l'avertissement a disparu -- pour la même raison que la vôtre -- le pointeur de coulée qui NULL a.

0 votes

Oui, NULL est une meilleure façon d'écrire cela - merci, je l'ai ajouté à la réponse !

0 votes

@PeterBagnall Merci d'avoir travaillé. Ceci devrait être marqué comme la réponse

18voto

kslcam Points 207

Dans Xcode, si vous codifiez en Objective-C et que vous utilisez des méthodes qui prennent une liste de paramètres variables, vous devez ajouter le code suivant néant à la fin de la liste.

Par exemple :

N**SArray names = [NSArray arrayWithObjects : @ "Name1", @ "Name2"] ; * //entraînera l'avertissement mentionné ci-dessus

Cependant, NSArray *names = [NSArray arrayWithObjects : @"Name1", @"Name2", nil] ; //Correct

J'espère que cela vous aidera !

1voto

qrdl Points 17813

Google est votre ami.

Premier résultat pour "sentinelle manquante dans l'appel de fonction" : http://www.linuxonly.nl/docs/2/2_GCC_4_warnings_about_sentinels.html

0voto

taus-iDeveloper Points 396

Sentinelle signifie garder ou protéger Donc, dans ce contexte, l'erreur se produit parce qu'il se peut que les paramètres de protection soient manquants. Si vous utilisez un tableau ou un dictionnaire, assurez-vous qu'après avoir nommé les objets, vous les terminez par le mot clé nil.

Exemple :

[NSDictionary dictionaryWithObjectsAndKeys:@"UIAlertView", kSectionTitleKey,
              @"Show Custom", kLabelKey,
              @"AlertsViewController.m - alertOtherAction", kSourceKey];

La déclaration ci-dessus produira une erreur "sentinelle manquante dans l'appel de fonction".

Syntaxe correcte :

[NSDictionary dictionaryWithObjectsAndKeys:@"UIAlertView", kSectionTitleKey,
              @"Show Custom", kLabelKey,
              @"AlertsViewController.m - alertOtherAction",kSourceKey,nil];

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X