C- printf引起用getlogin()引起的segfault



我是C的新手,所以如果答案很明显,我深表歉意,我在其他地方搜索了。

我包括的库是:

#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/wait.h> 
#include <fcntl.h>
#include <sys/stat.h>

失败的代码是:

    char *USER = getlogin();
    char CWD[128];
    if (USER == NULL)
        printf("cryn");
    getcwd(CWD, sizeof(CWD));
    printf("this printsn");
    printf(USER);
    printf("this does notn");
    printf("%s@myshell:%s> ", USER, CWD);

cry不会打印,因此应该意味着GetLogin成功。segfault是在printf(用户);

上引起的

进一步的测试表明,Folling Block完全打印

    printf("this printsn");
    printf(USER);
    printf("this printsn");

但是,folling块将打印此打印末端,然后segfault而不显示用户

    printf("this printsn");
    printf(USER);

编辑:

对不起,浪费了时间。我不小心删除了应该跟随它的fget,这导致了segfault。我已经在这个错误上了几个小时,当问题很小时,我喜欢它。

谢谢

您应该检查getCWD返回值。根据getCWD的人页:

如果当前工作的绝对路径名的长度 目录,包括终止null字节,超过大小字节, null返回,Errno设置为Erange;申请应 检查此错误,并在必要时分配较大的缓冲区。

如果 USER为null,则printf将取消一个无定义的行为。编译器不需要执行不确定的行为时有意义的事情,因此当用户为null时,允许不打印"哭泣"。您需要避免不确定的行为。

可能导致您结果的其他可能是发送到STDOUT的数据通常被缓冲。如果程序在数据从缓冲区冲洗之前崩溃,则数据将丢失而不是打印。

所以这是printf的工作方式...

  1. 它必须以格式字符串读取。
  2. 它必须从堆栈中获取值,以实现格式指定器,格式化并输出它们。

可能导致此的事物的示例...

char stringOfTest[5] = {'1','2','3','4','5'};

char * stringOfTest = "here are some formats that will be unsatisfied: %d%f%i%s%x";

因此,第一个可能会崩溃,因为字符串未终止,并且根据应用程序的状态,基本上可以读取它,直到它超过缓冲区(良好的实现应防止此防御),或者恰好碰到引起崩溃的格式指定符...这也用于任何垃圾数据。

第二个涉及variadic函数的工作方式...所有变量都以某种顺序推到堆栈,并且该函数没有安全的方法来知道最后一个是...将不断抓住指定的东西,直到它从堆栈中抓住东西并(也许)崩溃为止。

在第二个示例中也是第三种方法...如果您有一个%s,它将导致指针被删除...所以也可能崩溃。

相关内容

  • 没有找到相关文章

最新更新