1 // RUN: %check_clang_tidy %s cert-msc51-cpp %t -- \
2 // RUN:     -config="{CheckOptions: [{key: cert-msc51-cpp.DisallowedSeedTypes, value: 'some_type,time_t'}]}"
3 
4 namespace std {
5 
6 void srand(int seed);
7 
8 template <class UIntType, UIntType a, UIntType c, UIntType m>
9 struct linear_congruential_engine {
10   linear_congruential_engine(int _ = 0);
11   void seed(int _ = 0);
12 };
13 using default_random_engine = linear_congruential_engine<unsigned int, 1, 2, 3>;
14 
15 using size_t = int;
16 template <class UIntType, size_t w, size_t n, size_t m, size_t r,
17           UIntType a, size_t u, UIntType d, size_t s,
18           UIntType b, size_t t,
19           UIntType c, size_t l, UIntType f>
20 struct mersenne_twister_engine {
21   mersenne_twister_engine(int _ = 0);
22   void seed(int _ = 0);
23 };
24 using mt19937 = mersenne_twister_engine<unsigned int, 32, 624, 397, 21, 0x9908b0df, 11, 0xffffffff, 7, 0x9d2c5680, 15, 0xefc60000, 18, 1812433253>;
25 
26 template <class UIntType, size_t w, size_t s, size_t r>
27 struct subtract_with_carry_engine {
28   subtract_with_carry_engine(int _ = 0);
29   void seed(int _ = 0);
30 };
31 using ranlux24_base = subtract_with_carry_engine<unsigned int, 24, 10, 24>;
32 
33 template <class Engine, size_t p, size_t r>
34 struct discard_block_engine {
35   discard_block_engine();
36   discard_block_engine(int _);
37   void seed();
38   void seed(int _);
39 };
40 using ranlux24 = discard_block_engine<ranlux24_base, 223, 23>;
41 
42 template <class Engine, size_t w, class UIntType>
43 struct independent_bits_engine {
44   independent_bits_engine();
45   independent_bits_engine(int _);
46   void seed();
47   void seed(int _);
48 };
49 using independent_bits = independent_bits_engine<ranlux24_base, 223, int>;
50 
51 template <class Engine, size_t k>
52 struct shuffle_order_engine {
53   shuffle_order_engine();
54   shuffle_order_engine(int _);
55   void seed();
56   void seed(int _);
57 };
58 using shuffle_order = shuffle_order_engine<ranlux24_base, 223>;
59 
60 struct random_device {
61   random_device();
62   int operator()();
63 };
64 } // namespace std
65 
66 using time_t = unsigned int;
67 time_t time(time_t *t);
68 
f()69 void f() {
70   const int seed = 2;
71   time_t t;
72 
73   std::srand(0);
74   // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: random number generator seeded with a constant value will generate a predictable sequence of values [cert-msc51-cpp]
75   std::srand(seed);
76   // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: random number generator seeded with a constant value will generate a predictable sequence of values [cert-msc51-cpp]
77   std::srand(time(&t));
78   // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: random number generator seeded with a disallowed source of seed value will generate a predictable sequence of values [cert-msc51-cpp]
79 
80   // One instantiation for every engine
81   std::default_random_engine engine1;
82   // CHECK-MESSAGES: :[[@LINE-1]]:30: warning: random number generator seeded with a default argument will generate a predictable sequence of values [cert-msc51-cpp]
83   std::default_random_engine engine2(1);
84   // CHECK-MESSAGES: :[[@LINE-1]]:30: warning: random number generator seeded with a constant value will generate a predictable sequence of values [cert-msc51-cpp]
85   std::default_random_engine engine3(seed);
86   // CHECK-MESSAGES: :[[@LINE-1]]:30: warning: random number generator seeded with a constant value will generate a predictable sequence of values [cert-msc51-cpp]
87   std::default_random_engine engine4(time(&t));
88   // CHECK-MESSAGES: :[[@LINE-1]]:30: warning: random number generator seeded with a disallowed source of seed value will generate a predictable sequence of values [cert-msc51-cpp]
89   engine1.seed();
90   // CHECK-MESSAGES: :[[@LINE-1]]:11: warning: random number generator seeded with a default argument will generate a predictable sequence of values [cert-msc51-cpp]
91   engine1.seed(1);
92   // CHECK-MESSAGES: :[[@LINE-1]]:11: warning: random number generator seeded with a constant value will generate a predictable sequence of values [cert-msc51-cpp]
93   engine1.seed(seed);
94   // CHECK-MESSAGES: :[[@LINE-1]]:11: warning: random number generator seeded with a constant value will generate a predictable sequence of values [cert-msc51-cpp]
95   engine1.seed(time(&t));
96   // CHECK-MESSAGES: :[[@LINE-1]]:11: warning: random number generator seeded with a disallowed source of seed value will generate a predictable sequence of values [cert-msc51-cpp]
97 
98   std::mt19937 engine5;
99   // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: random number generator seeded with a default argument will generate a predictable sequence of values [cert-msc51-cpp]
100   std::mt19937 engine6(1);
101   // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: random number generator seeded with a constant value will generate a predictable sequence of values [cert-msc51-cpp]
102   std::mt19937 engine7(seed);
103   // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: random number generator seeded with a constant value will generate a predictable sequence of values [cert-msc51-cpp]
104   std::mt19937 engine8(time(&t));
105   // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: random number generator seeded with a disallowed source of seed value will generate a predictable sequence of values [cert-msc51-cpp]
106   engine5.seed();
107   // CHECK-MESSAGES: :[[@LINE-1]]:11: warning: random number generator seeded with a default argument will generate a predictable sequence of values [cert-msc51-cpp]
108   engine5.seed(1);
109   // CHECK-MESSAGES: :[[@LINE-1]]:11: warning: random number generator seeded with a constant value will generate a predictable sequence of values [cert-msc51-cpp]
110   engine5.seed(seed);
111   // CHECK-MESSAGES: :[[@LINE-1]]:11: warning: random number generator seeded with a constant value will generate a predictable sequence of values [cert-msc51-cpp]
112   engine5.seed(time(&t));
113   // CHECK-MESSAGES: :[[@LINE-1]]:11: warning: random number generator seeded with a disallowed source of seed value will generate a predictable sequence of values [cert-msc51-cpp]
114 
115   std::ranlux24_base engine9;
116   // CHECK-MESSAGES: :[[@LINE-1]]:22: warning: random number generator seeded with a default argument will generate a predictable sequence of values [cert-msc51-cpp]
117   std::ranlux24_base engine10(1);
118   // CHECK-MESSAGES: :[[@LINE-1]]:22: warning: random number generator seeded with a constant value will generate a predictable sequence of values [cert-msc51-cpp]
119   std::ranlux24_base engine11(seed);
120   // CHECK-MESSAGES: :[[@LINE-1]]:22: warning: random number generator seeded with a constant value will generate a predictable sequence of values [cert-msc51-cpp]
121   std::ranlux24_base engine12(time(&t));
122   // CHECK-MESSAGES: :[[@LINE-1]]:22: warning: random number generator seeded with a disallowed source of seed value will generate a predictable sequence of values [cert-msc51-cpp]
123   engine9.seed();
124   // CHECK-MESSAGES: :[[@LINE-1]]:11: warning: random number generator seeded with a default argument will generate a predictable sequence of values [cert-msc51-cpp]
125   engine9.seed(1);
126   // CHECK-MESSAGES: :[[@LINE-1]]:11: warning: random number generator seeded with a constant value will generate a predictable sequence of values [cert-msc51-cpp]
127   engine9.seed(seed);
128   // CHECK-MESSAGES: :[[@LINE-1]]:11: warning: random number generator seeded with a constant value will generate a predictable sequence of values [cert-msc51-cpp]
129   engine9.seed(time(&t));
130   // CHECK-MESSAGES: :[[@LINE-1]]:11: warning: random number generator seeded with a disallowed source of seed value will generate a predictable sequence of values [cert-msc51-cpp]
131 
132   std::ranlux24 engine13;
133   // CHECK-MESSAGES: :[[@LINE-1]]:17: warning: random number generator seeded with a default argument will generate a predictable sequence of values [cert-msc51-cpp]
134   std::ranlux24 engine14(1);
135   // CHECK-MESSAGES: :[[@LINE-1]]:17: warning: random number generator seeded with a constant value will generate a predictable sequence of values [cert-msc51-cpp]
136   std::ranlux24 engine15(seed);
137   // CHECK-MESSAGES: :[[@LINE-1]]:17: warning: random number generator seeded with a constant value will generate a predictable sequence of values [cert-msc51-cpp]
138   std::ranlux24 engine16(time(&t));
139   // CHECK-MESSAGES: :[[@LINE-1]]:17: warning: random number generator seeded with a disallowed source of seed value will generate a predictable sequence of values [cert-msc51-cpp]
140   engine13.seed();
141   // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: random number generator seeded with a default argument will generate a predictable sequence of values [cert-msc51-cpp]
142   engine13.seed(1);
143   // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: random number generator seeded with a constant value will generate a predictable sequence of values [cert-msc51-cpp]
144   engine13.seed(seed);
145   // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: random number generator seeded with a constant value will generate a predictable sequence of values [cert-msc51-cpp]
146   engine13.seed(time(&t));
147   // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: random number generator seeded with a disallowed source of seed value will generate a predictable sequence of values [cert-msc51-cpp]
148 
149   std::independent_bits engine17;
150   // CHECK-MESSAGES: :[[@LINE-1]]:25: warning: random number generator seeded with a default argument will generate a predictable sequence of values [cert-msc51-cpp]
151   std::independent_bits engine18(1);
152   // CHECK-MESSAGES: :[[@LINE-1]]:25: warning: random number generator seeded with a constant value will generate a predictable sequence of values [cert-msc51-cpp]
153   std::independent_bits engine19(seed);
154   // CHECK-MESSAGES: :[[@LINE-1]]:25: warning: random number generator seeded with a constant value will generate a predictable sequence of values [cert-msc51-cpp]
155   std::independent_bits engine20(time(&t));
156   // CHECK-MESSAGES: :[[@LINE-1]]:25: warning: random number generator seeded with a disallowed source of seed value will generate a predictable sequence of values [cert-msc51-cpp]
157   engine17.seed();
158   // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: random number generator seeded with a default argument will generate a predictable sequence of values [cert-msc51-cpp]
159   engine17.seed(1);
160   // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: random number generator seeded with a constant value will generate a predictable sequence of values [cert-msc51-cpp]
161   engine17.seed(seed);
162   // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: random number generator seeded with a constant value will generate a predictable sequence of values [cert-msc51-cpp]
163   engine17.seed(time(&t));
164   // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: random number generator seeded with a disallowed source of seed value will generate a predictable sequence of values [cert-msc51-cpp]
165 
166   std::shuffle_order engine21;
167   // CHECK-MESSAGES: :[[@LINE-1]]:22: warning: random number generator seeded with a default argument will generate a predictable sequence of values [cert-msc51-cpp]
168   std::shuffle_order engine22(1);
169   // CHECK-MESSAGES: :[[@LINE-1]]:22: warning: random number generator seeded with a constant value will generate a predictable sequence of values [cert-msc51-cpp]
170   std::shuffle_order engine23(seed);
171   // CHECK-MESSAGES: :[[@LINE-1]]:22: warning: random number generator seeded with a constant value will generate a predictable sequence of values [cert-msc51-cpp]
172   std::shuffle_order engine24(time(&t));
173   // CHECK-MESSAGES: :[[@LINE-1]]:22: warning: random number generator seeded with a disallowed source of seed value will generate a predictable sequence of values [cert-msc51-cpp]
174   engine21.seed();
175   // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: random number generator seeded with a default argument will generate a predictable sequence of values [cert-msc51-cpp]
176   engine21.seed(1);
177   // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: random number generator seeded with a constant value will generate a predictable sequence of values [cert-msc51-cpp]
178   engine21.seed(seed);
179   // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: random number generator seeded with a constant value will generate a predictable sequence of values [cert-msc51-cpp]
180   engine21.seed(time(&t));
181   // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: random number generator seeded with a disallowed source of seed value will generate a predictable sequence of values [cert-msc51-cpp]
182 }
183 
184 struct A {
185   A(int _ = 0);
186   void seed(int _ = 0);
187 };
188 
g()189 void g() {
190   int n = 1;
191   std::default_random_engine engine1(n);
192   std::mt19937 engine2(n);
193   std::ranlux24_base engine3(n);
194   std::ranlux24 engine4(n);
195   std::independent_bits engine5(n);
196   std::shuffle_order engine6(n);
197 
198   std::random_device dev;
199   std::default_random_engine engine7(dev());
200   std::mt19937 engine8(dev());
201   std::ranlux24_base engine9(dev());
202   std::ranlux24 engine10(dev());
203   std::independent_bits engine11(dev());
204   std::shuffle_order engine12(dev());
205 
206   A a1;
207   A a2(1);
208   a1.seed();
209   a1.seed(1);
210   a1.seed(n);
211 }
212