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)) -- 山本将也