OMI, code comme celui - argv[1] = "123";
UB.
"Les paramètres argc et argv et les chaînes pointées par le tableau argv est
être modifiable par le programme, et de conserver leur dernier-valeurs stockées entre programme
de démarrage et de fin de programme." C11dr §5.1.2.2.1 2
Rappelons qu' const
est entré en C, de nombreuses années après C est la création.
Un peu comme char *s = "abc";
est valide alors qu'il devrait être const char *s = "abc";
. La nécessité d' const
n'a pas été requise d'autre trop de code existant aurait rompu avec l'introduction de l' const
.
De la même manière, même si argv
aujourd'hui, devrait être considérée char * const argv[]
ou une autre signature avec const
, le manque d' const
dans la char *argv[]
ne se termine pas spécifier l' const
-ness besoins de l' argv
, argv[]
ou argv[][]
. L' const
-ness besoins doivent être pilotées par la spécification.
De ma lecture, depuis la spécification est muet sur la question, c'est UB.
Un comportement indéfini est d'indication contraire dans la présente Norme Internationale par les mots ‘un comportement indéfini" ou par l' omission d'une définition explicite de comportement" §4 2
[edit]:
main()
est une très particulière de la fonction de C. Ce qui est autorisé dans d'autres fonctions peuvent ou peuvent ne pas être autorisés en main()
. Le C spec détails attributs sur ses paramètres que, compte tenu de la signature int argc, char *argv[]
qui ne le sont pas ont besoin. main()
, contrairement à d'autres fonctions en C, peut avoir une autre signature int main(void)
et potentiellement d'autres. main()
n'est pas réentrant. Comme le C spec sort de sa façon de détailler ce qui peut être modifié: argc
, argv
, argv[][]
, il est raisonnable de se demander si argv[]
est modifiable en raison de son omission de la spec affirmant que le code.
Compte tenu de la spécialité de l' main()
, et que l'omission de le spécifier argv[]
modifiables, un conservateur programmeur devrait traiter cette grisaille comme UB, dans l'attente de C spec clarification.
Si argv[i]
est modifiable sur une plate-forme donnée, certainement la gamme de i
ne doit pas dépasser argc-1
.
En tant que "argv[argc]
doit être un pointeur null", assignining argv[argc]
d'autre chose que de l' NULL
semble être une violation.
Bien que les cordes sont modifiables, le code ne doit pas dépasser l'original de la longueur de la chaîne.
char *newstr = "abc";
if (strlen(newstr) <= strlen(argv[1]))
strcpy(argv[1], newstr);