备忘:OpenSSL valgrind报"Conditional jump or move depends on uninitialised value(s)"的解决
最近改一个用到 OpenSSL 的程序,顺手用 valgrind 抓了一下,发现很多"Conditional jump or move depends on uninitialised value(s)“的错误。发现 OpenSSL 的 FAQ 提到,在生成随机数时会将输入缓冲区(未初始化)的内容直接混入 entropy pool,使用 valgrind 时便会导致警告。
如果这种警告对调试产生困扰,则可以定义 PURIFY 来消除(从代码来看,PURIFY一共影响三处代码:crypto/rand/md_rand.c中,定义PURIFY会去掉将未初始化缓冲区作为输入参数追加到摘要中的过程;crypto/rand/randfile.c中一处在定义了 PURIFY 时会对 stat(2) 结构先进行清零初始化【这个对 FreeBSD 不是问题,FreeBSD的 stat(2) 覆盖整个返回缓冲区】,另一处则是不用缓冲区中未初始化的部分参与摘要追加。
理论上,定义了PURIFY会降低随机数生成过程的随机性,但会消除事先通过特定输入来影响某些内存内容导致对随机数发生结果的影响;不过因为有其他输入,因此这种影响导致的结果应该并不严重。不过,原则上安全程序应该尽量使用更多的 entropy 输入,而不是依赖这种不确定性吧?