212 lines · cpp
1// RUN: %check_clang_tidy %s bugprone-random-generator-seed %t -- \2// RUN: -config="{CheckOptions: {bugprone-random-generator-seed.DisallowedSeedTypes: 'some_type,time_t'}}"3 4namespace std {5 6void srand(int seed);7 8template <class UIntType, UIntType a, UIntType c, UIntType m>9struct linear_congruential_engine {10 linear_congruential_engine(int _ = 0);11 void seed(int _ = 0);12};13using default_random_engine = linear_congruential_engine<unsigned int, 1, 2, 3>;14 15using size_t = int;16template <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>20struct mersenne_twister_engine {21 mersenne_twister_engine(int _ = 0);22 void seed(int _ = 0);23};24using mt19937 = mersenne_twister_engine<unsigned int, 32, 624, 397, 21, 0x9908b0df, 11, 0xffffffff, 7, 0x9d2c5680, 15, 0xefc60000, 18, 1812433253>;25 26template <class UIntType, size_t w, size_t s, size_t r>27struct subtract_with_carry_engine {28 subtract_with_carry_engine(int _ = 0);29 void seed(int _ = 0);30};31using ranlux24_base = subtract_with_carry_engine<unsigned int, 24, 10, 24>;32 33template <class Engine, size_t p, size_t r>34struct discard_block_engine {35 discard_block_engine();36 discard_block_engine(int _);37 void seed();38 void seed(int _);39};40using ranlux24 = discard_block_engine<ranlux24_base, 223, 23>;41 42template <class Engine, size_t w, class UIntType>43struct independent_bits_engine {44 independent_bits_engine();45 independent_bits_engine(int _);46 void seed();47 void seed(int _);48};49using independent_bits = independent_bits_engine<ranlux24_base, 223, int>;50 51template <class Engine, size_t k>52struct shuffle_order_engine {53 shuffle_order_engine();54 shuffle_order_engine(int _);55 void seed();56 void seed(int _);57};58using shuffle_order = shuffle_order_engine<ranlux24_base, 223>;59 60struct random_device {61 random_device();62 int operator()();63};64} // namespace std65 66using time_t = unsigned int;67time_t time(time_t *t);68 69void 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 [bugprone-random-generator-seed]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 [bugprone-random-generator-seed]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 [bugprone-random-generator-seed]79 80 // One instantiation for every engine81 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 [bugprone-random-generator-seed]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 [bugprone-random-generator-seed]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 [bugprone-random-generator-seed]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 [bugprone-random-generator-seed]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 [bugprone-random-generator-seed]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 [bugprone-random-generator-seed]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 [bugprone-random-generator-seed]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 [bugprone-random-generator-seed]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 [bugprone-random-generator-seed]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 [bugprone-random-generator-seed]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 [bugprone-random-generator-seed]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 [bugprone-random-generator-seed]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 [bugprone-random-generator-seed]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 [bugprone-random-generator-seed]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 [bugprone-random-generator-seed]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 [bugprone-random-generator-seed]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 [bugprone-random-generator-seed]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 [bugprone-random-generator-seed]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 [bugprone-random-generator-seed]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 [bugprone-random-generator-seed]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 [bugprone-random-generator-seed]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 [bugprone-random-generator-seed]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 [bugprone-random-generator-seed]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 [bugprone-random-generator-seed]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 [bugprone-random-generator-seed]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 [bugprone-random-generator-seed]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 [bugprone-random-generator-seed]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 [bugprone-random-generator-seed]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 [bugprone-random-generator-seed]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 [bugprone-random-generator-seed]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 [bugprone-random-generator-seed]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 [bugprone-random-generator-seed]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 [bugprone-random-generator-seed]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 [bugprone-random-generator-seed]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 [bugprone-random-generator-seed]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 [bugprone-random-generator-seed]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 [bugprone-random-generator-seed]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 [bugprone-random-generator-seed]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 [bugprone-random-generator-seed]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 [bugprone-random-generator-seed]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 [bugprone-random-generator-seed]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 [bugprone-random-generator-seed]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 [bugprone-random-generator-seed]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 [bugprone-random-generator-seed]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 [bugprone-random-generator-seed]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 [bugprone-random-generator-seed]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 [bugprone-random-generator-seed]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 [bugprone-random-generator-seed]182}183 184struct A {185 A(int _ = 0);186 void seed(int _ = 0);187};188 189void 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