【问题标题】:how to use crypt( ) method in Linux?如何在 Linux 中使用 crypt() 方法?
【发布时间】:2013-03-21 13:58:30
【问题描述】:

我只想用crypt()生成一个加密密码,我写了一个调用crypt()方法的demo。 这是我的代码

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

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

我使用"gcc tem.c -lcrypt' 编译它,当我运行它时,一切似乎都正确,但出现了“段错误”。那么请告诉我这个简单的程序有什么问题?

【问题讨论】:

    标签: c linux unix crypt


    【解决方案1】:

    如果您使用标志 -Wall 进行编译,您就会明白原因。

    如果您阅读manual page,您会发现它在包含&lt;unistd.h&gt; 之前使用了#define _XOPEN_SOURCE。它实际上应该在包含 any 标头之前定义。

    如果您没有定义_XOPEN_SOURCE,那么crypt 函数将不会被原型化。然后编译器不知道实际的返回类型是什么,或者参数的类型和数量。所以它会假设函数返回一个int 而你的printf 需要一个字符串,所以会有一个类型不匹配导致崩溃。

    【讨论】:

    • #define 必须位于 any 库头之前 - 这是 glibc 的要求。
    • 不,这是 POSIX 要求。
    • @R.. 好吧,glibc 文档将其声明为一项要求,但并未提及 POSIX 合规性。
    【解决方案2】:

    你需要这个:

    #define _XOPEN_SOURCE
    

    在源文件的顶部,在任何 #include 之前。

    或者使用 gcc 选项 -D_XOPEN_SOURCE 编译。

    【讨论】:

      【解决方案3】:

      看起来可能与加密库支持有关。

      尝试添加:

      #include <crypt.h>
      
      [mstanislav@pardalislabs ~]$ gcc tem.c -lcrypt
      [mstanislav@pardalislabs ~]$ ./a.out  
      abFZSxKKdq5s6
      

      看起来很适合我!

      【讨论】:

      • 根据man pagecrypt.h应该包含crypt_r()unistd.h应该足够crypt()
      • 在我的测试中,我收到了您对代码所做的分段错误。如上所述添加包含后,它可以工作。您是说修复没有修复您的测试,还是只是您认为它不需要我的解决方案?
      • A) 我不是张贴者,只是一个偶然的观察者。 B)我是说,IMO,我不喜欢在不需要时添加额外的头文件,并且(如crypt() 的文档中所述)只要您有功能宏,那么该头文件就是不需要。
      猜你喜欢
      • 2015-12-10
      • 2017-05-10
      • 1970-01-01
      • 2012-11-13
      • 1970-01-01
      • 2018-09-05
      • 2018-02-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多