2016-07-27 17 views
2

Ich schrieb einfache c-Programm mit Systemaufruf und es funktionierte gut, wenn ich es mit gcc kompiliert. Aber als ich versuchte, Shell-Code zu erzeugen (shellforge) BefehlNicht definierte Referenz zu memset

./sf.py username.c 

Ich habe die besagt, Fehler

Undefined reference to memset 

Wie dieses Problem zu beheben? Hier ist mein Code

#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); 
} 
+0

Fehlende '#include ' – EOF

+0

enthalten die Header-Datei string.h. –

+1

Warum? OP enthält nicht "memset" in seinem Code. Unabhängig davon hat OP nicht das Include für 'write' und' read'. Warum würde gcc keinen Fehler zurückgeben? Warum würde Shellforge dann einen Fehler für memset zurückgeben, aber nicht das? –

Antwort

2

enthalten <string.h>; memset() ist normalerweise ein Makro und kein Symbol in den Standardbibliotheken.

EDIT: Obwohl nicht explizit aufgerufen, könnte der Compiler es für char user_name[IDLEN]=""; und die anderen String-Variablen aufrufen.

Sie sollten mit "-Wall" kompilieren, um solche Probleme zu erkennen.

+0

Hat das tatsächlich das Problem behoben? – immibis

+0

dieser Anser gab mir tatsächlich einen Hinweis und ich habe auch eine Antwort hinzugefügt, welche Änderungen ich gemacht habe. – surendra

1

Ich änderte meinen Code von

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

zu

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

und es funktionierte wie ein Zauber! :)