C中的Minishell“分段错误,核心转储”错误
Posted
技术标签:
【中文标题】C中的Minishell“分段错误,核心转储”错误【英文标题】:Minishell 'segmentation fault, core dumped' error in C 【发布时间】:2020-06-24 15:26:42 【问题描述】:以下是我的 shell 代码的一部分。该代码有效,但是当我尝试输入“ls”之类的命令时,我的程序崩溃了。我认为这是一个正确的错误,因为我尝试访问“/bin”文件。
void lecture (char cmd1[], char *argv[])
int x = 0;
char ligne [1024];
char *aux [100], *pch;
while (1)
int mot = fgetc (stdin);
ligne[x] = (char) mot;
x++;
if (mot == (int)'\n') break;
aux[0] = strtok (ligne, " \n");
strcpy(cmd1,aux[0]);
for (int i = 1; i <= 1024; i++)
argv[i+1] = aux[i];
int main()
char cmd1 [100];
char cmd2 [100];
int a = 10;
char *argv [20];
char *envp[] = (char *) "PATH=/bin", 0;
while (1)
affichage();
lecture (cmd2, argv);
printf("Test");
if ( fork() != 0)
printf("Err");
wait (NULL);
else
strcpy(cmd1, "/bin/");
strcat(cmd1, cmd2);
execve(cmd1, argv, envp);
【问题讨论】:
您的问题是什么?您说它崩溃了,但也说“这是一个正确的错误”,即您认为崩溃是正确的。那么这是一个错字吗,你认为崩溃是错误吗?另外,您缺少代码; SO 期望一个完整的、最小化的、可重现的例子。 无论如何,您对argv[]
s 的长度做出了完全没有根据的假设,从而导致缓冲区溢出。请考虑一下您在仅声明 20
指针但随后尝试分配给其中的 1025
(因为您的循环使用 <=
)时会做什么......
【参考方案1】:
在lecture
中进行以下修改后,我可以在没有 SIGSEGV 的情况下工作:
for (int i = 0; i < 20; i++)
例子:
./ms
ls
����: cannot access 'ls': No such file or directory
TestErr
...
但是你也可以像我在调试模式下编译一样调试它:
gcc -o ms -g -Wall -pedantic -Wextra -std=c11 ms.c
并使用gdb
检查 SIGSEGV 发生的位置。
请注意,您应该发布带有完整代码的https://***.com/help/minimal-reproducible-example(这里我们缺少affichage
)和
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
【讨论】:
这也不应该。它只是发生在你身上。它在最终迭代中具有未定义的行为,因为argv
被声明为具有 20 个元素,即从 0 到 19 的索引,但此代码仍然尝试从 1 到 20 循环。
所以我的 SIGSEGV 是由于我的循环 for
是的,但正如@underscore_d 提到的,正确使用的索引是 0 到 19(而不是 1 到 20):我已经更新了我的答案。
感谢您的回答以上是关于C中的Minishell“分段错误,核心转储”错误的主要内容,如果未能解决你的问题,请参考以下文章