[Anthy-dev 1982] isdigitの引数の型

Back to archive index

Masanari Yamamoto h0131****@ice*****
2005年 3月 22日 (火) 02:22:33 JST


skk-dic.cのskk_replace_numericで、str[i]が数字でないのにisdigitが真に
なってしまうバグがありました。str[i]が負になっていたことが原因でした。

isdigitなどctype.hのマクロの引数は-1〜255でなければならないそうです
(man isdigit)。この引数の型がcharの場合、-128〜127の値になるので、誤動
作を起こすことがあります。

isalnum, isalpha, isascii, isblank, iscntrl, isdigit, isgraph,
islower, isprint, ispunct, isspace, isupper, isxdigit
これらのマクロを使う場合は
isdigit((unsigned char)c)
のようにunsigned charにキャストする必要がありそうです。


これらのマクロが使われている場所をgrepしました。

uim/slib.c: *end && isalnum (*end);
uim/agent.c:    if (isalpha(buf[0])) {
uim/skk-dic.c:  if (isalpha(*b)) {
fep/str.c:    if (isascii(*str)) {
fep/str.c:    if (isascii(*str)) {
fep/str.c:    if (isascii(*str)) {
fep/str.c:    if (isascii(*str)) {
fep/str.c:    if (isascii(*str)) {
fep/escseq.c:  while (isdigit(n2[0])) {
fep/escseq.c:  while (isdigit(n2[0])) {
fep/escseq.c:  while (isdigit(n2[0])) {
fep/escseq.c:      while (isdigit(str[0]) || str[0] == ';') {
fep/escseq.c:        if (isdigit(str[0])) {
fep/escseq.c:          while (isdigit(str[0])) {
fep/escseq.c:      while (isdigit(escseq[++i2]));
fep/uim-fep.c:      for (end = len - 1; end >= 0 && !isdigit(buf[end]); --end);
fep/uim-fep.c:        for (start = end; start > 0 && isdigit(buf[start - 1]); --start);
uim/skk-dic.c:    if (isdigit(str[i])) {
uim/skk-dic.c:    if (isdigit(str[i])) {
uim/skk-dic.c:      if (cand[i] == '#' && isdigit(cand[i + 1])) {
uim/slib.c:  while (isdigit (*p))
uim/slib.c:      while (isdigit (*p))
uim/slib.c:      if (!isdigit (*p))
uim/slib.c:      while (isdigit (*p))
uim/uim-scm.c:    if (isdigit(verbose_level[0])) {
uim/uim-scm.c:      if (isdigit(verbose_level[1]))
helper/pref-gtk-custom-widgets.c:  if (((keyval >= 256) || !g_ascii_isgraph(keyval)) &&
uim/skk-dic.c:  if (!islower(buf[0]) && islower(sep[-1])) { /* okuri-ari entry */
uim/slib.c:      else if (!isspace (c))
uim/slib.c:      if (isspace (c))

-- 
山本将也



Anthy-dev メーリングリストの案内
Back to archive index