diff options
author | Nobuyoshi Nakada <[email protected]> | 2019-08-05 13:43:22 +0900 |
---|---|---|
committer | Nobuyoshi Nakada <[email protected]> | 2019-08-05 23:26:19 +0900 |
commit | fb9dd6182af1b0c1275d6d579cb53d6dac5eda5c (patch) | |
tree | 4975ed470a1850cfc25010840be17a7c7e8456d6 /include/ruby/ruby.h | |
parent | 4c15b241f8e83696ae104ad141ba990adf833309 (diff) |
Use negative-sized array instead of zero-division
Diffstat (limited to 'include/ruby/ruby.h')
-rw-r--r-- | include/ruby/ruby.h | 28 |
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)); |