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(因为您的循环使用 &lt;=)时会做什么...... 【参考方案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“分段错误,核心转储”错误的主要内容,如果未能解决你的问题,请参考以下文章

在opencv c ++中查找图像卷积时出现分段错误(核心转储)错误

识别导致分段错误(核心转储)的错误

为啥我在 C 中收到警告“分段错误,核心转储”

最简单的字符串数组c程序上的分段错误(核心转储)

分段错误(核心转储)c

分段错误(核心转储)错误 C linux 套接字