如何解决用C代码更改主函数输入的分段错误?

How to solve segmentation fault in change main function inputs with C code?

我想要将与 Sysbench 工具 (https://github.com/akopytov/sysbench) 相关的以下代码从以下代码更改为下一个代码,但仅此一点更改就出现错误 (Segmentation fault (核心转储))。

./sysbench cpu --cpu-max-prime=2000 run

int main(int argc,char *argv[])
        {   
            .
            .
            .
        }

int main(void)
{  
 char *argv[]= {"./sysbench","cpu","--cpu-max-prime=2000","run", NULL};
 int argc = sizeof(argv) / sizeof(char*) - 1; 
           .
           .
           .

}

使用 GDB 调试:

Program received signal SIGSEGV, Segmentation fault.
0x000000000040aec8 in parse_option (
   name=name@entry=0x4768e8 "cpu-max-prime=2000", 
   ignore_unknown=ignore_unknown@entry=false) at sysbench.c:500
500     *tmp = '[=12=]';
static int parse_option(char *name, bool ignore_unknown)
{
 const char        *value;
 char              *tmp;
 option_t          *opt;
 char              ctmp = 0;
 int               rc;

 tmp = strchr(name, '=');
 printf( "tmp: %s\n", tmp );
 if (tmp != NULL)
 {
   ctmp = *tmp;
   *tmp = '[=13=]';
   value = tmp + 1;
 }
 else
 {
   value = NULL;
 }

 opt = sb_find_option(name);
 if (opt != NULL || ignore_unknown)
   rc = set_option(name, value,
                   opt != NULL ? opt->type : SB_ARG_TYPE_STRING) == NULL;
 else
   rc =  1;

 if (tmp != NULL)
   *tmp = ctmp;

 return rc;
}

请帮帮我。 谢谢。

为了从 main 模拟 argvargv[n] 指向的字符串必须是可写的,在 argv[n] 指向的代码中不是这种情况无法写入的字符串文字。

写入字符串文字在 C 语言中是正式的未定义行为,但在现代桌面平台上它通常会触发段错误。

*tmp = '[=15=]'; 实际上是写入一个字符串

这应该可以完成工作,但我不能完全确定,因为我无法在此处轻松检查它。

int main(void)
{
  char arg1[] = "./sysbench";
  char arg2[] = "cpu";
  char arg3[] = "--cpu-max-prime=2000";
  char arg4[] = "run";
  char* argv[] = {arg1, arg2, arg3, arg4, NULL};
  ...
  
}