|
21 | 21 |
|
22 | 22 | #include "zend_long.h" |
23 | 23 |
|
24 | | -/* Flag macros for basic range recognition. Notable is that |
25 | | - always sizeof(signed) == sizeof(unsigned), so no need to |
26 | | - overcomplicate things. */ |
27 | | -#if SIZEOF_INT < SIZEOF_ZEND_LONG |
28 | | -# define ZEND_LONG_CAN_OVFL_INT 1 |
29 | | -# define ZEND_LONG_CAN_OVFL_UINT 1 |
30 | | -#endif |
31 | | - |
32 | | -#if SIZEOF_INT < SIZEOF_SIZE_T |
33 | | -/* size_t can always overflow signed int on the same platform. |
34 | | - Furthermore, by the current design, size_t can always |
35 | | - overflow zend_long. */ |
36 | | -# define ZEND_SIZE_T_CAN_OVFL_UINT 1 |
37 | | -#endif |
38 | | - |
39 | | - |
40 | | -/* zend_long vs. (unsigned) int checks. */ |
41 | | -#ifdef ZEND_LONG_CAN_OVFL_INT |
42 | | -# define ZEND_LONG_INT_OVFL(zlong) UNEXPECTED((zlong) > (zend_long)INT_MAX) |
43 | | -# define ZEND_LONG_INT_UDFL(zlong) UNEXPECTED((zlong) < (zend_long)INT_MIN) |
44 | | -# define ZEND_LONG_EXCEEDS_INT(zlong) UNEXPECTED(ZEND_LONG_INT_OVFL(zlong) || ZEND_LONG_INT_UDFL(zlong)) |
45 | | -# define ZEND_LONG_UINT_OVFL(zlong) UNEXPECTED((zlong) < 0 || (zlong) > (zend_long)UINT_MAX) |
46 | | -#else |
47 | | -# define ZEND_LONG_INT_OVFL(zl) (0) |
48 | | -# define ZEND_LONG_INT_UDFL(zl) (0) |
49 | | -# define ZEND_LONG_EXCEEDS_INT(zlong) (0) |
50 | | -# define ZEND_LONG_UINT_OVFL(zl) (0) |
51 | | -#endif |
52 | | - |
53 | | -/* size_t vs (unsigned) int checks. */ |
54 | | -#define ZEND_SIZE_T_INT_OVFL(size) UNEXPECTED((size) > (size_t)INT_MAX) |
55 | | -#ifdef ZEND_SIZE_T_CAN_OVFL_UINT |
56 | | -# define ZEND_SIZE_T_UINT_OVFL(size) UNEXPECTED((size) > (size_t)UINT_MAX) |
57 | | -#else |
58 | | -# define ZEND_SIZE_T_UINT_OVFL(size) (0) |
59 | | -#endif |
60 | | - |
61 | | -/* Comparison zend_long vs size_t */ |
62 | | -#define ZEND_SIZE_T_GT_ZEND_LONG(size, zlong) ((zlong) < 0 || (size) > (size_t)(zlong)) |
63 | | -#define ZEND_SIZE_T_GTE_ZEND_LONG(size, zlong) ((zlong) < 0 || (size) >= (size_t)(zlong)) |
64 | | -#define ZEND_SIZE_T_LT_ZEND_LONG(size, zlong) ((zlong) >= 0 && (size) < (size_t)(zlong)) |
65 | | -#define ZEND_SIZE_T_LTE_ZEND_LONG(size, zlong) ((zlong) >= 0 && (size) <= (size_t)(zlong)) |
66 | | - |
67 | 24 | /* _ZEND_INT_TYPE_CHECK(T): the integer constant 0, |
68 | 25 | * or a compile error unless T is an integer type not wider than intmax_t. */ |
69 | 26 | #ifndef __cplusplus |
@@ -166,4 +123,37 @@ extern "C++" { |
166 | 123 | # define ZEND_IN_RANGE_OF(x, T) EXPECTED(_zend_in_range_of<T>(+(x))) |
167 | 124 | #endif |
168 | 125 |
|
| 126 | +/* Comparison zend_long vs size_t */ |
| 127 | +#define ZEND_SIZE_T_GT_ZEND_LONG(size, zlong) ((zlong) < 0 || (size) > (size_t)(zlong)) |
| 128 | +#define ZEND_SIZE_T_GTE_ZEND_LONG(size, zlong) ((zlong) < 0 || (size) >= (size_t)(zlong)) |
| 129 | +#define ZEND_SIZE_T_LT_ZEND_LONG(size, zlong) ((zlong) >= 0 && (size) < (size_t)(zlong)) |
| 130 | +#define ZEND_SIZE_T_LTE_ZEND_LONG(size, zlong) ((zlong) >= 0 && (size) <= (size_t)(zlong)) |
| 131 | + |
| 132 | +/* -- DEPRECATED -- */ |
| 133 | + |
| 134 | +/* The zend_long and size_t vs. (unsigned) int checks below are deprecated, use ZEND_IN_RANGE_OF() instead. */ |
| 135 | +static inline ZEND_ATTRIBUTE_DEPRECATED void _zend_deprecated_use_ZEND_IN_RANGE_OF_instead(void) {} |
| 136 | + |
| 137 | +#if SIZEOF_INT < SIZEOF_ZEND_LONG |
| 138 | +# define ZEND_LONG_CAN_OVFL_INT 1 /* Deprecated */ |
| 139 | +# define ZEND_LONG_CAN_OVFL_UINT 1 /* Deprecated */ |
| 140 | +# define ZEND_LONG_INT_OVFL(zlong) (_zend_deprecated_use_ZEND_IN_RANGE_OF_instead(), UNEXPECTED((zlong) > (zend_long)INT_MAX)) |
| 141 | +# define ZEND_LONG_INT_UDFL(zlong) (_zend_deprecated_use_ZEND_IN_RANGE_OF_instead(), UNEXPECTED((zlong) < (zend_long)INT_MIN)) |
| 142 | +# define ZEND_LONG_EXCEEDS_INT(zlong) (_zend_deprecated_use_ZEND_IN_RANGE_OF_instead(), UNEXPECTED((zlong) > (zend_long)INT_MAX || (zlong) < (zend_long)INT_MIN)) |
| 143 | +# define ZEND_LONG_UINT_OVFL(zlong) (_zend_deprecated_use_ZEND_IN_RANGE_OF_instead(), UNEXPECTED((zlong) < 0 || (zlong) > (zend_long)UINT_MAX)) |
| 144 | +#else |
| 145 | +# define ZEND_LONG_INT_OVFL(zl) (_zend_deprecated_use_ZEND_IN_RANGE_OF_instead(), 0) |
| 146 | +# define ZEND_LONG_INT_UDFL(zl) (_zend_deprecated_use_ZEND_IN_RANGE_OF_instead(), 0) |
| 147 | +# define ZEND_LONG_EXCEEDS_INT(zlong) (_zend_deprecated_use_ZEND_IN_RANGE_OF_instead(), 0) |
| 148 | +# define ZEND_LONG_UINT_OVFL(zl) (_zend_deprecated_use_ZEND_IN_RANGE_OF_instead(), 0) |
| 149 | +#endif |
| 150 | + |
| 151 | +#define ZEND_SIZE_T_INT_OVFL(size) (_zend_deprecated_use_ZEND_IN_RANGE_OF_instead(), UNEXPECTED((size) > (size_t)INT_MAX)) |
| 152 | +#if SIZEOF_INT < SIZEOF_SIZE_T |
| 153 | +# define ZEND_SIZE_T_CAN_OVFL_UINT 1 /* Deprecated */ |
| 154 | +# define ZEND_SIZE_T_UINT_OVFL(size) (_zend_deprecated_use_ZEND_IN_RANGE_OF_instead(), UNEXPECTED((size) > (size_t)UINT_MAX)) |
| 155 | +#else |
| 156 | +# define ZEND_SIZE_T_UINT_OVFL(size) (_zend_deprecated_use_ZEND_IN_RANGE_OF_instead(), 0) |
| 157 | +#endif |
| 158 | + |
169 | 159 | #endif /* ZEND_RANGE_CHECK_H */ |
0 commit comments