File tree Expand file tree Collapse file tree 1 file changed +25
-0
lines changed Expand file tree Collapse file tree 1 file changed +25
-0
lines changed Original file line number Diff line number Diff line change 113
113
#define unsigned_mult_overflows (a , b ) \
114
114
((a) && (b) > maximum_unsigned_value_of_type(a) / (a))
115
115
116
+ /*
117
+ * Returns true if the left shift of "a" by "shift" bits will
118
+ * overflow. The type of "a" must be unsigned.
119
+ */
120
+ #define unsigned_left_shift_overflows (a , shift ) \
121
+ ((shift) < bitsizeof(a) && \
122
+ (a) > maximum_unsigned_value_of_type(a) >> (shift))
123
+
116
124
#ifdef __GNUC__
117
125
#define TYPEOF (x ) (__typeof__(x))
118
126
#else
@@ -859,6 +867,23 @@ static inline size_t st_sub(size_t a, size_t b)
859
867
return a - b ;
860
868
}
861
869
870
+ static inline size_t st_left_shift (size_t a , unsigned shift )
871
+ {
872
+ if (unsigned_left_shift_overflows (a , shift ))
873
+ die ("size_t overflow: %" PRIuMAX " << %u" ,
874
+ (uintmax_t )a , shift );
875
+ return a << shift ;
876
+ }
877
+
878
+ static inline unsigned long cast_size_t_to_ulong (size_t a )
879
+ {
880
+ if (a != (unsigned long )a )
881
+ die ("object too large to read on this platform: %"
882
+ PRIuMAX " is cut off to %lu" ,
883
+ (uintmax_t )a , (unsigned long )a );
884
+ return (unsigned long )a ;
885
+ }
886
+
862
887
#ifdef HAVE_ALLOCA_H
863
888
# include <alloca.h>
864
889
# define xalloca (size ) (alloca(size))
You can’t perform that action at this time.
0 commit comments