aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite/gcc.c-torture/execute/builtins/strnlen.c
blob: 46a04a79ee247c57584bc3effb49a423a0a209ac (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
/* PR tree-optimization/81384 - built-in form of strnlen missing
   Test to verify that strnlen built-in expansion works correctly.  */

#define PTRDIFF_MAX __PTRDIFF_MAX__
#define SIZE_MAX    __SIZE_MAX__
#define NOIPA __attribute__ ((noipa))

typedef __SIZE_TYPE__ size_t;

extern void abort (void);
extern size_t strnlen (const char *, size_t);

#define A(expr)							\
  ((expr) ? (void)0						\
   : (__builtin_printf ("assertion on line %i failed: %s\n",	\
			__LINE__, #expr),			\
      abort ()))

NOIPA void test_strnlen_str_cst (void)
{
  A (strnlen ("", 0) == 0);
  A (strnlen ("", 1) == 0);
  A (strnlen ("", 9) == 0);
  A (strnlen ("", PTRDIFF_MAX) == 0);
  A (strnlen ("", SIZE_MAX) == 0);
  A (strnlen ("", -1) == 0);

  A (strnlen ("1", 0) == 0);
  A (strnlen ("1", 1) == 1);
  A (strnlen ("1", 9) == 1);
  A (strnlen ("1", PTRDIFF_MAX) == 1);
  A (strnlen ("1", SIZE_MAX) == 1);
  A (strnlen ("1", -2) == 1);

  A (strnlen ("123", 0) == 0);
  A (strnlen ("123", 1) == 1);
  A (strnlen ("123", 2) == 2);
  A (strnlen ("123", 3) == 3);
  A (strnlen ("123", 9) == 3);
  A (strnlen ("123", PTRDIFF_MAX) == 3);
  A (strnlen ("123", SIZE_MAX) == 3);
  A (strnlen ("123", -2) == 3);
}

NOIPA void test_strnlen_str_range (size_t x)
{
  size_t r_0_3 = x & 3;
  size_t r_1_3 = r_0_3 | 1;
  size_t r_2_3 = r_0_3 | 2;

  A (strnlen ("",     r_0_3) == 0);
  A (strnlen ("1",    r_0_3) <= 1);
  A (strnlen ("12",   r_0_3) <= 2);
  A (strnlen ("123",  r_0_3) <= 3);
  A (strnlen ("1234", r_0_3) <= 3);

  A (strnlen ("",     r_1_3) == 0);
  A (strnlen ("1",    r_1_3) == 1);
  A (strnlen ("12",   r_1_3) <= 2);
  A (strnlen ("123",  r_1_3) <= 3);
  A (strnlen ("1234", r_1_3) <= 3);

  A (strnlen ("",     r_2_3) == 0);
  A (strnlen ("1",    r_2_3) == 1);
  A (strnlen ("12",   r_2_3) == 2);
  A (strnlen ("123",  r_2_3) <= 3);
  A (strnlen ("1234", r_2_3) <= 3);
}

NOIPA void test_strnlen_str_range_side_effect (size_t x)
{
  size_t r_0_3 = x & 3;
  size_t r_1_3 = r_0_3 | 1;
  size_t r_2_3 = r_0_3 | 2;
  size_t n = r_2_3;

  int i = 0;

  A (strnlen ("1234" + i++, n) <= 3);
  A (i == 1);

  A (strnlen ("1234", n++) <= 3);
  A (n == r_2_3 + 1);
}

void
main_test (void)
{
  test_strnlen_str_cst ();
  test_strnlen_str_range ((size_t)"");
  test_strnlen_str_range_side_effect ((size_t)"");
}