Des variables repoussées produisent-elles des failles ?

tatsuyad Messages postés 75 Date d'inscription   Statut Membre Dernière intervention   -  
lefilsdelaterre Messages postés 11 Date d'inscription   Statut Membre Dernière intervention   -
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.
A voir également:

1 réponse

lefilsdelaterre Messages postés 11 Date d'inscription   Statut Membre Dernière intervention   1
 
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 75 Date d'inscription   Statut Membre Dernière intervention  
 
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   Statut Membre Dernière intervention   1
 
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