我传递了参数Arturo $ 1 $ salt $并且我收到了分段错误(核心转储)错误。
#define _XOPEN_SOURCE
#include <stdio.h>
#include <unistd.h>
#include <string.h>
int main (int argc, char* argv[])
{
if ( argc != 3) {
printf ("Usage: ./crypt key salt\n");
return 1;
}
printf ("%s\n", crypt (argv[1], argv[2]));
return 0;
}
答案 0 :(得分:3)
答案结果很简单 - bash变量扩展。 shell中保留$
字符,以标记变量的开头
所以当你运行
./program Arturo $1$salt$
变量扩展后的argv[2]
将是
"$"
在glibc规范之后不是有效的盐(期望$id$salt$
)。使用该种子调用crypt
将返回NULL
并将errno
设置为EINVAL
,因为种子无效,并且对printf
的调用扼杀了NULL
和段错误,这是你看到的行为。
如果您按如下方式执行程序,则禁用shell中的变量扩展:
./program Arturo '$1$salt$'
输出将是
$1$salt$y5SOwLketmwNfSvW0yAoz/
正如所料。
答案 1 :(得分:0)
假设:
typedef char *string;
来自crypt
POSIX documentation:
salt参数应该是一个长度至少为两个字节的字符串,不包括从集合中选择的空字符:
a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z. 0 1 2 3 4 5 6 7 8 9。 /
但您通过了$1$salt$
。
因此,您必须检查crypt
的返回值,并且仅在! = NULL
时打印。
现在,如果您想使用glibc中的crypt
函数,则必须在程序中包含crypt.h
标题。请参阅glibc documentation中的示例。