2013-03-21 11 views
6

Ich möchte nur crypt() verwenden, um ein verschlüsseltes Passwort zu generieren, und ich schreibe eine Demo, die die crypt() Methode aufrufen. Hier ist mein CodeWie verwende ich crypt() in Linux?

#include <unistd.h> 
#include <stdio.h> 
#include <stdlib.h> 

int main() 
{ 
    printf("%s\n",crypt("abc","ab")); 
    exit(0); 
} 

ich es "gcc tem.c -lcrypt' mit kompilieren und wenn ich es laufen, scheint alles in Ordnung, aber ein „Segment Fehler“ erscheint. Bitte sag mir was mit diesem einfachen Programm nicht stimmt.

Antwort

10

Wenn Sie mit der Flagge -Wall kompilieren, werden Sie sehen, warum.

Wenn Sie die manual page lesen, werden Sie sehen, dass es #define _XOPEN_SOURCE vor dem Einschließen <unistd.h> verwendet. Es sollte eigentlich definiert werden, bevor irgendein Header. Wenn Sie _XOPEN_SOURCE nicht definieren, wird die crypt-Funktion nicht als Prototyp erstellt. Dann weiß der Compiler nicht, was der tatsächliche Rückgabetyp oder die Typen und die Anzahl der Argumente sind. Daher wird davon ausgegangen, dass die Funktion eine int zurückgibt und Ihre printf erwartet eine Zeichenfolge, so dass es einen Typkonflikt gibt, der den Absturz verursacht.

+1

Die '# define' muss vor _any_ library header stehen - es ist eine Glibc-Anforderung. – teppic

+0

Nein, das ist eine POSIX-Anforderung. –

+0

@R .. Nun, die Glibc-Dokumentation gibt es als eine Anforderung, es bezieht sich nicht auf POSIX-Compliance. – teppic

5

Sie müssen dies:

#define _XOPEN_SOURCE 

an der Spitze der Quelldatei, bevor eine #include.

Alternativ kompilieren Sie mit der gcc-Option -D_XOPEN_SOURCE.

2

Sieht so aus, als könnte es mit der Unterstützung der Krypto-Bibliothek zusammenhängen.

Versuchen Zugabe:

#include <crypt.h> 

[[email protected] ~]$ gcc tem.c -lcrypt 
[[email protected] ~]$ ./a.out 
abFZSxKKdq5s6 

Sieht gut für mich!

+0

laut der [man page] (http://linux.die.net/man/3/crypt) sollte 'crypt.h' für' crypt_r() 'enthalten sein, nur' unistd.h' sollte sein Genug für 'crypt() ' – Mike

+0

In meinem Test erhielt ich den Segmentierungsfehler, den Sie mit Ihrem Code gemacht haben. Nachdem das Include wie oben hinzugefügt wurde, funktioniert es. Sind Sie der Meinung, dass der Fix * Ihre * Tests nicht repariert hat, oder nur, dass Sie glauben, dass sie meine Lösung nicht brauchen sollten? –

+0

A) Ich bin nicht das Poster, nur ein zufälliger Beobachter. B) Ich sage, IMO, ich mag es nicht, zusätzliche Header-Dateien hinzufügen, wenn sie nicht erforderlich sind, und (wie in der Dokumentation für 'crypt()' angegeben), solange Sie das funktionale Makro haben, dann diesen Header Datei ist nicht erforderlich. – Mike