summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorNobuyoshi Nakada <nobu@ruby-lang.org>2019-08-05 13:43:22 +0900
committerNobuyoshi Nakada <nobu@ruby-lang.org>2019-08-05 23:26:19 +0900
commitfb9dd6182af1b0c1275d6d579cb53d6dac5eda5c (patch)
tree4975ed470a1850cfc25010840be17a7c7e8456d6 /include
parent4c15b241f8e83696ae104ad141ba990adf833309 (diff)
Use negative-sized array instead of zero-division
Diffstat (limited to 'include')
-rw-r--r--include/ruby/ruby.h28
1 files changed, 7 insertions, 21 deletions
diff --git a/include/ruby/ruby.h b/include/ruby/ruby.h
index 7eb6b302a0..86d4c391ea 100644
--- a/include/ruby/ruby.h
+++ b/include/ruby/ruby.h
@@ -2336,13 +2336,9 @@ ERRORFUNC(("variable argument length doesn't match"), int rb_scan_args_length_mi
#if !defined(__has_attribute)
#define __has_attribute(x) 0
#endif
-# if __has_attribute(diagnose_if)
-# define rb_scan_args_count_end(fmt, ofs, vari) \
- (fmt[ofs] ? rb_scan_args_bad_format(fmt) : (vari))
-# else
+
# define rb_scan_args_count_end(fmt, ofs, vari) \
- ((vari)/(!fmt[ofs] || rb_scan_args_bad_format(fmt)))
-# endif
+ (fmt[ofs] ? -1 : (vari))
# define rb_scan_args_count_block(fmt, ofs, vari) \
(fmt[ofs]!='&' ? \
@@ -2374,25 +2370,15 @@ ERRORFUNC(("variable argument length doesn't match"), int rb_scan_args_length_mi
rb_scan_args_count_var(fmt, 0, 0) : \
rb_scan_args_count_opt(fmt, 1, fmt[0]-'0'))
-# define rb_scan_args_verify_count(fmt, varc) \
- ((varc)/(rb_scan_args_count(fmt) == (varc) || \
- rb_scan_args_length_mismatch(fmt, varc)))
-
# if defined(__has_attribute) && __has_attribute(diagnose_if)
# define rb_scan_args_verify(fmt, varc) (void)0
-# elif defined(__GNUC__)
-# define rb_scan_args_verify(fmt, varc) \
- (void)__extension__ ({ \
- int verify; \
- _Pragma("GCC diagnostic push"); \
- _Pragma("GCC diagnostic ignored \"-Warray-bounds\""); \
- verify = rb_scan_args_verify_count(fmt, varc); \
- _Pragma("GCC diagnostic pop"); \
- verify; \
- })
# else
# define rb_scan_args_verify(fmt, varc) \
- (void)rb_scan_args_verify_count(fmt, varc)
+ (sizeof(char[1-2*(rb_scan_args_count(fmt)<0)])!=1 ? \
+ rb_scan_args_bad_format(fmt) : \
+ sizeof(char[1-2*(rb_scan_args_count(fmt)!=(varc))])!=1 ? \
+ rb_scan_args_length_mismatch(fmt, varc) : \
+ (int)(varc))
# endif
ALWAYS_INLINE(static int rb_scan_args_lead_p(const char *fmt));