我可以使用argc在main中的地址作为随机源吗?

我可以使用argc在main中的地址作为随机源吗?,c,pointers,random,main,argc,C,Pointers,Random,Main,Argc,我想创建一个只需要一个随机数的程序,所以我尝试使用main函数中argc的地址作为随机源,因为我认为程序在内存中的位置是随机的,而且它可以保存一些include语句,所以我尝试: #include <stdio.h> int main(int argc,const char* argv[]){ printf("%lu\n",(unsigned long int)&argv/sizeof(unsigned long int)); return 0; } 原因是

我想创建一个只需要一个随机数的程序,所以我尝试使用main函数中argc的地址作为随机源,因为我认为程序在内存中的位置是随机的,而且它可以保存一些include语句,所以我尝试:

#include <stdio.h>
int main(int argc,const char* argv[]){
    printf("%lu\n",(unsigned long int)&argv/sizeof(unsigned long int));
    return 0;
}
原因是什么?使用argc的地址作为随机数是可能的吗

然后我尝试删除地址中的一些位:

#include <stdio.h>
int main(int argc,const char* argv[]){
    printf("%lu\n",(unsigned long int)&argv >> 12);
    return 0;
}
这是将argc地址转换为随机数的“正确”方法吗

原因是什么

对于您的体系结构,我假设是x86,
int
是4个字节,这意味着每个
int
应该与一个可被4整除的地址对齐(这正是您看到的行为)

使用argc的地址作为随机数是可能的吗

可能吗。你只要去做就行了

这是个好主意吗?不,绝对不是。原因见下文

这是将argc地址转换为随机数的“正确”方法吗

我假设“正确”是指熵的良好来源,答案是否定的

现代操作系统中存在一定程度的熵,但它并不意味着是熵的良好来源。这只是为了让别人更难利用你程序中的漏洞进行安全攻击。ASLR确实没有任何保证(如果您真的想关闭它,您可以在某些操作系统中关闭它)


简而言之,不应该使用变量的地址作为熵的来源。这不是一个很好的随机性来源。

它是4的倍数,因为函数地址将在我所知道的每个平台上进行字对齐(我假设这是x86或x86_64?)

从某种意义上讲,argc的地址可能是“随机”的,因为你可能不知道它是什么,所以如果你用它来为游戏或任何可能有效的东西设定开始条件;如果您将其用于加密或其他用途,则绝对不要依赖它——攻击者可能会影响argc的加载位置


这就是说,您的C库附带了完全可行的rand()和srand()函数,作为奖励,它可以让您故意为它添加一个特定的值,这对调试非常有帮助;我个人认为,每当我需要随机数时,我都会坚持这一点。

如果你真的需要随机性,你应该使用以下方法之一:

  • /开发/随机
  • /开发/铀矿

    有关这两个方面的信息,请参阅

  • srand()

    有关种子设定srand()的信息如下:

  • 专门为其设计的外部库

    这里有一些信息


  • 您是否在询问
    &argc
    是否是用于
    srand()
    的好种子?程序在内存中的位置不太可能是随机的。操作系统使用一种算法来确定程序在内存中的位置,该算法反映了操作系统选择的一些策略。实际上,没有“一个随机数”这样的东西。有随机的数字序列。如果每次运行程序只需要一个编号,则必须从程序外部生成的序列中选择该编号。John Hascall对/dev/random的建议是一个很好的选择。像random.com这样的网站是另一个例子。
    #include <stdio.h>
    int main(int argc,const char* argv[]){
        printf("%lu\n",(unsigned long int)&argv >> 12);
        return 0;
    }
    
    34359070631
    34359034616
    34359078055
    34359080624