2013-03-21 11 views
6

Po prostu chcę użyć crypt() do wygenerowania zaszyfrowanego hasła, a ja piszę demo, które wywołuje metodę crypt(). Oto mój kodjak korzystać z metody crypt() w systemie Linux?

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

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

skompilować go za pomocą "gcc tem.c -lcrypt' i kiedy go uruchomić, wszystko wydaje się w porządku, ale „błędów segment” pokazuje się. więc proszę powiedz mi, co jest nie tak z tym prostym programem?

Odpowiedz

10

Jeśli kompilujesz z flagą -Wall, zobaczysz, dlaczego.

Po przeczytaniu manual page zobaczysz, że używa #define _XOPEN_SOURCE przed włączeniem <unistd.h>. Należy go zdefiniować przed dodaniem dowolnego nagłówka.

Jeśli nie zdefiniujesz _XOPEN_SOURCE, funkcja crypt nie będzie prototypowana. Wtedy kompilator nie wie, jaki jest rzeczywisty typ zwracania, ani typy i liczba argumentów. Zakłada się więc, że funkcja zwraca wartość int, a Twój printf oczekuje ciągu znaków, więc wystąpi niezgodność typów powodująca awarię.

+1

'# define' musi wystąpić przed _any_ nagłówkiem biblioteki - jest to wymóg glibc. – teppic

+0

Nie, to jest wymaganie POSIX. –

+0

@R .. Cóż, dokumentacja glibc określa to jako wymaganie, nie odwołując się do zgodności z POSIX. – teppic

5

Trzeba to:

#define _XOPEN_SOURCE 

w górnej części pliku źródłowego, przed każdym #include.

Alternatywnie można skompilować z opcją gcc -D_XOPEN_SOURCE.

2

Wygląda na to, że może to być związane z obsługą bibliotek kryptograficznych.

spróbuj dodać:

#include <crypt.h> 

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

Wygląda dobrze dla mnie!

+0

zgodnie z [stroną man] (http://linux.die.net/man/3/crypt) 'crypt.h' powinno być włączone dla' crypt_r() ', wystarczy' unistd.h' enought for 'crypt()' – Mike

+0

Podczas testów otrzymałem błąd segmentacji, który zrobiłeś z kodem. Po dodaniu pliku jak wyżej, działa. Czy twierdzisz, że poprawka nie naprawiła * twojego * testowania lub po prostu, że uważasz, że nie powinno to wymagać mojego rozwiązania? –

+0

A) Nie jestem plakatem, tylko zwykłym obserwatorem. B) Mówię, IMO, nie lubię dodawać dodatkowych plików nagłówkowych, gdy nie są one wymagane, i (jak podano w dokumentacji dla 'crypt()'), o ile masz funkcjonalne makro, to ten nagłówek plik nie jest wymagany. – Mike

Powiązane problemy