root/Zend/zend_range_check.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


   1 /*
   2    +----------------------------------------------------------------------+
   3    | Zend Engine                                                          |
   4    +----------------------------------------------------------------------+
   5    | Copyright (c) 1998-2016 Zend Technologies Ltd. (http://www.zend.com) |
   6    +----------------------------------------------------------------------+
   7    | This source file is subject to version 2.00 of the Zend license,     |
   8    | that is bundled with this package in the file LICENSE, and is        |
   9    | available through the world-wide-web at the following url:           |
  10    | http://www.zend.com/license/2_00.txt.                                |
  11    | If you did not receive a copy of the Zend license and are unable to  |
  12    | obtain it through the world-wide-web, please send a note to          |
  13    | license@zend.com so we can mail you a copy immediately.              |
  14    +----------------------------------------------------------------------+
  15    | Authors: Anatol Belski <ab@php.net>                                  |
  16    +----------------------------------------------------------------------+
  17 */
  18 
  19 #ifndef ZEND_RANGE_CHECK_H
  20 #define ZEND_RANGE_CHECK_H
  21 
  22 #include "zend_long.h"
  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 #endif /* ZEND_RANGE_CHECK_H */
  68 
  69 /*
  70  * Local variables:
  71  * tab-width: 4
  72  * c-basic-offset: 4
  73  * indent-tabs-mode: t
  74  * End:
  75  */

/* [<][>][^][v][top][bottom][index][help] */