Commit-ID: 3c755dac88039b718d52ef56e8f74b5f65f3b55b
Gitweb: http://repo.or.cz/w/nasm.git?a=commitdiff;h=3c755dac88039b718d52ef56e8f74b5f65f3b55b
Author: Cyrill Gorcunov <gor...@gm...>
AuthorDate: Sat, 13 Oct 2018 22:57:30 +0300
Committer: Cyrill Gorcunov <gor...@gm...>
CommitDate: Sat, 13 Oct 2018 22:57:30 +0300
opflags: Convert is_class and is_reg_class to helpers
So we can test for out of bound access and make
helpers safe to use.
https://bugzilla.nasm.us/show_bug.cgi?id=3392447
Reported-by: Jun <jx...@ps...>
Signed-off-by: Cyrill Gorcunov <gor...@gm...>
---
include/opflags.h | 14 ++++++++++++--
1 file changed, 12 insertions(+), 2 deletions(-)
diff --git a/include/opflags.h b/include/opflags.h
index 8311dcf..28bb236 100644
--- a/include/opflags.h
+++ b/include/opflags.h
@@ -40,6 +40,7 @@
#include "compiler.h"
#include "tables.h" /* for opflags_t and nasm_reg_flags[] */
+#include "regs.h"
/*
* Here we define the operand types. These are implemented as bit
@@ -176,8 +177,17 @@
#define REG_CLASS_OPMASK GEN_REG_CLASS(8)
#define REG_CLASS_BND GEN_REG_CLASS(9)
-#define is_class(class, op) (!((opflags_t)(class) & ~(opflags_t)(op)))
-#define is_reg_class(class, reg) is_class((class), nasm_reg_flags[(reg)])
+static inline bool is_class(opflags_t class, opflags_t op)
+{
+ return !(class & ~op);
+}
+
+static inline bool is_reg_class(opflags_t class, opflags_t reg)
+{
+ if (reg >= EXPR_REG_START && reg <= EXPR_REG_END)
+ return is_class(class, nasm_reg_flags[reg]);
+ return false;
+}
#define IS_SREG(reg) is_reg_class(REG_SREG, (reg))
#define IS_FSGS(reg) is_reg_class(REG_FSGS, (reg))
|