(root)/
gettext-0.22.4/
gettext-tools/
gnulib-tests/
test-random_r.c
       1  /* Test random_r.
       2     Copyright (C) 2008-2023 Free Software Foundation, Inc.
       3  
       4     This program is free software: you can redistribute it and/or modify
       5     it under the terms of the GNU General Public License as published by
       6     the Free Software Foundation, either version 3 of the License, or
       7     (at your option) any later version.
       8  
       9     This program is distributed in the hope that it will be useful,
      10     but WITHOUT ANY WARRANTY; without even the implied warranty of
      11     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      12     GNU General Public License for more details.
      13  
      14     You should have received a copy of the GNU General Public License
      15     along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
      16  
      17  #include <config.h>
      18  
      19  #include <stdlib.h>
      20  
      21  #include "signature.h"
      22  SIGNATURE_CHECK (srandom_r, int, (unsigned int, struct random_data *));
      23  SIGNATURE_CHECK (initstate_r, int, (unsigned int, char *, size_t,
      24                                      struct random_data *));
      25  SIGNATURE_CHECK (setstate_r, int, (char *, struct random_data *));
      26  SIGNATURE_CHECK (random_r, int, (struct random_data *, int32_t *));
      27  
      28  #include <time.h>
      29  
      30  #include "macros.h"
      31  
      32  /* Note: This test crashes on glibc/SPARC systems.
      33     Reported at <https://sourceware.org/bugzilla/show_bug.cgi?id=30584>.  */
      34  
      35  static int
      36  test_failed (int alignment)
      37  {
      38    struct random_data rand_state;
      39    char buf[128 + sizeof (int32_t)];
      40    unsigned int i;
      41    unsigned int n_big = 0;
      42  
      43    rand_state.state = NULL;
      44    if (initstate_r (time (NULL), buf + alignment, sizeof buf - alignment,
      45                     &rand_state))
      46      return 1;
      47    for (i = 0; i < 1000; i++)
      48      {
      49        int32_t r;
      50        ASSERT (random_r (&rand_state, &r) == 0);
      51        ASSERT (0 <= r);
      52        if (RAND_MAX / 2 < r)
      53          ++n_big;
      54      }
      55  
      56    /* Fail if none of the numbers were larger than RAND_MAX / 2.  */
      57    return !n_big;
      58  }
      59  
      60  int
      61  main ()
      62  {
      63    int alignment;
      64    for (alignment = 0; alignment < sizeof (int32_t); alignment++)
      65      if (test_failed (alignment))
      66        return 1;
      67    return 0;
      68  }