LINUX.ORG.RU

История изменений

Исправление monk, (текущая версия) :

Ещё красивый пример:

struct timeval tv;
unsigned long junk;
 
gettimeofday(&tv, NULL);
srandom((getpid() << 16) ^ tv.tv_sec ^ tv.tv_usec ^ junk);

clang превращает в

struct timeval tv;
unsigned long junk;
 
gettimeofday(&tv, NULL);
getpid();
srandom(0);
Так как результат вычисления с неинициализированной переменной — UB. В результате «генератор случайных чисел» становится совсем неслучайным.

Исходная версия monk, :

Ещё красивый пример:

struct timeval tv;
unsigned long junk;
 
gettimeofday(&tv, NULL);
srandom((getpid() << 16) ^ tv.tv_sec ^ tv.tv_usec ^ junk);

clang превращает в struct timeval tv; unsigned long junk; gettimeofday(&tv, NULL); getpid(); srandom(0); Так как результат вычисления с неинициализированной переменной — UB. В результате «генератор случайных чисел» становится совсем неслучайным.