Неважно, если вы измените const char * на char * основной функции.
Единственное, о чем вы должны заботиться, это переполнение буфера strcpy.
В соответствии со спецификацией ELF (см. Рисунок 3-31 компоновка стека), http://refspecs.linuxbase.org/elf/abi386-4.pdf, за областью функциональных параметров следует область значений среды.
argv - это массив указателей на каждый параметр, а также Environment - это массив указателей на каждую среду var = value string.
Таким образом, макет, как показано ниже.
argv[0] --> 1st parameter
argv[1] --> 2nd parameter
argv[2] --> 3rd parameter
...
NULL
--------------------------------------- memory boundary between param and env
environ[0] --> 1st env_var=env_value
environ[1] --> 2nd env_var=env_value
environ[2] --> 3rd env_var=env_value
...
NULL
Так что, если вы скопируете очень длинную строку в argv [0], она может выйти за границы между param и env.
В этом случае вы должны переместить область памяти argv и environment в другое пространство кучи, как показано ниже.
Ниже приведен пример кода из открытого исходного кода Postgresql. ps_status.c)
char ** new_environ;
char ** new_argv;
char ** org_argv;
int i;
new_argv = (char **) malloc((argc + 1) * sizeof(char *));
for (i = 0; i < argc; i++)
new_argv[i] = strdup(argv[i]);
new_argv[argc] = NULL;
org_argv = argv;
argv = new_argv;
new_environ = (char **) malloc((i + 1) * sizeof(char *));
for (i = 0; environ[i] != NULL; i++)
new_environ[i] = strdup(environ[i]);
new_environ[i] = NULL;
environ = new_environ;
Затем вы можете использовать getopt, getenv и т. Д.
Они будут читать значения из вновь выделенной области памяти.
Кроме того, если вы измените исходный параметр (org_argv [0]), вы можете манипулировать выходным именем вашего процесса в команде ps. (также сверху утилита htop)
Смотри ниже.
$> ps -ef | grep my_proc
dplee 10855 1 0 7월28 pts/2 00:00:16 my_proc i can manipulate this name