xref: /llvm-project/clang-tools-extra/test/clang-tidy/checkers/cert/msc51-cpp.cpp (revision e8a3ddafe063c970df9c23e803812369abde4c82)
189a1d03eSRichard // RUN: %check_clang_tidy %s cert-msc51-cpp %t -- \
2*e8a3ddafSNathan James // RUN:     -config="{CheckOptions: {cert-msc51-cpp.DisallowedSeedTypes: 'some_type,time_t'}}"
389a1d03eSRichard 
489a1d03eSRichard namespace std {
589a1d03eSRichard 
689a1d03eSRichard void srand(int seed);
789a1d03eSRichard 
889a1d03eSRichard template <class UIntType, UIntType a, UIntType c, UIntType m>
989a1d03eSRichard struct linear_congruential_engine {
1089a1d03eSRichard   linear_congruential_engine(int _ = 0);
1189a1d03eSRichard   void seed(int _ = 0);
1289a1d03eSRichard };
1389a1d03eSRichard using default_random_engine = linear_congruential_engine<unsigned int, 1, 2, 3>;
1489a1d03eSRichard 
1589a1d03eSRichard using size_t = int;
1689a1d03eSRichard template <class UIntType, size_t w, size_t n, size_t m, size_t r,
1789a1d03eSRichard           UIntType a, size_t u, UIntType d, size_t s,
1889a1d03eSRichard           UIntType b, size_t t,
1989a1d03eSRichard           UIntType c, size_t l, UIntType f>
2089a1d03eSRichard struct mersenne_twister_engine {
2189a1d03eSRichard   mersenne_twister_engine(int _ = 0);
2289a1d03eSRichard   void seed(int _ = 0);
2389a1d03eSRichard };
2489a1d03eSRichard using mt19937 = mersenne_twister_engine<unsigned int, 32, 624, 397, 21, 0x9908b0df, 11, 0xffffffff, 7, 0x9d2c5680, 15, 0xefc60000, 18, 1812433253>;
2589a1d03eSRichard 
2689a1d03eSRichard template <class UIntType, size_t w, size_t s, size_t r>
2789a1d03eSRichard struct subtract_with_carry_engine {
2889a1d03eSRichard   subtract_with_carry_engine(int _ = 0);
2989a1d03eSRichard   void seed(int _ = 0);
3089a1d03eSRichard };
3189a1d03eSRichard using ranlux24_base = subtract_with_carry_engine<unsigned int, 24, 10, 24>;
3289a1d03eSRichard 
3389a1d03eSRichard template <class Engine, size_t p, size_t r>
3489a1d03eSRichard struct discard_block_engine {
3589a1d03eSRichard   discard_block_engine();
3689a1d03eSRichard   discard_block_engine(int _);
3789a1d03eSRichard   void seed();
3889a1d03eSRichard   void seed(int _);
3989a1d03eSRichard };
4089a1d03eSRichard using ranlux24 = discard_block_engine<ranlux24_base, 223, 23>;
4189a1d03eSRichard 
4289a1d03eSRichard template <class Engine, size_t w, class UIntType>
4389a1d03eSRichard struct independent_bits_engine {
4489a1d03eSRichard   independent_bits_engine();
4589a1d03eSRichard   independent_bits_engine(int _);
4689a1d03eSRichard   void seed();
4789a1d03eSRichard   void seed(int _);
4889a1d03eSRichard };
4989a1d03eSRichard using independent_bits = independent_bits_engine<ranlux24_base, 223, int>;
5089a1d03eSRichard 
5189a1d03eSRichard template <class Engine, size_t k>
5289a1d03eSRichard struct shuffle_order_engine {
5389a1d03eSRichard   shuffle_order_engine();
5489a1d03eSRichard   shuffle_order_engine(int _);
5589a1d03eSRichard   void seed();
5689a1d03eSRichard   void seed(int _);
5789a1d03eSRichard };
5889a1d03eSRichard using shuffle_order = shuffle_order_engine<ranlux24_base, 223>;
5989a1d03eSRichard 
6089a1d03eSRichard struct random_device {
6189a1d03eSRichard   random_device();
6289a1d03eSRichard   int operator()();
6389a1d03eSRichard };
6489a1d03eSRichard } // namespace std
6589a1d03eSRichard 
6689a1d03eSRichard using time_t = unsigned int;
6789a1d03eSRichard time_t time(time_t *t);
6889a1d03eSRichard 
f()6989a1d03eSRichard void f() {
7089a1d03eSRichard   const int seed = 2;
7189a1d03eSRichard   time_t t;
7289a1d03eSRichard 
7389a1d03eSRichard   std::srand(0);
7489a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: random number generator seeded with a constant value will generate a predictable sequence of values [cert-msc51-cpp]
7589a1d03eSRichard   std::srand(seed);
7689a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: random number generator seeded with a constant value will generate a predictable sequence of values [cert-msc51-cpp]
7789a1d03eSRichard   std::srand(time(&t));
7889a1d03eSRichard   // 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]
7989a1d03eSRichard 
8089a1d03eSRichard   // One instantiation for every engine
8189a1d03eSRichard   std::default_random_engine engine1;
8289a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:30: warning: random number generator seeded with a default argument will generate a predictable sequence of values [cert-msc51-cpp]
8389a1d03eSRichard   std::default_random_engine engine2(1);
8489a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:30: warning: random number generator seeded with a constant value will generate a predictable sequence of values [cert-msc51-cpp]
8589a1d03eSRichard   std::default_random_engine engine3(seed);
8689a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:30: warning: random number generator seeded with a constant value will generate a predictable sequence of values [cert-msc51-cpp]
8789a1d03eSRichard   std::default_random_engine engine4(time(&t));
8889a1d03eSRichard   // 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]
8989a1d03eSRichard   engine1.seed();
9089a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:11: warning: random number generator seeded with a default argument will generate a predictable sequence of values [cert-msc51-cpp]
9189a1d03eSRichard   engine1.seed(1);
9289a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:11: warning: random number generator seeded with a constant value will generate a predictable sequence of values [cert-msc51-cpp]
9389a1d03eSRichard   engine1.seed(seed);
9489a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:11: warning: random number generator seeded with a constant value will generate a predictable sequence of values [cert-msc51-cpp]
9589a1d03eSRichard   engine1.seed(time(&t));
9689a1d03eSRichard   // 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]
9789a1d03eSRichard 
9889a1d03eSRichard   std::mt19937 engine5;
9989a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: random number generator seeded with a default argument will generate a predictable sequence of values [cert-msc51-cpp]
10089a1d03eSRichard   std::mt19937 engine6(1);
10189a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: random number generator seeded with a constant value will generate a predictable sequence of values [cert-msc51-cpp]
10289a1d03eSRichard   std::mt19937 engine7(seed);
10389a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: random number generator seeded with a constant value will generate a predictable sequence of values [cert-msc51-cpp]
10489a1d03eSRichard   std::mt19937 engine8(time(&t));
10589a1d03eSRichard   // 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]
10689a1d03eSRichard   engine5.seed();
10789a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:11: warning: random number generator seeded with a default argument will generate a predictable sequence of values [cert-msc51-cpp]
10889a1d03eSRichard   engine5.seed(1);
10989a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:11: warning: random number generator seeded with a constant value will generate a predictable sequence of values [cert-msc51-cpp]
11089a1d03eSRichard   engine5.seed(seed);
11189a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:11: warning: random number generator seeded with a constant value will generate a predictable sequence of values [cert-msc51-cpp]
11289a1d03eSRichard   engine5.seed(time(&t));
11389a1d03eSRichard   // 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]
11489a1d03eSRichard 
11589a1d03eSRichard   std::ranlux24_base engine9;
11689a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:22: warning: random number generator seeded with a default argument will generate a predictable sequence of values [cert-msc51-cpp]
11789a1d03eSRichard   std::ranlux24_base engine10(1);
11889a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:22: warning: random number generator seeded with a constant value will generate a predictable sequence of values [cert-msc51-cpp]
11989a1d03eSRichard   std::ranlux24_base engine11(seed);
12089a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:22: warning: random number generator seeded with a constant value will generate a predictable sequence of values [cert-msc51-cpp]
12189a1d03eSRichard   std::ranlux24_base engine12(time(&t));
12289a1d03eSRichard   // 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]
12389a1d03eSRichard   engine9.seed();
12489a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:11: warning: random number generator seeded with a default argument will generate a predictable sequence of values [cert-msc51-cpp]
12589a1d03eSRichard   engine9.seed(1);
12689a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:11: warning: random number generator seeded with a constant value will generate a predictable sequence of values [cert-msc51-cpp]
12789a1d03eSRichard   engine9.seed(seed);
12889a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:11: warning: random number generator seeded with a constant value will generate a predictable sequence of values [cert-msc51-cpp]
12989a1d03eSRichard   engine9.seed(time(&t));
13089a1d03eSRichard   // 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]
13189a1d03eSRichard 
13289a1d03eSRichard   std::ranlux24 engine13;
13389a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:17: warning: random number generator seeded with a default argument will generate a predictable sequence of values [cert-msc51-cpp]
13489a1d03eSRichard   std::ranlux24 engine14(1);
13589a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:17: warning: random number generator seeded with a constant value will generate a predictable sequence of values [cert-msc51-cpp]
13689a1d03eSRichard   std::ranlux24 engine15(seed);
13789a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:17: warning: random number generator seeded with a constant value will generate a predictable sequence of values [cert-msc51-cpp]
13889a1d03eSRichard   std::ranlux24 engine16(time(&t));
13989a1d03eSRichard   // 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]
14089a1d03eSRichard   engine13.seed();
14189a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: random number generator seeded with a default argument will generate a predictable sequence of values [cert-msc51-cpp]
14289a1d03eSRichard   engine13.seed(1);
14389a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: random number generator seeded with a constant value will generate a predictable sequence of values [cert-msc51-cpp]
14489a1d03eSRichard   engine13.seed(seed);
14589a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: random number generator seeded with a constant value will generate a predictable sequence of values [cert-msc51-cpp]
14689a1d03eSRichard   engine13.seed(time(&t));
14789a1d03eSRichard   // 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]
14889a1d03eSRichard 
14989a1d03eSRichard   std::independent_bits engine17;
15089a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:25: warning: random number generator seeded with a default argument will generate a predictable sequence of values [cert-msc51-cpp]
15189a1d03eSRichard   std::independent_bits engine18(1);
15289a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:25: warning: random number generator seeded with a constant value will generate a predictable sequence of values [cert-msc51-cpp]
15389a1d03eSRichard   std::independent_bits engine19(seed);
15489a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:25: warning: random number generator seeded with a constant value will generate a predictable sequence of values [cert-msc51-cpp]
15589a1d03eSRichard   std::independent_bits engine20(time(&t));
15689a1d03eSRichard   // 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]
15789a1d03eSRichard   engine17.seed();
15889a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: random number generator seeded with a default argument will generate a predictable sequence of values [cert-msc51-cpp]
15989a1d03eSRichard   engine17.seed(1);
16089a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: random number generator seeded with a constant value will generate a predictable sequence of values [cert-msc51-cpp]
16189a1d03eSRichard   engine17.seed(seed);
16289a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: random number generator seeded with a constant value will generate a predictable sequence of values [cert-msc51-cpp]
16389a1d03eSRichard   engine17.seed(time(&t));
16489a1d03eSRichard   // 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]
16589a1d03eSRichard 
16689a1d03eSRichard   std::shuffle_order engine21;
16789a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:22: warning: random number generator seeded with a default argument will generate a predictable sequence of values [cert-msc51-cpp]
16889a1d03eSRichard   std::shuffle_order engine22(1);
16989a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:22: warning: random number generator seeded with a constant value will generate a predictable sequence of values [cert-msc51-cpp]
17089a1d03eSRichard   std::shuffle_order engine23(seed);
17189a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:22: warning: random number generator seeded with a constant value will generate a predictable sequence of values [cert-msc51-cpp]
17289a1d03eSRichard   std::shuffle_order engine24(time(&t));
17389a1d03eSRichard   // 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]
17489a1d03eSRichard   engine21.seed();
17589a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: random number generator seeded with a default argument will generate a predictable sequence of values [cert-msc51-cpp]
17689a1d03eSRichard   engine21.seed(1);
17789a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: random number generator seeded with a constant value will generate a predictable sequence of values [cert-msc51-cpp]
17889a1d03eSRichard   engine21.seed(seed);
17989a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: random number generator seeded with a constant value will generate a predictable sequence of values [cert-msc51-cpp]
18089a1d03eSRichard   engine21.seed(time(&t));
18189a1d03eSRichard   // 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]
18289a1d03eSRichard }
18389a1d03eSRichard 
18489a1d03eSRichard struct A {
18589a1d03eSRichard   A(int _ = 0);
18689a1d03eSRichard   void seed(int _ = 0);
18789a1d03eSRichard };
18889a1d03eSRichard 
g()18989a1d03eSRichard void g() {
19089a1d03eSRichard   int n = 1;
19189a1d03eSRichard   std::default_random_engine engine1(n);
19289a1d03eSRichard   std::mt19937 engine2(n);
19389a1d03eSRichard   std::ranlux24_base engine3(n);
19489a1d03eSRichard   std::ranlux24 engine4(n);
19589a1d03eSRichard   std::independent_bits engine5(n);
19689a1d03eSRichard   std::shuffle_order engine6(n);
19789a1d03eSRichard 
19889a1d03eSRichard   std::random_device dev;
19989a1d03eSRichard   std::default_random_engine engine7(dev());
20089a1d03eSRichard   std::mt19937 engine8(dev());
20189a1d03eSRichard   std::ranlux24_base engine9(dev());
20289a1d03eSRichard   std::ranlux24 engine10(dev());
20389a1d03eSRichard   std::independent_bits engine11(dev());
20489a1d03eSRichard   std::shuffle_order engine12(dev());
20589a1d03eSRichard 
20689a1d03eSRichard   A a1;
20789a1d03eSRichard   A a2(1);
20889a1d03eSRichard   a1.seed();
20989a1d03eSRichard   a1.seed(1);
21089a1d03eSRichard   a1.seed(n);
21189a1d03eSRichard }
212