2016-04-26 4 views
0

führt. Also habe ich ein paar Updates zu meinem RPC-Programm gemacht und jetzt seine Segfaulting, ich bin mir nicht sicher, was ich hier falsch mache. Der Unterschied zwischen den beiden ist das Entfernen der if-Anweisungen, die der Struktur args Werte zuweisen.Es ist etwas passiert, als ich Werte zu meiner Struktur erstellt und hinzugefügt habe, was zu einem segfault

Segfaults

void 
database_1(char *host, char *action, char *message) 
{   
    printf("Action: %s\n", action); 
    printf("Message: %s\n", message); 
    CLIENT *clnt; 
    rpc_args *result_1; 
    //struct rpc_args action_1_arg; 

    //rpc arguments struct to pass to server 
    struct rpc_args *args = malloc(sizeof(struct rpc_args)); 

    char *id = generate_id(); 
    if (strcmp(action, "GET") == 0) { 
     strcpy(args->action, action); 
     strcpy(args->id, id); 
    } else if(strcmp(action, "PUT") == 0) { 
     strcpy(args->action, action); 
     strcpy(args->id, id); 
     strcpy(args->message.content, message); 
    } 

#ifndef DEBUG 
    clnt = clnt_create (host, DATABASE, ASSIGNMENT_7, "udp"); 
    if (clnt == NULL) { 
     clnt_pcreateerror (host); 
     exit (1); 
    } 
#endif /* DEBUG */ 

    result_1 = action_1(args, clnt); 
    if (result_1 == (rpc_args *) NULL) { 
     clnt_perror (clnt, "call failed"); 
    } 
#ifndef DEBUG 
    free(args); 
    clnt_destroy (clnt); 
#endif /* DEBUG */ 
} 

Hat segfault nicht

void 
database_1(char *host, char *action, char *message) 
{   
    printf("Action: %s\n", action); 
    printf("Message: %s\n", message); 
    CLIENT *clnt; 
    rpc_args *result_1; 
    //struct rpc_args action_1_arg; 

    //rpc arguments struct to pass to server 
    struct rpc_args *args = malloc(sizeof(struct rpc_args)); 

    char *id = generate_id(); 

#ifndef DEBUG 
    clnt = clnt_create (host, DATABASE, ASSIGNMENT_7, "udp"); 
    if (clnt == NULL) { 
     clnt_pcreateerror (host); 
     exit (1); 
    } 
#endif /* DEBUG */ 

    result_1 = action_1(args, clnt); 
    if (result_1 == (rpc_args *) NULL) { 
     clnt_perror (clnt, "call failed"); 
    } 
#ifndef DEBUG 
    free(args); 
    clnt_destroy (clnt); 
#endif /* DEBUG */ 
} 
+1

Können Sie 'struct rpc_args' anzeigen ?. Mitglieder "action" und "id" sind wahrscheinlich char Zeiger? Wenn ja, müssen Sie auch Speicher für jeden von ihnen reservieren. – Unimportant

+0

@ user1320881 ja das ist genau das. – chrisd1100

Antwort

1

Sie uns nicht zeigen, die Definition des struct, aber stellen Sie sicher, dass es so etwas wie folgt aussieht:

#define MAX_STRING_SIZE 128 

struct rpc_args { 
    /* other members here */ 
    char action[MAX_STRING_SIZE]; 
    char id[MAX_STRING_SIZE]; 
}; 

Ähnlich muss die struct, die bei args->message.content verwendet wird, al also sei so definiert.

Wenn Sie etwas wie die obige Implementierung verwenden, stellen Sie sicher, dass Sie die Länge der zu kopierenden Strings auf weniger als MAX_STRING_SIZE - 1 überprüfen.

Alternativ vor strcpy in jene Mitglieder verwenden, können Sie dynamisch Raum für die Saiten mit malloc zuteilen, free sie dann, wenn Sie die Struktur aufzuräumen.