如何解决用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
模拟 argv
,argv[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};
...
}
我想要将与 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
模拟 argv
,argv[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};
...
}