argv
et argc
sont comment les arguments de la ligne de commande sont passés à main()
en C et C++.
argc
sera le nombre de chaînes pointées par argv
. Cela sera (en pratique) 1 plus le nombre d'arguments, car pratiquement toutes les implémentations ajouteront le nom du programme au tableau.
Les variables sont nommées argc
(compteur d'arguments) et argv
(vecteur d'arguments) par convention, mais elles peuvent recevoir n'importe quel identificateur valide : int main(int num_args, char** arg_strings)
est également valide.
Ils peuvent également être omis entièrement, donnant int main()
, si vous n'avez pas l'intention de traiter des arguments de ligne de commande.
Essayez le programme suivant :
#include
int main(int argc, char** argv) {
std::cout << "Have " << argc << " arguments:\n";
for (int i = 0; i < argc; ++i) {
std::cout << argv[i] << "\n";
}
}
En l'exécutant avec ./test a1 b2 c3
, le résultat sera :
Have 4 arguments:
./test
a1
b2
c3
66 votes
Si votre programme va ignorer les arguments de la ligne de commande, alors ce que vous écrivez est correct. Si votre programme a besoin de traiter les arguments de la ligne de commande, alors l'EDI le fait correctement.
37 votes
Un conseil pour les hackers : essayez de déclarer
int main(int argc, char* argv[], char* envp[])
et d'afficher le dernier argument.;)
9 votes
@ulidtko ce n'est pas bien que vous enseigniez aux débutants à introduire des vulnérabilités dans leurs programmes ;)
17 votes
@Gab comment l'impression simple des variables d'environnement peut-elle entraîner une vulnérabilité? Il suffit de ne pas transmettre les chaînes contaminées telles quelles aux appels de
system()
, aux requêtes de base de données, etc. Comme d'habitude avec les entrées utilisateur.2 votes
@ulidtko Intéressant... Pouvez-vous expliquer pourquoi vous n'avez pas besoin de passer des chaînes contaminées, des requêtes de base de données, etc. tout en utilisant l'argument
char **envp
?0 votes
@ulidtko Est-ce que la surcharge sera invoquée lorsque des arguments de ligne de commande sont passés?
1 votes
@MasterJames: Si vous faites
sql_query("SELECT FROM mytable WHERE name == " + name_from_env + ";")
, vous permettez les injections SQL. Voir xkcd.com/327 pour un exemple amusant.