Des variables repoussées produisent-elles des failles ?

Fermé
tatsuyad Messages postés 74 Date d'inscription mercredi 3 juin 2015 Statut Membre Dernière intervention 3 avril 2016 - Modifié par Whismeril le 22/08/2015 à 08:31
lefilsdelaterre Messages postés 11 Date d'inscription vendredi 21 août 2015 Statut Membre Dernière intervention 27 août 2015 - 22 août 2015 à 11:59
Bonjour.

Novice en Perl,j'ai écrit un code comme tel:


 use strict;
 use warnings;

 sub Salut{
  my ($x,$y) = @_;
  print "Salut".$x.$y;
 }

 Salut("jiji","jaja","juju");



Comme vous le voyez,le nombre des paramètres passés ne correspond pas à la fonction "Salut" de l'appel. En C,si on ne fait pas recours à "Valt" (Le nom,je ne m'en souvients plus,c'est une variable prédéfinie par le systéme qui permet d'avoir beaucoup de variables à passer à printf() ).

Perl ne grogne sur rien,même si j'inclus deux modules au top..

Pensez-vous que mon code est sain ?

EDIT : Ajout du LANGAGE dans les balises de code.
Explications disponibles ICI

Merci d'y penser dans tes prochains messages.

1 réponse

lefilsdelaterre Messages postés 11 Date d'inscription vendredi 21 août 2015 Statut Membre Dernière intervention 27 août 2015 1
22 août 2015 à 10:41
Bonjour,

Perl n'a aucune raison de grogner. Les arguments envoyés à la fonction sont tous les trois stockés automatiquement dans le tableau @_, et rien n'oblige à tous les utiliser par la suite.

Dans ton code, tu choisis simplement de recopier les deux premiers arguments et de ne pas utiliser le troisième.
0
tatsuyad Messages postés 74 Date d'inscription mercredi 3 juin 2015 Statut Membre Dernière intervention 3 avril 2016
22 août 2015 à 10:58
Quelle souplesse de language !
Moi,qui ne connaissait que C et Java,suis bien impressionné.Avec $_,Perl
a deux variables intarissables qui pourraient protéger notre petit mimi mémoire
de l'overflow misérable ?
Merci monsieur pour m'avoir aidé !
0
lefilsdelaterre Messages postés 11 Date d'inscription vendredi 21 août 2015 Statut Membre Dernière intervention 27 août 2015 1
22 août 2015 à 11:59
C'est clair que pour de petits scripts, le perl permet de ne pas trop s'embêter... mais dans l'absolu il y a bien un problème quand même.

On peut très bien se mettre à la place d'un utilisateur qui envoie trois arguments en espérant qu'ils soient tous les trois traités, or la fonction n'en utilise que 2. Le programme ne montre aucun signe de cette lacune, et à débugger ça peut vite devenir un calvaire.

En C on devrait par exemple envoyer deux arguments : l'un pour le nombre de chaînes à traiter, et le deuxième un tableau de pointeurs, chacun correspondant à l'adresse d'une chaîne. L'affichage se ferait alors dans une boucle.
Cela donnerait quelque chose comme ça :


#include <stdio.h>
#include <stdlib.h>

void aff(int n , char **c) {
int i ;
for (i = 0 ; i <= n-1 ; i++) {
printf("%s ; " , c[i]) ;
}

}

int main() {

char **c ;

c = (char**)calloc(3 , sizeof(char[10])) ;

c[0] = "pouet" ;
c[1] = "pouic" ;
c[2] = "plouf" ;


aff(3 , c) ;

return 0 ;
}
0