fprintf, erreur: format pas un littéral de chaîne et pas d’arguments de format [-Werror = format-security

Quand j’essaie de comstackr fprintf(stderr,Usage) sur Ubuntu, j’ai cette erreur:

  error: format not a ssortingng literal and no format arguments [-Werror=format-security 

mais quand j’ai compilé cela sur d’autres dissortingbutions Linux (RedHat, Fedora, SUSE) qui est compilé avec succès.

Quelqu’un a une idée?

Vous devez utiliser fputs(Usage, stderr);

Il n’y a pas besoin d’utiliser fprintf si vous ne faites pas de mise en forme. Si vous voulez utiliser fprintf, utilisez fprintf(stderr, "%s", Usage);

Les drapeaux par défaut du compilateur sur Ubuntu incluent -Wformat -Wformat-security qui donne cette erreur.

Ce drapeau est utilisé comme précaution contre l’introduction de bogues liés à la sécurité, imaginez ce qui se passerait si vous aviez fait cela:

 char *Usage = "Usage %s, [options] ... "; ... fprintf(stderr, Usage); 

Ce serait le même que fprintf(stderr, "Usage %s, [options] ... ]"); ce qui est faux.

Maintenant, la chaîne Usage inclut un spécificateur de format, %s , mais vous ne fournissez pas cet argument à fprintf , ce qui entraîne un comportement indéfini, éventuellement le blocage de votre programme ou son exploitation. Cela est plus pertinent si la chaîne que vous transmettez à fprintf provient des entrées de l’utilisateur.

Mais si vous faites fprintf(stderr,"%s", "Usage %s, [options] ... ]"); Il n’y a pas un tel problème. Le 2. %s ne sera pas interprété comme un spécificateur de format. gcc peut en avertir, et les drapeaux par défaut du compilateur Ubuntu en font une erreur de compilation.

Utilisez fputs(Usage) ou fprintf(stderr, "%s", Usage) . Le fait de passer une chaîne de message à une fonction printf family est dangereux car, à moins de ne pas contenir de spécificateurs de format, tous les spécificateurs de format de la chaîne seront interprétés et entraîneront un comportement indéfini ), et cela se traduira presque toujours par des bogues de sécurité.