[前][次][番号順一覧][スレッド一覧]

ruby-changes:56827

From: Nobuyoshi <ko1@a...>
Date: Mon, 5 Aug 2019 23:27:51 +0900 (JST)
Subject: [ruby-changes:56827] Nobuyoshi Nakada: fb9dd6182a (master): Use negative-sized array instead of zero-division

https://git.ruby-lang.org/ruby.git/commit/?id=fb9dd6182a

From fb9dd6182af1b0c1275d6d579cb53d6dac5eda5c Mon Sep 17 00:00:00 2001
From: Nobuyoshi Nakada <nobu@r...>
Date: Mon, 5 Aug 2019 13:43:22 +0900
Subject: Use negative-sized array instead of zero-division


diff --git a/include/ruby/ruby.h b/include/ruby/ruby.h
index 7eb6b30..86d4c39 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 https://github.com/ruby/ruby/blob/trunk/include/ruby/ruby.h#L2336
 #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 https://github.com/ruby/ruby/blob/trunk/include/ruby/ruby.h#L2370
       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));
-- 
cgit v0.10.2


--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]