[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[debian-users:45264] Re: 正規表現処理が変になっている環境について



平本です。


In subject: [debian-users:45262] Re: 正規表現処理が変になっている環境について
	dancer@xxxxxxxxxxxxx (Junichi Uekawa) said:

> 手もとでは再現しません.
> 
> 1. 何か環境が問題かもしれないので,
> 下記のバイナリのmd5sumを確認してみてはいかがでしょうか.
> 
> /usr/lib/tls/libc.so.6
> /usr/bin/sed 

  問題のある環境と、別の問題のない環境(coLinux の Debian unstable)
で apt-get update ; apt-get upgrade して比較してみましたが、これは
同じでした。

[問題のある環境]
% ldd /bin/sed
        linux-gate.so.1 =>  (0xffffe000)
        libc.so.6 => /lib/tls/libc.so.6 (0xb7ea9000)
        /lib/ld-linux.so.2 (0xb7feb000)
% ls -l /bin/sed /lib/tls/libc.so.6 /lib/tls/libc-2.3.5.so
-rwxr-xr-x 1 root root   39752 2005-09-07 08:52 /bin/sed*
-rwxr-xr-x 1 root root 1266800 2005-11-13 10:23 /lib/tls/libc-2.3.5.so*
lrwxrwxrwx 1 root root      13 2005-11-14 11:09 /lib/tls/libc.so.6 -> libc-2.3.5.so*
% md5sum /bin/sed /lib/tls/libc.so.6
86ff3d49b5496fa67ca912f5440a5fed  /bin/sed
2558987db486fd3f4011125ed4fd7261  /lib/tls/libc.so.6

[問題のない環境]
% ldd /bin/sed
        linux-gate.so.1 =>  (0xffffe000)
        libc.so.6 => /lib/tls/libc.so.6 (0xb7eaf000)
        /lib/ld-linux.so.2 (0xb7feb000)
% ls -l /bin/sed /lib/tls/libc.so.6 /lib/tls/libc-2.3.5.so
-rwxr-xr-x 1 root root   39752 2005-09-07 08:52 /bin/sed*
-rwxr-xr-x 1 root root 1266800 2005-11-13 10:23 /lib/tls/libc-2.3.5.so*
lrwxr-xr-x 1 root root      13 2005-11-20 14:33 /lib/tls/libc.so.6 -> libc-2.3.5.so*
% md5sum /bin/sed /lib/tls/libc.so.6
86ff3d49b5496fa67ca912f5440a5fed  /bin/sed
2558987db486fd3f4011125ed4fd7261  /lib/tls/libc.so.6


> 2. ltraceでトレースしてみて, その出力
> (おそらく80行くらいなのでまるごとはりつけてもよいと思います)を確認してみてはいかがでしょうか.
> 
> re_set_syntax(0x10502c6, 0, 0x5362e0, 130081, 8)                                    = 0
> re_compile_pattern(0x5362c0, 4, 0x536270, 130081, 8)                                = 0
> re_search(0x536270, 0x5361b0, 3, 0, 3)                                              = 1

% echo A=B | env LC_ALL=C ltrace /bin/sed -e 's/=.*$//' > /dev/null

とした結果を添付します。自分でも比較してみましたが、以下のような違
いがありました。

[問題のある環境]
re_search(0x806e9a0, 0x806e958, 3, 0, 3)         = -1
fwrite("A=B", 1, 3, 0xb7fdc5c0)                  = 3

[問題のない環境]
re_search(0x806e9a0, 0x806e958, 3, 0, 3)         = 1
fwrite("A=B", 1, 1, 0xb7fe25c0)                  = 1

問題のある環境では re_search() での正規表現の検索に失敗して -1 が
返るので、そのため fwrite() で入力された 3文字すべてを出力している、
問題のない環境では検索に成功してインデックス 1 が返ってくるので、
その値を fwrite() の引数に反映させて入力の一部だけを出力している、
という違いがあることまでは分かりました。

  では何故このような違いが出てくるかという話になると、まったく見当
がつきません…
% echo A=B | env LC_ALL=C ltrace /bin/sed -e 's/=.*$//' > /dev/null
__libc_start_main(0x8049600, 3, 0xbffffaf4, 0x804f890, 0x804f900 <unfinished ...>
getenv("COLS")                                   = NULL
setlocale(6, "")                                 = "C"
__ctype_get_mb_cur_max(0xbffffaf4, 3, 0xbffffa78, 0x8049634, 6) = 1
bindtextdomain("sed", "/usr/share/locale")       = "/usr/share/locale"
textdomain("sed")                                = "sed"
getenv("POSIXLY_CORRECT")                        = NULL
getopt_long(3, 0xbffffaf4, "snrue:f:l:i::V:", 0x8052560, NULL) = 101
strlen("s/=.*$//")                               = 8
calloc(1, 12)                                    = 0x8058030
_obstack_begin(0x8052700, 0, 0, 0x804f330, 0x804f520 <unfinished ...>
calloc(1, 4072)                                  = 0x8058040
<... _obstack_begin resumed> )                   = 1
__ctype_b_loc()                                  = 0xb7eae6ac
calloc(1, 960)                                   = 0x8059030
__ctype_b_loc()                                  = 0xb7eae6ac
calloc(1, 12)                                    = 0x80593f8
calloc(1, 50)                                    = 0x8059408
calloc(1, 12)                                    = 0x8059440
calloc(1, 50)                                    = 0x8059450
calloc(1, 1)                                     = 0x8059488
memcpy(0x8059488, "", 0)                         = 0x8059488
free(0x8059450)                                  = <void>
free(0x8059440)                                  = <void>
__ctype_b_loc()                                  = 0xb7eae6ac
calloc(1, 47)                                    = 0x8059450
memcpy(0x8059478, "=.*$", 4)                     = 0x8059478
malloc(256)                                      = 0x8059498
re_set_syntax(0x10502c6, 0xd696913, 0xb8000ff4, 0xb80016b4, 0xbffff8e4) = 0
re_compile_pattern(0x8059478, 4, 0x8059450, 0xb80016b4, 0xbffff8e4) = 0
free(0x8059408)                                  = <void>
free(0x80593f8)                                  = <void>
__ctype_b_loc()                                  = 0xb7eae6ac
getopt_long(3, 0xbffffaf4, "snrue:f:l:i::V:", 0x8052560, NULL) = -1
calloc(1, 50)                                    = 0x8059408
calloc(1, 1)                                     = 0x80593f8
calloc(1, 1)                                     = 0x8059e80
clearerr(0xb7fe2720, 0, 0, 0, 0)                 = 0
ferror(0xb7fe2720)                               = 0
__getdelim(0x8052758, 0x8052754, 10, 0xb7fe2720, 0) = 4
ferror(0xb7fe2720)                               = 0
memcpy(0x8059408, "A=B", 3)                      = 0x8059408
calloc(1, 50)                                    = 0x8059748
re_search(0x8059450, 0x8059408, 3, 0, 3)         = 1
clearerr(0xb7fe25c0, 1, 0xbfffe968, 0x804e461, 0x8059450) = 0
fwrite("A=B", 1, 1, 0xb7fe25c0)                  = 1
clearerr(0xb7fe25c0, 1, 1, 0xb7fe25c0, 0x8059450) = 0
fwrite("\n", 1, 1, 0xb7fe25c0)                   = 1
ferror(0xb7fe2720)                               = 0
__getdelim(0x8052758, 0x8052754, 10, 0xb7fe2720, 0x8059408) = -1
ferror(0xb7fe2720)                               = 0
clearerr(0xb7fe25c0, 0xbffffa04, 0xb7f65c21, 3, 0) = 0
fflush(0xb7fe25c0)                               = 0
clearerr(0xb7fe25c0, 0xb7fe4120, 0xb7fe1ff4, 0xbffffaf4, 0) = 0
fclose(0xb7fe25c0)                               = 0
clearerr(0xb7fe2460, 0, 0, 0, 0)                 = 0
fflush(0xb7fe2460)                               = 0
clearerr(0xb7fe2460, 0xb7fe4120, 0xb7fe1ff4, 0xbffffaf4, 0) = 0
fclose(0xb7fe2460)                               = 0
+++ exited (status 0) +++
% echo A=B | env LC_ALL=C ltrace /bin/sed -e 's/=.*$//' > /dev/null
__libc_start_main(0x8049600, 3, 0xbffffad4, 0x804f890, 0x804f900 <unfinished ...>
getenv("COLS")                                   = NULL
setlocale(6, "")                                 = "C"
__ctype_get_mb_cur_max(0xbffffad4, 3, 0xbffffa58, 0x8049634, 6) = 1
bindtextdomain("sed", "/usr/share/locale")       = "/usr/share/locale"
textdomain("sed")                                = "sed"
getenv("POSIXLY_CORRECT")                        = NULL
getopt_long(3, 0xbffffad4, "snrue:f:l:i::V:", 0x8052560, NULL) = 101
strlen("s/=.*$//")                               = 8
calloc(1, 12)                                    = 0x8058030
_obstack_begin(0x8052700, 0, 0, 0x804f330, 0x804f520 <unfinished ...>
calloc(1, 4072)                                  = 0x8058040
<... _obstack_begin resumed> )                   = 1
__ctype_b_loc()                                  = 0xb7ea86ac
calloc(1, 960)                                   = 0x8059030
__ctype_b_loc()                                  = 0xb7ea86ac
calloc(1, 12)                                    = 0x80593f8
calloc(1, 50)                                    = 0x8059408
calloc(1, 12)                                    = 0x8059440
calloc(1, 50)                                    = 0x8059450
calloc(1, 1)                                     = 0x8059488
memcpy(0x8059488, "", 0)                         = 0x8059488
free(0x8059450)                                  = <void>
free(0x8059440)                                  = <void>
__ctype_b_loc()                                  = 0xb7ea86ac
calloc(1, 47)                                    = 0x8059450
memcpy(0x8059478, "=.*$", 4)                     = 0x8059478
malloc(256)                                      = 0x8059498
re_set_syntax(0x10502c6, 0xd696913, 0xb8000ff4, 0xb80016b4, 0xbffff8c4) = 0
re_compile_pattern(0x8059478, 4, 0x8059450, 0xb80016b4, 0xbffff8c4) = 0
free(0x8059408)                                  = <void>
free(0x80593f8)                                  = <void>
__ctype_b_loc()                                  = 0xb7ea86ac
getopt_long(3, 0xbffffad4, "snrue:f:l:i::V:", 0x8052560, NULL) = -1
calloc(1, 50)                                    = 0x8059408
calloc(1, 1)                                     = 0x80593f8
calloc(1, 1)                                     = 0x8059e80
clearerr(0xb7fdc720, 0, 0, 0, 0)                 = 0
ferror(0xb7fdc720)                               = 0
__getdelim(0x8052758, 0x8052754, 10, 0xb7fdc720, 0) = 4
ferror(0xb7fdc720)                               = 0
memcpy(0x8059408, "A=B", 3)                      = 0x8059408
calloc(1, 50)                                    = 0x8059748
re_search(0x8059450, 0x8059408, 3, 0, 3)         = -1
clearerr(0xb7fdc5c0, 1, 0xbfffe948, 0x804e461, 0x8059450) = 0
fwrite("A=B", 1, 3, 0xb7fdc5c0)                  = 3
clearerr(0xb7fdc5c0, 1, 3, 0xb7fdc5c0, 0x8059450) = 0
fwrite("\n", 1, 1, 0xb7fdc5c0)                   = 1
ferror(0xb7fdc720)                               = 0
__getdelim(0x8052758, 0x8052754, 10, 0xb7fdc720, 0x8059408) = -1
ferror(0xb7fdc720)                               = 0
clearerr(0xb7fdc5c0, 0xbffff9e4, 0xb7f5fc21, 3, 0) = 0
fflush(0xb7fdc5c0)                               = 0
clearerr(0xb7fdc5c0, 0xb7fde120, 0xb7fdbff4, 0xbffffad4, 0) = 0
fclose(0xb7fdc5c0)                               = 0
clearerr(0xb7fdc460, 0, 0, 0, 0)                 = 0
fflush(0xb7fdc460)                               = 0
clearerr(0xb7fdc460, 0xb7fde120, 0xb7fdbff4, 0xbffffad4, 0) = 0
fclose(0xb7fdc460)                               = 0
+++ exited (status 0) +++