【问题标题】:Undefined reference to memset对 memset 的未定义引用
【发布时间】:2016-07-27 21:05:19
【问题描述】:

我使用系统调用编写了简单的 c 程序,当我使用 gcc 编译它时它运行良好。但是当我尝试使用命令生成 shell 代码(shellforge)时

./sf.py username.c

我收到错误说明

Undefined reference to memset

如何解决这个问题?这是我的代码

#define O_CREAT     0100
#define O_WRONLY    01
#define O_APPEND    02000
#define IDLEN 100
int main(void)
{
    char user_name[IDLEN]="";
    char pass1[IDLEN]="";
    char pass2[IDLEN]="";
    int fd,a,b,c;

    //to give user direction
    char user[]="Please type your username and hit enter:\n";
    char p1[]="Please type password and hit enter:\n";
    char p2[]="Please type password and hit enter:\n";

    write(1,user,sizeof(user));
    a=read(0,user_name,IDLEN);
    user_name[a-1]='\0';
    while(1)
    {
        write(1,p1,sizeof(p1));
        b=read(0,pass1,IDLEN);
        pass1[b-1]='\0';
        write(1,p2,sizeof(p2));
        c=read(0,pass2,IDLEN);
        pass2[c-1]='\0';

        int temp=0;
        while(pass1[temp] == pass2[temp])
        {
            if(pass1[temp] == '\0' || pass2[temp] == '\0')
            {
                break;
            }
            temp++;
        }
        if(pass1[temp] == '\0' && pass2[temp] == '\0')
        {
            break;
        }else{
            char error[] = "password does not match! please type your password again";
            write(1,error,sizeof(error));
        }
    }

    fd = open("user.txt",O_CREAT|O_WRONLY|O_APPEND,0666);
    if(fd<0)
    {
        return 1;
    }

    char file_user[]="\nUsername:";
    char file_pass[]="\nPassword:";
    write(fd,file_user,sizeof(file_user)-1);
    write(fd,user_name,a-1);
    write(fd,file_pass,sizeof(file_pass)-1);
    write(fd,pass1,b-1);
}

【问题讨论】:

  • 缺少#include &lt;string.h&gt;
  • 包含 string.h 头文件。
  • 为什么? OP 在他的代码中不包含memset。无论如何,OP 没有包含 writeread。为什么 gcc 不会为此返回错误?为什么 shellforge 会为 memset 返回一个错误,而不是这个?
  • 添加 string.h 会导致其他错误 nw file:///home/ubuntu/Desktop/Scr​​eenshot%20(789).png
  • 您使用的是哪个版本的 shellforge?根据您使用的 sflib 版本,memset() 可能会在 shellforge 包含头文件中定义的系统调用包装器下隐式调用。

标签: c unix system-calls memset shellforge


【解决方案1】:

包括&lt;string.h&gt;; memset() 在标准库中通常是宏而不是符号。

编辑:虽然没有显式调用,但编译器可能会为 char user_name[IDLEN]=""; 和其他字符串变量调用它。

您应该使用“-W -Wall”进行编译以检测此类问题。

【讨论】:

  • 这真的解决了问题吗?
  • 这个分析器确实给了我提示,我还添加了关于我所做的更改的答案。
【解决方案2】:

我修改了我的代码

char user_name[IDLEN]="";
char pass1[IDLEN]="";
char pass2[IDLEN]="";

char user_name[IDLEN];
char pass1[IDLEN];
char pass2[IDLEN];

它就像一个魅力! :)

【讨论】:

    猜你喜欢
    • 2018-06-17
    • 2012-10-30
    • 2022-01-02
    • 2011-03-27
    • 2022-01-22
    • 2016-04-04
    • 2015-11-03
    • 2011-08-11
    • 2019-07-22
    相关资源
    最近更新 更多