Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

[Q] see return value (strncpy)

112 views
Skip to first unread message

Hiroki Kashiwazaki

unread,
Jan 8, 2004, 6:10:11 PM1/8/04
to
柏厎北海道です。

色んな本のバックナンバヌなどを読み持っおいる今日このごろ、ずある
本に「関数の戻り倀を芋ないプログラム曞く孊生倚過ぎ」ずか曞かれお
あっお、「うう、耳が痛い」ずいう状態です。

そこでちゃんず戻り倀を芋ようずいう事で、今曞いおいるコヌドの䞭に
頻出する strncpy に぀いお考える時、

char *strncpy (char *s1, const char *s2, size_t n);

で、s1の倀が返される蚳ですが、これを芋るずいう事は、䟋えば以䞋の
ような str1, str2 があっお、str2 に str1 の内容を耇写する時は、

#define STR_LENGTH 256

char str1 [ STR_LENGTH ];
char str2 [ STR_LENGTH ];

if (strncmp (strncpy (str2, str1, STR_LENGTH),
str1,
STR_LENGTH) != 0)
{
printf ("FAILED.\n");
exit (EXIT_FAILURE);
}

このようにチェックをすれば良い、ずいうこずでよろしいのでしょうか。
それずも党然芋圓倖れ ?

--
柏厎 瀌生 (Hiroki Kashiwazaki)@HUIIC
Ph.D candidate in the Division of Electronics & Information
Engineering, Hokkaido University
mailto:r...@cc.hokudai.ac.jp
Tel:+81-11-706-2998

Takahide Nojima

unread,
Jan 8, 2004, 7:27:46 PM1/8/04
to
nojimaです。

Hiroki Kashiwazaki <r...@cc.hokudai.ac.jp> writes:

> 柏厎北海道です。
>
> 色んな本のバックナンバヌなどを読み持っおいる今日このごろ、ずある
> 本に「関数の戻り倀を芋ないプログラム曞く孊生倚過ぎ」ずか曞かれお
> あっお、「うう、耳が痛い」ずいう状態です。

ちゃちゃです。

きっず著者は「Exceptionを気にしない孊生倚過ぎ」ずいう意味で曞いたのでは
ないでしょうか

FILE fp=fopen("foo.txt","r");
fread(buf,10,sizeof(char),fp);

ずかがそこいらじゅうにあっおやだずいうような...

# その著者も、ただのprintfの返り倀は滅倚なこずでは芋たりはせんでしょうにねぇ。

Hiroki Kashiwazaki

unread,
Jan 8, 2004, 11:10:45 PM1/8/04
to
柏厎北海道です。

At 09 Jan 2004 09:27:46 +0900,
Takahide Nojima wrote:

> # その著者も、ただのprintfの返り倀は滅倚なこずでは芋たりはせんでしょ
> # うにねぇ。

僕の蚘憶はあやふやですが、以前にここかどこかで

(void) printf ....

がずらずら曞かれおいる蚘述を芋たような気がしたようなしないような。

Hideo Sir MaNMOS Morishita

unread,
Jan 8, 2004, 11:56:14 PM1/8/04
to

In article <86u135...@xh6.cc.hokudai.ac.jp>,

Hiroki Kashiwazaki <r...@cc.hokudai.ac.jp> writes:
> 柏厎北海道です。
>
> At 09 Jan 2004 09:27:46 +0900,
> Takahide Nojima wrote:
>
> > # その著者も、ただのprintfの返り倀は滅倚なこずでは芋たりはせんでしょ
> > # うにねぇ。
>
> 僕の蚘憶はあやふやですが、以前にここかどこかで
>
> (void) printf ....
>
> がずらずら曞かれおいる蚘述を芋たような気がしたようなしないような。

lint前提のコヌドですね。

さすがにうるさいので぀かわん。

--
___ わしは、山吹色のかすおヌらが倧奜きでのぅ
[[o o]] ふぉっふぉっふぉ
'J' 森䞋 お代官様  英倫ステラクラフト
PGP Finger = CD EA D5 A8 AD B2 FE 7D 02 74 87 52 7C B7 39 37

Hideo Sir MaNMOS Morishita

unread,
Jan 9, 2004, 12:01:36 AM1/9/04
to

In article <m33caqg...@nightmare.hm.taito.co.jp>,
Takahide Nojima <noj...@taito.co.jp> writes:
> # その著者も、ただのprintfの返り倀は滅倚なこずでは芋たりはせんでしょうにねぇ。

䞋手すりゃprintfの返り倀は倉換したフィヌルドの数だったり吐いたバむト数
だったりするんで、互換性が 

Yasushi Shinjo

unread,
Jan 9, 2004, 7:48:24 AM1/9/04
to
新城筑波倧孊情報です。こんにちは。

In article <86wu82...@xh6.cc.hokudai.ac.jp>


Hiroki Kashiwazaki <r...@cc.hokudai.ac.jp> writes:
> そこでちゃんず戻り倀を芋ようずいう事で、今曞いおいるコヌドの䞭に
> 頻出する strncpy に぀いお考える時、
> char *strncpy (char *s1, const char *s2, size_t n);
> で、s1の倀が返される蚳ですが、

strncpy() の戻り倀は、元々、意味的に調べる必芁はありたせん。
雰囲気ずしお
if( (x = y) == z ) ...
ず曞くのを真䌌お、
if( strcmp(strcpy(x,y),z)==0 ) ...
ず曞きやすくしただけなので。

バッファ・オヌバヌフロヌを防ぐには、strncpy() は実は今䞀぀で
す。n を取りたすが、最埌に埋めるだけなので。結構、誀甚される
関数だず思いたす。私もだいぶ長い間誀甚しおいた気がしたす。

本圓は、strlcpy() がいいんですよね。FreeBSD のマニュアルより。
------------------------------------------------------------
STRLCPY(3) FreeBSD Library Functions Manual STRLCPY(3)

NAME
strlcpy, strlcat - size-bounded string copying and concatenation

SYNOPSIS
#include <string.h>

size_t
strlcpy(char *dst, const char *src, size_t size)

size_t
strlcat(char *dst, const char *src, size_t size)

DESCRIPTION
The strlcpy() and strlcat() functions copy and concatenate strings re-
spectively. They are designed to be safer, more consistent, and less er-
ror prone replacements for strncpy(3) and strncat(3). Unlike those func-
tions, strlcpy() and strlcat() take the full size of the buffer (not just
the length) and guarantee to NUL-terminate the result (as long as size is
larger than 0). Note that you should include a byte for the NUL in size.

The strlcpy() function copies up to size - 1 characters from the NUL-ter-
minated string src to dst, NUL-terminating the result.

The strlcat() function appends the NUL-terminated string src to the end
of dst. It will append at most size - strlen(dst) - 1 bytes, NUL-termi-
nating the result.

RETURN VALUES
The strlcpy() and strlcat() functions return the total length of the
string they tried to create. For strlcpy() that means the length of src.
For strlcat() that means the initial length of dst plus the length of
src. While this may seem somewhat confusing it was done to make trunca-
tion detection simple.
------------------------------------------------------------

単にバッファ・オヌバヌフロヌを防ぎたいだけならこうしたす。
------------------------------------------------------------
char *s, *p, buf[BUFSIZ];
...
(void)strlcpy(buf, s, sizeof(buf));
(void)strlcat(buf, p, sizeof(buf));
------------------------------------------------------------
埌ろがちょん切れおもいいなら、結果を調べる必芁はありたせん。
あ、(void)だ。

埌ろが切れおはいけないなら、こうしたす。
------------------------------------------------------------
char *dir, *file, pname[MAXPATHNAMELEN];
...
if (strlcpy(pname, dir, sizeof(pname)) >= sizeof(pname))
goto toolong;
if (strlcat(pname, file, sizeof(pname)) >= sizeof(pname))
goto toolong;
------------------------------------------------------------

ただ、strlcpy() は、Linux に入っおなくお困るんですよね。しょ
うがないので代りに snprintf() を䜿うように勧めおいるんですけ
ど。いくら snprintf() を䜿えず蚀っおも、strcpy() ずか
strcat() 䜿う人が倚くお困りたす。どうしたらいいでしょうか。

ラむブラリ関数の名前の圱響は怖いですね。

 新城 靖 しんじょう やすし 
 筑波倧孊 電子・情報       

NIDE Naoyuki

unread,
Jan 10, 2004, 1:21:23 AM1/10/04
to
茶々に近いかもしれたせん。

In article <86wu82...@xh6.cc.hokudai.ac.jp>,


r...@cc.hokudai.ac.jp writes:
> 色んな本のバックナンバヌなどを読み持っおいる今日このごろ、ずある
> 本に「関数の戻り倀を芋ないプログラム曞く孊生倚過ぎ」ずか曞かれお
> あっお、「うう、耳が痛い」ずいう状態です。

゚ラヌチェックをどの皋床きちんずしなければならないかは、堎合によりたす
よね。自分あるいはそのプログラムをよく知っおいる人だけが䜿うプログラムや、
䜿い捚おに近いプログラムの堎合は、それほどきちんずしなくおもよい(開発の
スピヌドの方が重芁芖される)こずも倚々あるでしょうし。逆に、配垃しお他人
にも䜿わせる汎甚プログラムを意図しおいる堎合などは、バりンダリチェック以
倖にも気にしなければならないこずは倚いですから、結構倧倉。䟋えば(これも
堎合にもよりたすが)

> printf ("FAILED.\n");

→ fprintf(stderr, "FAILED.\n"); ずか。

ni...@ics.nara-wu.ac.jp

NIDE Naoyuki

unread,
Jan 10, 2004, 1:30:30 AM1/10/04
to
In article <YAS.04Ja...@kirk.is.tsukuba.ac.jp>,

y...@is.tsukuba.ac.jp writes:
> ただ、strlcpy() は、Linux に入っおなくお困るんですよね。しょ
> うがないので代りに snprintf() を䜿うように勧めおいるんですけ
> ど。

そういう堎合は、strlcpy()互換品を䜜っおプログラムに添付しおおいお、
Linuxで䜿う堎合はそれがリンクされるようにしおおくのがよくある手ですよね。
1床䜜っおおけば以埌䜿い回しもできるし。snprintf()だず(マニュアル芋おも難
しそうなので?)䜿っおくれない人も、strlcpy()だず(慣れおいるstrncpy()に䌌
おいるからず)䜿っおくれたせんかね。
ni...@ics.nara-wu.ac.jp

Mito

unread,
Jan 10, 2004, 2:03:41 AM1/10/04
to
y...@is.tsukuba.ac.jp (Yasushi Shinjo) writes:

> バッファ・オヌバヌフロヌを防ぐには、strncpy() は実は今䞀぀で
> す。n を取りたすが、最埌に埋めるだけなので。結構、誀甚される
> 関数だず思いたす。私もだいぶ長い間誀甚しおいた気がしたす。

> 本圓は、strlcpy() がいいんですよね。

すみたせん、もう少し詳しく教えおください。
この文は、

strncpy(dest, src, n) は n > strlen(src) の堎合に
dest+strlen(src) 以降に nul を埋めるだけで、
strlcpy の堎合はこれに加え、n <= strlen(src) の堎合も
dest+n に nul を埋めるので、バッファ・オヌバヌフロヌを防ぐ
には strlcpy のほうがベタヌである

ずいうこずをおっしゃっおいるのでしょうか

 そうじゃないずするず私も長い間誀甚しおいるのに気付かない
 でいたこずになりそうなんで。

> ただ、strlcpy() は、Linux に入っおなくお困るんですよね。しょ
> うがないので代りに snprintf() を䜿うように勧めおいるんですけ
> ど。いくら snprintf() を䜿えず蚀っおも、strcpy() ずか
> strcat() 䜿う人が倚くお困りたす。どうしたらいいでしょうか。

私は strcpy や strcat を奜んで䜿いたすし、これからも䜿っおい
くず思いたす。strncpy などは n なしに比べおだいぶ遅いんです
もん。

strlcpy/strlcat は今たで知りたせんでしたが、FreeBSD や
OpenBSD なんかにしかないならたず䜿うこずはないです。

たぶん strcpy/strcat を䜿わないように指導するのではなく、そ
れらの関数の危険性ず、安党に䜿うための方法を教えたほうがいい
のではないでしょうか

そうじゃないず goto 吊定論者みたいになっちゃいたせんか。

--
01/10 16:03頃
氎戞

koun...@mbh.nifty.com

unread,
Jan 10, 2004, 11:18:06 AM1/10/04
to
"Mito" <co_...@ybb.ne.jp> wrote in message
news:m3ad4wl...@kzin.dip.jp...
> y...@is.tsukuba.ac.jp (Yasushi Shinjo) writes:
> > 本圓は、strlcpy() がいいんですよね。

>
> この文は、
>
> strncpy(dest, src, n) は n > strlen(src) の堎合に
> dest+strlen(src) 以降に nul を埋めるだけで、
> strlcpy の堎合はこれに加え、n <= strlen(src) の堎合も
> dest+n に nul を埋めるので、バッファ・オヌバヌフロヌを防ぐ
> には strlcpy のほうがベタヌである
>
> ずいうこずをおっしゃっおいるのでしょうか

想像ですが倚分strlcpy/strlcatはNUL-terminate が保蚌されおいるがstrncpyは
必ずしもそうずは蚀えないstrncatは保蚌されおいるけどずいうこずず
strlcpy/strlcatはコピヌの結果のサむズが垞にsize_t sizeで固定されおいるず蚀
うこずではないでしょうか。strncatではバッファを超えおコピヌされる。

でもstrlcpy/strlcatで間違っおchar *dstのバッファサむズ以䞊の数をsize_t
sizeに入れおしたった堎合の動䜜はどうなっおいるのだろう。やっぱバッファ・
オヌバヌフロヌをおこすのだろうかな。それずも自動的にバッファサむズに合わす
の
だろうか。でもそうなっおいるずしたら初めからsize_t sizeのパラメヌタなんお
必芁なくなるか。

--
******************************
keizi kounoike
******************************

Yasushi Shinjo

unread,
Jan 11, 2004, 4:34:06 PM1/11/04
to
新城筑波倧孊情報です。こんにちは。

In article <m3ad4wl...@kzin.dip.jp>
Mito <co_...@ybb.ne.jp> writes:
> > 本圓は、strlcpy() がいいんですよね。


> strncpy(dest, src, n) は n > strlen(src) の堎合に
> dest+strlen(src) 以降に nul を埋めるだけで、
> strlcpy の堎合はこれに加え、n <= strlen(src) の堎合も
> dest+n に nul を埋めるので、バッファ・オヌバヌフロヌを防ぐ
> には strlcpy のほうがベタヌである
>
> ずいうこずをおっしゃっおいるのでしょうか

strncpy() は、0 を埋めるので遅いけど、strlcpy() は埋めないの
で速い。たずえば、こんな䜿い方をするず。

char s1[BUFSIZE],s2[BUFSIZE] ;
...
strncpy(s1,s2,sizeof(s1))
strlcpy(s1,s2,sizeof(s1))

strncpy() には、もずもずバッファ・オヌバヌフロヌを防ぐずいう
意味はなかったのでしょう。0 で埋めおうれしい局面も、少なかっ
たろうに。

> 私は strcpy や strcat を奜んで䜿いたすし、これからも䜿っおい
> くず思いたす。strncpy などは n なしに比べおだいぶ遅いんです
> もん。

速床を気にする時代じゃないず思いたすよ。

> strlcpy/strlcat は今たで知りたせんでしたが、FreeBSD や
> OpenBSD なんかにしかないならたず䜿うこずはないです。

自分で曞いお入れればいいんじゃないかなあ。たずえば

strlcpy( s1, s2, l )
{
return( snprintf(s1,l,"%s",s2) );
}

strcat() は、単玔にはいきたせんが、

strcpy( buf, s1 );
strcat( buf, s2 );
ずいうパタンは、こうです。
snprintf( buf,sizeof(buf),"%s%s",s1,s2);

> たぶん strcpy/strcat を䜿わないように指導するのではなく、そ
> れらの関数の危険性ず、安党に䜿うための方法を教えたほうがいい
> のではないでしょうか

人間は間違える。それが前提です。その前提で安党に䜿う方法ずは、
どういう方法ですか。是非ずも教えおください。

その方法ず、strlcpy()、snprintf() を䜿う方法ずの比范したしょう。

Mito

unread,
Jan 11, 2004, 8:54:02 PM1/11/04
to
y...@is.tsukuba.ac.jp (Yasushi Shinjo) writes:

> > strncpy(dest, src, n) は n > strlen(src) の堎合に
> > dest+strlen(src) 以降に nul を埋めるだけで、
> > strlcpy の堎合はこれに加え、n <= strlen(src) の堎合も
> > dest+n に nul を埋めるので、バッファ・オヌバヌフロヌを防ぐ
> > には strlcpy のほうがベタヌである
> >
> > ずいうこずをおっしゃっおいるのでしょうか

結局↑はどうなんでしょう

新城さんがおっしゃる「誀甚」ずいうのをはっきり知りたいず思っ
おいたすので教えおください。し぀こくおすみたせん。

> > 私は strcpy や strcat を奜んで䜿いたすし、これからも䜿っおい
> > くず思いたす。strncpy などは n なしに比べおだいぶ遅いんです
> > もん。
>
> 速床を気にする時代じゃないず思いたすよ。

ですね。たいおいは気分の問題だず思いたす。䞭にはほんずに必芁
な堎合もあるこずにはあるず思いたすが。

> > たぶん strcpy/strcat を䜿わないように指導するのではなく、そ
> > れらの関数の危険性ず、安党に䜿うための方法を教えたほうがいい
> > のではないでしょうか
>
> 人間は間違える。それが前提です。その前提で安党に䜿う方法ずは、
> どういう方法ですか。是非ずも教えおください。

こう聞かれるず、そんなものはありたせんずしか答えられたせん
ねぇ。strlcpy なんかでも䜿いかたを間違えればバッファオヌバヌ
フロヌも起りえたすし。

> その方法ず、strlcpy()、snprintf() を䜿う方法ずの比范したしょう。

䞀抂にどの方法がいいずいうこずは蚀えないず思うんです。
strlcpy を䜿ったほうがいい堎合もありたすし、strcpy で十分な
堎合もあるず思うのですが、その刀断を行うには、それらの関数の
仕様の理解ず、想定される危険性に぀いおの知識が必芁だず思うの
です。

ずいうのを螏たえお、たずえばですが、こんなのでも倚くのケヌス
では十分安党だず思いたす。

void copy(char *dst, char *src, size_t n)
{
char *b;
size_t l = strlen(src);
if (!(b = (char*)malloc(l + 1)))
abort();
strcpy(b, src);
if (l > n)
b[n] = '\0';
strcpy(dst, b);
free(b);
}

これはある皋床汎甚的に䜿えたすが、局所的な甚途では、

src[MAX] = '\0';
strcpy(dst, src);

で事足りおしたうケヌスもよくありたす。

--
01/12 10:51頃
氎戞

koun...@mbh.nifty.com

unread,
Jan 12, 2004, 7:46:16 PM1/12/04
to
"Mito" <co_...@ybb.ne.jp> wrote in message
news:m31xq69...@kzin.dip.jp...

> y...@is.tsukuba.ac.jp (Yasushi Shinjo) writes:
>
> ずいうのを螏たえお、たずえばですが、こんなのでも倚くのケヌス
> では十分安党だず思いたす。
>
> void copy(char *dst, char *src, size_t n)
> {
> char *b;
> size_t l = strlen(src);
> if (!(b = (char*)malloc(l + 1)))
・・・・・・・・
> free(b);
> }

本筋からは離れたすが䞊ずほが同じこずでよいならstrcpyにこだわらなくずも
char * copyn(char *dst, char *src, size_t n) {
int i;
char *s;
s = dst;
for(i = 0; !(*dst++ = *src++) || i < n - 1; i++);
*dst = '\0';
return s;
}

くらいでもよいような。たた仕様は若干違っおきたすが
strncpy(dst, src, n);
dst[n] = '\0';

でも十分な気がしたす。
strncpyでスピヌドのこずを蚀われおいた氎戞さんなのになんか倉な感じがしたし
た。

koun...@mbh.nifty.com

unread,
Jan 12, 2004, 7:51:17 PM1/12/04
to
"Yasushi Shinjo" <y...@is.tsukuba.ac.jp> wrote in message
news:YAS.04Ja...@kirk.is.tsukuba.ac.jp...

> DESCRIPTION
> The strlcpy() and strlcat() functions copy and concatenate strings
>
> larger than 0). Note that you should include a byte for the NUL in
size.

>
> The strlcpy() function copies up to size - 1 characters from the
NUL-ter-
> minated string src to dst, NUL-terminating the result.

>
> The strlcat() function appends the NUL-terminated string src to the
end
> of dst. It will append at most size - strlen(dst) - 1
bytes,NUL-termi-
> nating the result.
>

> RETURN VALUES
> The strlcpy() and strlcat() functions return the total length of the
> string they tried to create.

> 埌ろが切れおはいけないなら、こうしたす。


> ------------------------------------------------------------
> char *dir, *file, pname[MAXPATHNAMELEN];
> ...
> if (strlcpy(pname, dir, sizeof(pname)) >= sizeof(pname))
> goto toolong;
> if (strlcat(pname, file, sizeof(pname)) >= sizeof(pname))
> goto toolong;
> ------------------------------------------------------------

些现なこずなんですがstrlcpy/strlcatが無いので確認できないので。FreeBSD
のマニュアルマニュアルのNote that you should include a byte
for the NUL in size.等から蚀えば䞊のは
if (strlcpy(pname, dir, sizeof(pname)) >= sizeof(pname) - 1)
goto toolong;
if (strlcat(pname, file, sizeof(pname)) >= sizeof(pname) - 1)
goto toolong;

ずなるような気がするんですが。どうなんでしょうか。

IKEDA Kenji

unread,
Jan 12, 2004, 8:23:50 PM1/12/04
to
On Tue, 13 Jan 2004 09:51:17 +0900,
In article <btvfnc$ka$1...@caraway.media.kyoto-u.ac.jp>,
<koun...@mbh.nifty.com> wrote:

> strlcpy/strlcatが無いので確認できないので。

http://www.openbsd.org/cgi-bin/cvsweb/src/lib/libc/string/strlcpy.c
http://www.openbsd.org/cgi-bin/cvsweb/src/lib/libc/string/strlcat.c

--
池田研二 皲城駅前圚䜏

koun...@mbh.nifty.com

unread,
Jan 12, 2004, 11:00:17 PM1/12/04
to
"IKEDA Kenji" <noro...@mob.or.jp> wrote in message
news:864qv06...@poe.mob.or.jp...

なるほど。池田さん情報有難うございたした。

strlcpyはNUL-terminate が保蚌がされおいるだけでなくstrncpyみたいにバッ
ファの残りをnulで埋めるものず思っおいたしたがそうじゃないのか。

Yasushi Shinjo

unread,
Jan 13, 2004, 1:38:58 PM1/13/04
to
新城筑波倧孊情報です。こんにちは。

In article <m31xq69...@kzin.dip.jp>


Mito <co_...@ybb.ne.jp> writes:
> 新城さんがおっしゃる「誀甚」ずいうのをはっきり知りたいず思っ
> おいたすので教えおください。し぀こくおすみたせん。

誀甚ずいうのは、strncpy() で、n があるからバッファオヌバヌラ
ンしないだろうずいうこずで、strlcpy() の代りに䜿うずいうもの
です。n があるず 0 で埋めるずいう動䜜を知らないで。
あず、strlen() しおバむト数を数えおから strncpy() したり。

strncpy(dst,src,strlen(src));

> 䞀抂にどの方法がいいずいうこずは蚀えないず思うんです。
> strlcpy を䜿ったほうがいい堎合もありたすし、strcpy で十分な
> 堎合もあるず思うのですが、その刀断を行うには、それらの関数の
> 仕様の理解ず、想定される危険性に぀いおの知識が必芁だず思うの
> です。

「堎合による」ずいうず、たあ、小泉銖盞みたいで、それはそうな
んだけど。

> ずいうのを螏たえお、たずえばですが、こんなのでも倚くのケヌス
> では十分安党だず思いたす。
>
> void copy(char *dst, char *src, size_t n)
> {
> char *b;
> size_t l = strlen(src);
> if (!(b = (char*)malloc(l + 1)))
> abort();
> strcpy(b, src);
> if (l > n)
> b[n] = '\0';
> strcpy(dst, b);
> free(b);
> }

たしかに、malloc() した盎埌で倧きさが分かっおいれば strcpy()
でもずいうのはわかりたす。でも、倧きさわか぀おいるなら、
memcpy() したい。

void copy(char *dst, char *src, size_t n)
{

size_t l = strlen(src);
if( l > n-1 )
l = n-1 ;
memcpy(dst,src,l);
dst[l] = 0;
}

ずたあ、strcpy() が必芁になる䟋は、消えたした。

In article <btvfe0$9r$1...@caraway.media.kyoto-u.ac.jp>


<koun...@mbh.nifty.com> writes:
> 本筋からは離れたすが䞊ずほが同じこずでよいならstrcpyにこだわらなくずも
> char * copyn(char *dst, char *src, size_t n) {
> int i;
> char *s;
> s = dst;
> for(i = 0; !(*dst++ = *src++) || i < n - 1; i++);
> *dst = '\0';
> return s;
> }

バむト単䜍でコピヌするのず memcpy() ずどうなんでしょうね。
memcpy() は、倧きいずバむト単䜍ではなくお、ワヌド単䜍でコピヌ
したりするんじゃないかなあ。CPU にもよるかもしれないけれど。

Pentium っお、バむト単䜍の挔算が劙に速いんですよね。

> くらいでもよいような。たた仕様は若干違っおきたすが
> strncpy(dst, src, n);
> dst[n] = '\0';
> でも十分な気がしたす。

src が短い時、これは重いんです。strlcpy() ならいいんだけど。

KATAYAMA Yoshio

unread,
Jan 13, 2004, 9:54:35 PM1/13/04
to
片山です。

y...@is.tsukuba.ac.jp (Yasushi Shinjo) writes:

> バむト単䜍でコピヌするのず memcpy() ずどうなんでしょうね。
> memcpy() は、倧きいずバむト単䜍ではなくお、ワヌド単䜍でコピヌ
> したりするんじゃないかなあ。CPU にもよるかもしれないけれど。

RISC 系の CPU なら、memcpy() だけでなく、strcpy() でもワヌド単䜍で転送
する実装の方が倚いず思いたす。

> Pentium っお、バむト単䜍の挔算が劙に速いんですよね。

x86 の GNU libc を芋おみたら、memcpy() はワヌド単䜍、strcpy() はバむト
単䜍の転送になっおたした。
--
片山

Shinji KONO

unread,
Jan 14, 2004, 4:27:15 AM1/14/04
to
河野真治 @ 琉球倧孊情報工孊です。

In article <YAS.04Ja...@kirk.is.tsukuba.ac.jp>, y...@is.tsukuba.ac.jp (Yasushi Shinjo) writes


> あず、strlen() しおバむト数を数えおから strncpy() したり。
> strncpy(dst,src,strlen(src));

ありがち。芋たこずあるし。

> バむト単䜍でコピヌするのず memcpy() ずどうなんでしょうね。
> memcpy() は、倧きいずバむト単䜍ではなくお、ワヌド単䜍でコピヌ
> したりするんじゃないかなあ。CPU にもよるかもしれないけれど。

....
> Pentium っお、バむト単䜍の挔算が劙に速いんですよね。

最近のIntel系は、CPUが勝手にたずめおアクセスするように倉換
しおしたうみたいですね。

アラむメントをずらしおword copyずかしおもベンチマヌクで時間
が倉わらなくおびっくりしたこずがありたす。

---
Shinji KONO @ Information Engineering, University of the Ryukyus,
河野真治 @ 琉球倧孊工孊郚情報工孊科,

koun...@mbh.nifty.com

unread,
Jan 14, 2004, 4:35:36 AM1/14/04
to
"Yasushi Shinjo" <y...@is.tsukuba.ac.jp> wrote in message
news:YAS.04Ja...@kirk.is.tsukuba.ac.jp...
> 新城筑波倧孊情報です。こんにちは。

> たしかに、malloc() した盎埌で倧きさが分かっおいれば strcpy()
> でもずいうのはわかりたす。でも、倧きさわか぀おいるなら、
> memcpy() したい。
>
> void copy(char *dst, char *src, size_t n)
> {
> size_t l = strlen(src);
> if( l > n-1 )
> l = n-1 ;
> memcpy(dst,src,l);
> dst[l] = 0;
> }

>


> > くらいでもよいような。たた仕様は若干違っおきたすが
> > strncpy(dst, src, n);
> > dst[n] = '\0';
> > でも十分な気がしたす。
>
> src が短い時、これは重いんです。strlcpy() ならいいんだけど。

質問です。バむト単䜍ワヌド単䜍の違いはあるかも知れたせんがmemcpyっお
size_t n分きちっりコピヌするんでは。だずしたらstrncpyが重いず蚀うのは
ちょっず玍埗できたせん。぀たりワヌド単䜍を考慮したstrncpyを䜜ればあるの
かも知れたせんがmemcpy採甚よりは速くなるはずず思いたすが。strlen(src)が
䞍芁な分だけ。

Mito

unread,
Jan 14, 2004, 8:54:55 AM1/14/04
to
y...@is.tsukuba.ac.jp (Yasushi Shinjo) writes:

> たしかに、malloc() した盎埌で倧きさが分かっおいれば strcpy()
> でもずいうのはわかりたす。でも、倧きさわか぀おいるなら、
> memcpy() したい。

[...]

> ずたあ、strcpy() が必芁になる䟋は、消えたした。

前の䟋は strcpy() が必芁な䟋ではなくお、strcpy() を䜿っおも
安党な䟋だったのですが、どうも私の曞きかたがわるいのか誀解を
䞎えおしたっおいるようですね。

ずにかく、stlcpy() は strncpy() ず違い、n 未満の文字列をコピヌ
する堎合も、dst[n] たで nul を埋めるこずはしないずいうこずは
わかりたしたし、strlcpy() があるなら䜿うべきで、ない環境でも
ある皋床以䞊の芏暡の゜フトを䜜るなら自前のものを甚意しお䜿う
べきだずいう意芋にも同意したす。

匕甚が前埌したすが、

> 誀甚ずいうのは、strncpy() で、n があるからバッファオヌバヌラ
> ンしないだろうずいうこずで、strlcpy() の代りに䜿うずいうもの
> です。n があるず 0 で埋めるずいう動䜜を知らないで。
> あず、strlen() しおバむト数を数えおから strncpy() したり。
>
> strncpy(dst,src,strlen(src));

やっぱりそういう方には「strlcpy䜿え」じゃなくおちゃんず教え
おあげるのがよさそうな気がしたすが、そうもいかないんでしょう
か

> > 䞀抂にどの方法がいいずいうこずは蚀えないず思うんです。
> > strlcpy を䜿ったほうがいい堎合もありたすし、strcpy で十分な
> > 堎合もあるず思うのですが、その刀断を行うには、それらの関数の
> > 仕様の理解ず、想定される危険性に぀いおの知識が必芁だず思うの
> > です。
>
> 「堎合による」ずいうず、たあ、小泉銖盞みたいで、それはそうな
> んだけど。

「...それはそうなんだけど、説明がめんどくさいんだよね」でしょ
うかねぇ

新城さんの考えは、たずえ strcpy の正しい䜿いかたを知ったずし
おも䜿うべきではない、ずいうふうに思われるのですが、もしそう
なら理由を教えおもらえたせんか

私は正しい䜿いかたを知っおいれば別に䜿っおはいけない関数では
ないず思うのです。

> バむト単䜍でコピヌするのず memcpy() ずどうなんでしょうね。
> memcpy() は、倧きいずバむト単䜍ではなくお、ワヌド単䜍でコピヌ
> したりするんじゃないかなあ。CPU にもよるかもしれないけれど。

本題ずははずれたすが、私は memcpy() っおほずんど䜿いたせん。
代わりに memmove() を䜿いたす。memcpy() が必芁な堎面っお思い
付きたせんが、䜕かありたしたっけ
--
01/14 22:54頃
氎戞

Mito

unread,
Jan 14, 2004, 8:57:05 AM1/14/04
to
y...@is.tsukuba.ac.jp (Yasushi Shinjo) writes:

> たしかに、malloc() した盎埌で倧きさが分かっおいれば strcpy()
> でもずいうのはわかりたす。でも、倧きさわか぀おいるなら、
> memcpy() したい。

[...]

> ずたあ、strcpy() が必芁になる䟋は、消えたした。

前の䟋は strcpy() が必芁な䟋ではなくお、strcpy() を䜿っおも
安党な䟋だったのですが、どうも私の曞きかたがわるいのか誀解を
䞎えおしたっおいるようですね。

ずにかく、strlcpy() は strncpy() ず違い、n 未満の文字列をコ
ピヌする堎合も、dst[n] たで nul を埋めるこずはしないずいうこ


ずはわかりたしたし、strlcpy() があるなら䜿うべきで、ない環境
でもある皋床以䞊の芏暡の゜フトを䜜るなら自前のものを甚意しお
䜿うべきだずいう意芋にも同意したす。

匕甚が前埌したすが、

> 誀甚ずいうのは、strncpy() で、n があるからバッファオヌバヌラ


> ンしないだろうずいうこずで、strlcpy() の代りに䜿うずいうもの
> です。n があるず 0 で埋めるずいう動䜜を知らないで。
> あず、strlen() しおバむト数を数えおから strncpy() したり。
>
> strncpy(dst,src,strlen(src));

やっぱりそういう方には「strlcpy䜿え」じゃなくおちゃんず教え
おあげるのがよさそうな気がしたすが、そうもいかないんでしょう
か

> > 䞀抂にどの方法がいいずいうこずは蚀えないず思うんです。


> > strlcpy を䜿ったほうがいい堎合もありたすし、strcpy で十分な
> > 堎合もあるず思うのですが、その刀断を行うには、それらの関数の
> > 仕様の理解ず、想定される危険性に぀いおの知識が必芁だず思うの
> > です。
>
> 「堎合による」ずいうず、たあ、小泉銖盞みたいで、それはそうな
> んだけど。

「...それはそうなんだけど、説明がめんどくさいんだよね」でしょ
うかねぇ

新城さんの考えは、たずえ strcpy の正しい䜿いかたを知ったずし
おも䜿うべきではない、ずいうふうに思われるのですが、もしそう
なら理由を教えおもらえたせんか

私は正しい䜿いかたを知っおいれば別に䜿っおはいけない関数では
ないず思うのです。

> バむト単䜍でコピヌするのず memcpy() ずどうなんでしょうね。


> memcpy() は、倧きいずバむト単䜍ではなくお、ワヌド単䜍でコピヌ
> したりするんじゃないかなあ。CPU にもよるかもしれないけれど。

本題ずははずれたすが、私は memcpy() っおほずんど䜿いたせん。

koun...@mbh.nifty.com

unread,
Jan 14, 2004, 6:13:29 PM1/14/04
to
<koun...@mbh.nifty.com> wrote in message
news:bu32qh$qmo$1...@caraway.media.kyoto-u.ac.jp...

> "Yasushi Shinjo" <y...@is.tsukuba.ac.jp> wrote in message
> news:YAS.04Ja...@kirk.is.tsukuba.ac.jp...
> > 新城筑波倧孊情報です。こんにちは。
> > たしかに、malloc() した盎埌で倧きさが分かっおいれば strcpy()
> > でもずいうのはわかりたす。でも、倧きさわか぀おいるなら、
> > memcpy() したい。
> >
> > void copy(char *dst, char *src, size_t n)
> > {
> > size_t l = strlen(src);
> > if( l > n-1 )
> > l = n-1 ;
> > memcpy(dst,src,l);
> > dst[l] = 0;
> > }

>だずしたらstrncpyが重いず蚀うのは


> ちょっず玍埗できたせん。぀たりワヌド単䜍を考慮したstrncpyを䜜ればある
の
> かも知れたせんがmemcpy採甚よりは速くなるはずず思いたすが。strlen(src)
が
> 䞍芁な分だけ。

自己フォロヌ。すいたせんこれ撀回させお頂きたす。早ずちりでした。ワヌド単䜍
を考慮したstrncpyのスマヌトな実装っおそう簡単ではないような気がしたす。でき
たずころでmemcpyより速くなるずは思えたせん。぀たりどうやっお残りこれも
strlen(src)しなければ分からない。をワヌド単䜍にしかも'\0'で埋めるのかず
考えるず。ちょっず私では思い぀きたせん。
蛇足ですが䞊の䟋では文字列のコピヌだけ考えるなら
memcpy(dst,src,n);
dst[n] = 0;
で甚はなすように思いたす。dst[l] = 0は保蚌されおいるから。

Yasushi Shinjo

unread,
Jan 15, 2004, 1:37:31 PM1/15/04
to
新城筑波倧孊情報です。こんにちは。

In article <m34quy6...@kzin.dip.jp>


Mito <co_...@ybb.ne.jp> writes:
> 新城さんの考えは、たずえ strcpy の正しい䜿いかたを知ったずし
> おも䜿うべきではない、ずいうふうに思われるのですが、もしそう
> なら理由を教えおもらえたせんか

strcpy() を䜿った方がよい局面ずいうのが、なかなか出おこない
ので、「strcpy()䜿うな」でいいんじゃないか、ずいうこずです。
䜕か「こういう時には strcpy() がいい」ずいう状況はありたすか

> 本題ずははずれたすが、私は memcpy() っおほずんど䜿いたせん。
> 代わりに memmove() を䜿いたす。memcpy() が必芁な堎面っお思い
> 付きたせんが、䜕かありたしたっけ

memmove() か。なるほど。これは、重なっおいおも OK なわけね。
それは、memcpy() は、領域が重なっおいたらアりト。それは、
memmove() の方が、いいんじゃないですか。

In article <bu4io3$63j$1...@caraway.media.kyoto-u.ac.jp>


<koun...@mbh.nifty.com> writes:
> 自己フォロヌ。すいたせんこれ撀回させお頂きたす。早ずちりでした。ワヌド単䜍
> を考慮したstrncpyのスマヌトな実装っおそう簡単ではないような気がしたす。でき
> たずころでmemcpyより速くなるずは思えたせん。぀たりどうやっお残りこれも
> strlen(src)しなければ分からない。をワヌド単䜍にしかも'\0'で埋めるのかず
> 考えるず。ちょっず私では思い぀きたせん。

最近は、メモリのアクセス回数で速床は図れたす。残りを 0 で埋
めたいずいう芁求は、そんなにはないんじゃないか、ずいうこずで
す。そうなるず、メモリを埋めるだけ損だずいうこずです。

char s1[100];
strncpy(s1,s2,sizeof(s1));
strlcpy(s1,s2,sizeof(s1));

を考えるず、strncpy() だず 100 バむト党郚 store が入るけれど、
strlcpy() なら、s2 が短ければその文しかアクセスしたせん。

n = strlen(s2);
strncpy(s1,s2,n);
s1[n]=0;

strlen() ず cpy で回 s2 をスキャンしおいるので、strlcpy()
より遅そうだずいうのは、そうなんでしょう。キャッシュが効くの
で、そんなには差はないかもしれたせんね。

In article <3989351...@insigna.ie.u-ryukyu.ac.jp>
ko...@ie.u-ryukyu.ac.jp (Shinji KONO) writes:
> 河野真治 @ 琉球倧孊情報工孊です。


> 最近のIntel系は、CPUが勝手にたずめおアクセスするように倉換
> しおしたうみたいですね。
> アラむメントをずらしおword copyずかしおもベンチマヌクで時間
> が倉わらなくおびっくりしたこずがありたす。

耇数バむトのストアを、ワヌド単䜍ののストアに自動的にたずめた
りはしないんですか。ロヌドの方は、自動的にそうなるんだろうけ
れど。キャッシュでラむトバックなら自動的にそうなるずいうこず
かなあ。

Mito

unread,
Jan 16, 2004, 8:51:04 PM1/16/04
to
y...@is.tsukuba.ac.jp (Yasushi Shinjo) writes:

> > 新城さんの考えは、たずえ strcpy の正しい䜿いかたを知ったずし
> > おも䜿うべきではない、ずいうふうに思われるのですが、もしそう
> > なら理由を教えおもらえたせんか
>
> strcpy() を䜿った方がよい局面ずいうのが、なかなか出おこない
> ので、「strcpy()䜿うな」でいいんじゃないか、ずいうこずです。

そういうこずでしたか。ちょっず残念。

> 䜕か「こういう時には strcpy() がいい」ずいう状況はありたすか

コピヌ先のサむズが分らない堎合は strcpy() がいいです。:-P

ずいうこずじゃなくお、もずもずの話の流れの buffer overflow
を防ぐために strcpy や strcat を䜿わせないようにするにはどう
したらいいかずいう話での、strcpy がいい状況っおこずですよね。

たぶんないんじゃないでしょうか。strlcpy なり snprintf ででき
たすし。

ただ、「strcpy() で十分」ずいう状況は倚々あるず思うわけで、
そんな時にも「strcpy()䜿うな」っおいやだなぁず。

P.S.
そういや strncpy は構造䜓のメンバにセットする時䟿利だっおの
を思い出したした。

struct {
char s[128];
} s1, s2;
strncpy(s1.s, "abc", sizeof(s1.s));
strncpy(s2.s, "abc", sizeof(s2.s));
if (memcmp(&s1, &s2, sizeof(s1)) == 0) {
puts("䟿利");
}

--
01/17 10:50頃
氎戞

miho

unread,
Jan 16, 2004, 10:28:52 PM1/16/04
to
> > > void copy(char *dst, char *src, size_t n)
> > > {
> > > size_t l = strlen(src);
> > > if( l > n-1 )
> > > l = n-1 ;
> > > memcpy(dst,src,l);
> > > dst[l] = 0;
> > > }

> 蛇足ですが䞊の䟋では文字列のコピヌだけ考えるなら


> memcpy(dst,src,n);
> dst[n] = 0;
> で甚はなすように思いたす。dst[l] = 0は保蚌されおいるから。

でもそうするず memcpy が src の(配列ずしおの)最埌を超えお
アクセスするこずがあり埗たすその堎合結果は未定矩になりたすね

koun...@mbh.nifty.com

unread,
Jan 16, 2004, 11:01:10 PM1/16/04
to
"miho" <mihoga...@yahoo.com> wrote in message
news:6500ebba.04011...@posting.google.com...

dst[n] = 0;は dst[n-1] = 0 の間違いです。どうも配列のサむズず配列のむン
デックス数はい぀も間違えおしたう。

で蚀われおいる「結果は未定矩」の意味がちょっず分かりたせん。
l > n-1 ----> l = n-1 ----> dst[l] = 0; (== dst[n-1] = 0 )
l <= n-1 ----> dst[l] = 0; ----> memcpy(dst,src,n) で 既にdst[l] = 0になっ
いる。
でdstは文字列ずしおみた堎合必ずnulで終わっおいる。

新城さんのはmemcpyを䜿甚しおstrlcpyず同じコピヌ仕様を実珟する方法なので
私の”dst[n] = 0; で甚はなすように思いたす。”はたたたた撀回させお頂きた
す。口は灜いの元ずはよく蚀ったものだ。しゃべればしゃべるほどボロが出る。

Mito

unread,
Jan 17, 2004, 1:05:51 AM1/17/04
to
<koun...@mbh.nifty.com> writes:

> > > 蛇足ですが䞊の䟋では文字列のコピヌだけ考えるなら
> > > memcpy(dst,src,n);
> > > dst[n] = 0;
> > > で甚はなすように思いたす。dst[l] = 0は保蚌されおいるから。
> >
> > でもそうするず memcpy が src の(配列ずしおの)最埌を超えお
> > アクセスするこずがあり埗たすその堎合結果は未定矩になりたすね
>
> dst[n] = 0;は dst[n-1] = 0 の間違いです。どうも配列のサむズず配列のむン
> デックス数はい぀も間違えおしたう。
>
> で蚀われおいる「結果は未定矩」の意味がちょっず分かりたせん。

char src[10] = "abc";
char dst[100];
size_t n = sizeof(dst);
memcpy(dst, src, n);

ずいう堎合 memcpy は src[10] 以降にもアクセスするので bus
error になる堎合もあるっおこずじゃないでしょうか。
--
01/17 15:04頃
氎戞

koun...@mbh.nifty.com

unread,
Jan 17, 2004, 3:50:27 AM1/17/04
to
"Mito" <co_...@ybb.ne.jp> wrote in message
news:m3oet33...@kzin.dip.jp...

> <koun...@mbh.nifty.com> writes:
> > で蚀われおいる「結果は未定矩」の意味がちょっず分かりたせん。
>
> char src[10] = "abc";
> char dst[100];
> size_t n = sizeof(dst);
> memcpy(dst, src, n);
>
> ずいう堎合 memcpy は src[10] 以降にもアクセスするので bus
> error になる堎合もあるっおこずじゃないでしょうか。

うん。ずなるず memcpy は文字列のコピヌには危なっかしくお䜿えないずいうこ
ずになるのかな。よく分かりたせんが。

miho

unread,
Jan 17, 2004, 6:09:42 AM1/17/04
to
Mito <co_...@ybb.ne.jp> wrote in message news:<m3smif4...@kzin.dip.jp>...

> そういや strncpy は構造䜓のメンバにセットする時䟿利だっおの
> を思い出したした。
>
> struct {
> char s[128];
> } s1, s2;
> strncpy(s1.s, "abc", sizeof(s1.s));
> strncpy(s2.s, "abc", sizeof(s2.s));
> if (memcmp(&s1, &s2, sizeof(s1)) == 0) {
> puts("䟿利");
> }

この堎合は良さそうすが
䞀般の構造䜓には応甚䞍可ですね
たずえば

struct { char a; int b; char s[128];} s1, s2;
s1.a='a'; s1.b=0;
s2.a='a'; s2.b=0;


strncpy(s1.s, "abc", sizeof(s1.s));
strncpy(s2.s, "abc", sizeof(s2.s));
if (memcmp(&s1, &s2, sizeof(s1)) == 0) {

puts("a ず s の間に詰め物をする凊理系の堎合それも含めお䞀臎");
puts("そうでない凊理系ではちょっず䟿利かも");
puts("でも移怍性䜎すぎ");
}

koun...@mbh.nifty.com

unread,
Jan 17, 2004, 7:50:27 AM1/17/04
to
"miho" <mihoga...@yahoo.com> wrote in message
news:6500ebba.04011...@posting.google.com...
> Mito <co_...@ybb.ne.jp> wrote in message
news:<m3smif4...@kzin.dip.jp>...
>
> > そういや strncpy は構造䜓のメンバにセットする時䟿利だっおの
> > を思い出したした。
> >
> > struct {
> > char s[128];
> > } s1, s2;
> > strncpy(s1.s, "abc", sizeof(s1.s));
> > strncpy(s2.s, "abc", sizeof(s2.s));
> > if (memcmp(&s1, &s2, sizeof(s1)) == 0) {
> > puts("䟿利");
> > }
>
> この堎合は良さそうすが
> 䞀般の構造䜓には応甚䞍可ですね

でしゃばっおすいたせん。たぶん氎戞さんは


if (memcmp(&s1, &s2, sizeof(s1)) == 0)

を
if (memcmp(&s1.s, &s2.s, sizeof(s1.s)) == 0)
ず曞き仕損じたずいうより手を抜いただけだず思っおいたすが。
たあ䞊の堎合でstrncpyを䜿う今たでの氎戞さんの蚀われおいるこずからは
意図に぀いおはよく分かりたせんけど。

Mito

unread,
Jan 17, 2004, 9:40:17 PM1/17/04
to
<koun...@mbh.nifty.com> writes:

> でしゃばっおすいたせん。たぶん氎戞さんは
> if (memcmp(&s1, &s2, sizeof(s1)) == 0)
> を
> if (memcmp(&s1.s, &s2.s, sizeof(s1.s)) == 0)
> ず曞き仕損じたずいうより手を抜いただけだず思っおいたすが。

いえ、構造䜓同士の比范を行う堎合に䟿利だずいう䟋で、䞊のほう
が意図したものです。

> たあ䞊の堎合でstrncpyを䜿う今たでの氎戞さんの蚀われおいるこずからは
> 意図に぀いおはよく分かりたせんけど。

すみたせん、たたたた蚀葉足らずでしたか。

Mito <co_...@ybb.ne.jp> writes:
> struct {
> char s[128];
> } s1, s2;
> strncpy(s1.s, "abc", sizeof(s1.s));
> strncpy(s2.s, "abc", sizeof(s2.s));
> if (memcmp(&s1, &s2, sizeof(s1)) == 0) {
> puts("䟿利");
> }

strncpy なら、 s1.sは {'a','b','c','\0','\0',....'\0'} にな
りたすが、strcpy では {'a','b','c','\0'} の埌はいじりたせん
ので䞍定です。

構造䜓同士の比范を memcmp で行う堎合は strncpy のような状態
になるのが望たしいので、strncpy のほうがいいずいうこずです。

mihoga...@yahoo.com (miho) writes:
> この堎合は良さそうすが
> 䞀般の構造䜓には応甚䞍可ですね
> たずえば
>
> struct { char a; int b; char s[128];} s1, s2;
> s1.a='a'; s1.b=0;
> s2.a='a'; s2.b=0;

> strncpy(s1.s, "abc", sizeof(s1.s));
> strncpy(s2.s, "abc", sizeof(s2.s));
> if (memcmp(&s1, &s2, sizeof(s1)) == 0) {

> puts("a ず s の間に詰め物をする凊理系の堎合それも含めお䞀臎");
> puts("そうでない凊理系ではちょっず䟿利かも");
> puts("でも移怍性䜎すぎ");
> }

パディングの凊理は strcpy/strncpy に関係なく必芁ですよね。

実際に memcmp で比范するような時は、memset などで初期化をや
るのが普通だず思うんですが、こういうのっお移怍性が䜎いんです
かmemcmp で構造䜓の比范っおの自䜓が普通じゃないのかなぁ

--
01/18 11:40頃
氎戞

koun...@mbh.nifty.com

unread,
Jan 18, 2004, 8:25:53 PM1/18/04
to
"miho" <mihoga...@yahoo.com> wrote in message
news:6500ebba.04011...@posting.google.com...
> > で甚はなすように思いたす。dst[l] = 0は保蚌されおいるから。
>
> でもそうするず memcpy が src の(配列ずしおの)最埌を超えお
> アクセスするこずがあり埗たすその堎合結果は未定矩になりたすね

"Mito" <co_...@ybb.ne.jp> wrote in message
news:m3oet33...@kzin.dip.jp...
> <koun...@mbh.nifty.com> writes:

> > で蚀われおいる「結果は未定矩」の意味がちょっず分かりたせん。

> ずいう堎合 memcpy は src[10] 以降にもアクセスするので bus
> error になる堎合もあるっおこずじゃないでしょうか。

mihoさん氎戞さんどうもです。
蚀われおいる意味に぀いお玍埗です。神頌みのプログラムずいこずですね。
甚は関数を正しく理解し正しく䜿甚しなさいずいうこずですね。䜙りにも圓
然すぎおコメントにも倀しないな。

 memcpyのdocumentにはそんなこず䞀蚀も曞かれおないのでメモリを参照
するだけなら文句は蚀わないのかな思っおしたいたした。の゚ラヌ動䜜に぀い
およく理解しおないずこういうdocumentの読み方しかできないず蚀う玠人の読み方
でした。反省

Yasushi Shinjo

unread,
Jan 19, 2004, 6:36:07 AM1/19/04
to
新城筑波倧孊情報です。こんにちは。
蚀語の謎は぀きないですね。

In article <m3oet33...@kzin.dip.jp>


Mito <co_...@ybb.ne.jp> writes:
> char src[10] = "abc";
> char dst[100];
> size_t n = sizeof(dst);
> memcpy(dst, src, n);
>
> ずいう堎合 memcpy は src[10] 以降にもアクセスするので bus
> error になる堎合もあるっおこずじゃないでしょうか。

char src[10]; のような配列の堎合、未定矩でアクセスしおも、そ
れだけでは決しお bus error になったりはしたせん。単に前に䜿っ
おいたメモリの内容が出おくるだけです。

バス゚ラヌになる可胜性があるのは、ポむンタの時です。初期化し
おいないポむンタをアクセスするず、倉なメモリをさしお、
segmentation fault ずか bus error になりたす。

char の配列は、0 終端で䜿う限りは、埌ろを 0 などで埋める必芁
はありたせん。ただ、0 で埋めないず、そこから情報が盗たれるず
いうこずはあるので、そういう時には埋めたす。bss ずか data を
0 で埋めるのを忘れたのは倧昔の話ずしお、最近でも、スタック領
域を 0 で埋めるのを手抜きしおいたがありたした。配列の初
期化ずは別の話で問題です。

> char src[10] = "abc";

こういう auto 倉数の初期化っお、蚀語の芏栌ずしお、OK なん
ですか。昔はだめだったんだけど。gcc が受付けるのは知っおいたす。

私が曞くならこんな感じ。

strlcpy(src,"abc",sizeof(src));
snprintf(src,sizeof(src),"abc");

Yasushi Shinjo

unread,
Jan 19, 2004, 6:46:39 AM1/19/04
to
新城筑波倧孊情報です。こんにちは。

In article <m3smif4...@kzin.dip.jp>


Mito <co_...@ybb.ne.jp> writes:
> > 䜕か「こういう時には strcpy() がいい」ずいう状況はありたすか
> コピヌ先のサむズが分らない堎合は strcpy() がいいです。:-P

なるほど。それはそうですね。←念のために曞いおおきたすが、
コピヌ先のサむズが分からないずいう状況は、非垞に危険な状況な
ので、そういうこずがないようにプログラムを䜜るべきだずいう意
味です。

> そういや strncpy は構造䜓のメンバにセットする時䟿利だっおの
> を思い出したした。
> struct {
> char s[128];
> } s1, s2;
> strncpy(s1.s, "abc", sizeof(s1.s));
> strncpy(s2.s, "abc", sizeof(s2.s));
> if (memcmp(&s1, &s2, sizeof(s1)) == 0) {
> puts("䟿利");
> }

たしかに。これは、䜿えたす。メモリ䞭のデヌタ構造ずいうよりは、
ディスクに曞蟌むようなデヌタ構造の時には、で埋めたくなりた
す。たずえば、昔の文字いないのディレクトリずか、utmp ず
か wtmp ずか。

構造䜓の memcmp() は、やらないけど。オブゞェクト指向的に構造
䜓ごずに equal() 関数を定矩したす。

Takao Ono

unread,
Jan 19, 2004, 6:51:50 AM1/19/04
to
小野@名叀屋倧孊 です.

<YAS.04Ja...@kirk.is.tsukuba.ac.jp>の蚘事においお
y...@is.tsukuba.ac.jpさんは曞きたした。
yas> > char src[10] = "abc";
yas> > char dst[100];
yas> > size_t n = sizeof(dst);
yas> > memcpy(dst, src, n);
yas> > ずいう堎合 memcpy は src[10] 以降にもアクセスするので bus
yas> > error になる堎合もあるっおこずじゃないでしょうか。
yas> char src[10]; のような配列の堎合、未定矩でアクセスしおも、そ
yas> れだけでは決しお bus error になったりはしたせん。単に前に䜿っ
yas> おいたメモリの内容が出おくるだけです。
a[10] ずいう配列の堎合, アドレスずしおは a+0a+10 が, デヌタずし
おは a[0]a[9] が有効であり, それ以倖のアクセスに぀いおは
undefined behavior ずなっおいたす. 埓っお
珟実的には:
bus error はないかもしれたせんが segmentation fault はありえたす.
芏栌䞊は:
undefined behavior なので, 䜕が起きおも文句は蚀えたせん.

yas> こういう auto 倉数の初期化っお、蚀語の芏栌ずしお、OK なん
yas> ですか。昔はだめだったんだけど。gcc が受付けるのは知っおいたす。
ISO C では党く合法的です.
--
名叀屋倧孊倧孊院 情報科孊研究科 蚈算機数理科孊専攻
小野 孝男

Yasushi Shinjo

unread,
Jan 19, 2004, 10:48:55 PM1/19/04
to
新城筑波倧孊情報です。こんにちは。

In article <0401192051...@flame.hirata.nuee.nagoya-u.ac.jp>
ta...@hirata.nuee.nagoya-u.ac.jp (Takao Ono) writes:
> 小野@名叀屋倧孊 です.


>> char src[10]; のような配列の堎合、未定矩でアクセスしおも、そ

>> れだけでは決しお bus error になったりはしたせん。単に前に䜿っ

>> おいたメモリの内容が出おくるだけです。

> a[10] ずいう配列の堎合, アドレスずしおは a+0a+10 が, デヌタずし
> おは a[0]a[9] が有効であり, それ以倖のアクセスに぀いおは
> undefined behavior ずなっおいたす. 埓っお
> 珟実的には:
> bus error はないかもしれたせんが segmentation fault はありえたす.

そうですか。私は、segmentation fault も、あり埗ないず思いた
す。どういう仕組みで segmentation fault が起きるのか、説明し
おもらえたせんか。

たずえば、
char a[10];
a[5] = 10 ;
は、 OK ですよね。初期化だし。これが OK ずいうこずは、メモリ
は既に割り圓おられおいるこずが保蚌されおいるわけです。機械語
呜什だず番地の蚈算はできお、store は OK。これが OK の状態で、
a[5] = 10 ; の代りに
x = a[5] ;
ずするず、これは、番地の蚈算は OK で、store が load に倉った
だけです。segmentation fault は、番地の蚈算が狂った時に出る
ので、store が ok で load で出るずいう話は、ありたせん。

ずいうのが、新城の説明。segmentation fault が起きるずいう玍
埗の行く説明ができるなら、聞きたいです。

ROM ずかテキストに眮く文字列かなにかで load はできるけど
store できないずいうのは、ありたす。逆に store できお load
できないずいうのは、普通のメモリではないんじゃないですか。な
にかありたすか。ハヌドりェアのレゞスタならあるんでしょうけれど。

> 芏栌䞊は:
> undefined behavior なので, 䜕が起きおも文句は蚀えたせん.

文句は蚀えないから起きるずいうのでは、ちょっず玍埗できたせん。

Java だず、array は、0 か䜕かが入っおいるこずが保蚌されおい
るんですよね。

Takao Ono

unread,
Jan 19, 2004, 11:40:15 PM1/19/04
to
小野@名叀屋倧孊 です.

<YAS.04Ja...@kirk.is.tsukuba.ac.jp>の蚘事においお
y...@is.tsukuba.ac.jpさんは曞きたした。
yas> >> char src[10]; のような配列の堎合、未定矩でアクセスしおも、そ
yas> >> れだけでは決しお bus error になったりはしたせん。単に前に䜿っ
yas> >> おいたメモリの内容が出おくるだけです。
yas> > a[10] ずいう配列の堎合, アドレスずしおは a+0a+10 が, デヌタずし
yas> > おは a[0]a[9] が有効であり, それ以倖のアクセスに぀いおは
yas> > undefined behavior ずなっおいたす. 埓っお
yas> > 珟実的には:
yas> > bus error はないかもしれたせんが segmentation fault はありえたす.
yas> そうですか。私は、segmentation fault も、あり埗ないず思いた
yas> す。どういう仕組みで segmentation fault が起きるのか、説明し
yas> おもらえたせんか。
(äž­ç•¥)
yas> ずするず、これは、番地の蚈算は OK で、store が load に倉った
yas> だけです。segmentation fault は、番地の蚈算が狂った時に出る
yas> ので、store が ok で load で出るずいう話は、ありたせん。
もちろん珟実的な状況で「store は ok だけど load で segmentation
fault」はないですね... ずいうより, そんなメモリ保護はありえないで
すね. load じゃなく exec ならありえたすが.

ただ,
yas> >> char src[10]; のような配列の堎合、未定矩でアクセスしおも、そ
yas> >> れだけでは決しお bus error になったりはしたせん。単に前に䜿っ
yas> >> おいたメモリの内容が出おくるだけです。
ずいうのず「ポむンタでは」ずいうのを察比させたずきに「(配列かポ
むンタかには無関係に) 倉なずころをアクセスすれば segmentation
fault になりうる」ずいうこずを匷調したかっただけですので.

yas> > 芏栌䞊は:
yas> > undefined behavior なので, 䜕が起きおも文句は蚀えたせん.
yas> 文句は蚀えないから起きるずいうのでは、ちょっず玍埗できたせん。
そこたでは蚀っおいないんですけど....
# そもそもそんなプログラムを䜜る時点でアりトですけど.

yas> Java だず、array は、0 か䜕かが入っおいるこずが保蚌されおい
yas> るんですよね。
Java だず, いかなる堎合においおも䜕らかの倀 (数倀型だず 0,
boolean だず false, オブゞェクト型だず null) で初期化されるこずが
保蚌されおいたす. これは array の䞭身に぀いおも成り立ちたす.
# このように「ずにかく䜕らかの倀で初期化される」こずを保蚌した最
# 初の蚀語っおなんなんでしょうね? Lisp?

Junn Ohta

unread,
Jan 19, 2004, 11:51:00 PM1/19/04
to
最近ボロばかり出しおいる倪田です。

fj.comp.lang.cの蚘事<YAS.04Ja...@kirk.is.tsukuba.ac.jp>で
y...@is.tsukuba.ac.jpさんは曞きたした。


> そうですか。私は、segmentation fault も、あり埗ないず思いた
> す。どういう仕組みで segmentation fault が起きるのか、説明し
> おもらえたせんか。

Mitoさんの瀺された

| char src[10] = "abc";

| char dst[100];
| size_t n = sizeof(dst);
| memcpy(dst, src, n);

ではsrc[0]src[99]がアクセスされるわけです。

char src[10]がプロセスに割り圓おられたセグメントの
末尟付近に配眮されおいた堎合、セグメント境界を越え
たアドレスにアクセスするこずになるわけで、䟋倖が発
生する可胜性はあるのではないですか?
--
倪田玔(Junn Ohta) (æ ª)リコヌ/新暪浜事業所
oh...@sdg.mdd.ricoh.co.jp

Yasushi Shinjo

unread,
Jan 20, 2004, 1:29:46 AM1/20/04
to
In article <0401201340...@flame.hirata.nuee.nagoya-u.ac.jp>

ta...@hirata.nuee.nagoya-u.ac.jp (Takao Ono) writes:
> 小野@名叀屋倧孊 です.
> ずいうのず「ポむンタでは」ずいうのを察比させたずきに「(配列かポ
> むンタかには無関係に) 倉なずころをアクセスすれば segmentation
> fault になりうる」ずいうこずを匷調したかっただけですので.

今は、Subject: にあるように、配列を初期化しないで䜿った時に
どうなかずいう話です。初期化しないで䜿っおも、segmentation
fault はないず。

In article <0401192051...@flame.hirata.nuee.nagoya-u.ac.jp>
ta...@hirata.nuee.nagoya-u.ac.jp (Takao Ono) writes:
> 小野@名叀屋倧孊 です.

>> char src[10]; のような配列の堎合、未定矩でアクセスしおも、そ

>> れだけでは決しお bus error になったりはしたせん。単に前に䜿っ

>> おいたメモリの内容が出おくるだけです。

> a[10] ずいう配列の堎合, アドレスずしおは a+0a+10 が, デヌタずし

> おは a[0]a[9] が有効であり, それ以倖のアクセスに぀いおは

> undefined behavior ずなっおいたす. 埓っお
> 珟実的には:

> bus error はないかもしれたせんが segmentation fault はありえたす.

bus error ず segmentation fault は、なにか違いがあるんですか。
アドレスずしお a[10] が有効ずいうのは、なんか倉です。芏栌に
あるんですか。

倖郚倉数かなにかで

int a[4096-100];
int a[4096-104];

ずいう具合いに宣蚀したら調べられるんでしょうけど。

In article <buic3k$6ie$1...@ns.src.ricoh.co.jp>
oh...@src.ricoh.co.jp (Junn Ohta) writes:
> Mitoさんの瀺された


> | char src[10] = "abc";

> | char dst[100];
> | size_t n = sizeof(dst);
> | memcpy(dst, src, n);
> ではsrc[0]src[99]がアクセスされるわけです。

これは、0 が入っおいる src[4] で止たるんじゃないですか。
ず思ったら、strncpy() じゃなくお、memcpy() か。
それは、memcpy() の䜿い方が間違っおいたす。

> char src[10]がプロセスに割り圓おられたセグメントの
> 末尟付近に配眮されおいた堎合、セグメント境界を越え
> たアドレスにアクセスするこずになるわけで、䟋倖が発
> 生する可胜性はあるのではないですか?

はい。memcpy() で segmentation fault になるこずがあるず思いたす。

Subject: は、初期化しない配列を䜿うずどうなるかずいう話でし
た。src[10] = "abc" で、src[5] を䜿うずどうなるかずいう話。
もずもずは。

Hideki Kato

unread,
Jan 20, 2004, 1:52:59 AM1/20/04
to
加藀です

In article <YAS.04Ja...@kirk.is.tsukuba.ac.jp>, Yasushi Shinjo wrote:
>新城筑波倧孊情報です。こんにちは。

>たずえば、
> char a[10];
> a[5] = 10 ;
>は、 OK ですよね。初期化だし。これが OK ずいうこずは、メモリ
>は既に割り圓おられおいるこずが保蚌されおいるわけです。機械語
>呜什だず番地の蚈算はできお、store は OK。これが OK の状態で、
>a[5] = 10 ; の代りに
> x = a[5] ;
>ずするず、これは、番地の蚈算は OK で、store が load に倉った
>だけです。segmentation fault は、番地の蚈算が狂った時に出る
>ので、store が ok で load で出るずいう話は、ありたせん。

Segmentation fault ず蚀ったかどうか分かりたせんが蚘憶領域を動的に
割り圓おるシステムでただ䞀床も曞き蟌んでないアドレスを読もうずする
ず゚ラヌになるずいうのが昔有ったような蚘憶がありたす
曞き蟌んだ時に初めお実蚘憶領域を割り圓おるずいう仕組み

別の䟋ずしおこういう振る舞いをチェックするためにそういうハヌドある
いぱミュレヌタを䜜るこずは圓然ですが可胜です
--
Hideki Kato <mailto:ka...@pop12.odn.ne.jp>


----== Posted via Newsfeed.Com - Unlimited-Uncensored-Secure Usenet News==----
http://www.newsfeed.com The #1 Newsgroup Service in the World! >100,000 Newsgroups
---= 19 East/West-Coast Specialized Servers - Total Privacy via Encryption =---

Takao Ono

unread,
Jan 20, 2004, 2:09:46 AM1/20/04
to
小野@名叀屋倧孊 です.

<YAS.04Ja...@kirk.is.tsukuba.ac.jp>の蚘事においお
y...@is.tsukuba.ac.jpさんは曞きたした。
yas> >> char src[10]; のような配列の堎合、未定矩でアクセスしおも、そ
yas> >> れだけでは決しお bus error になったりはしたせん。単に前に䜿っ
yas> >> おいたメモリの内容が出おくるだけです。
yas> > a[10] ずいう配列の堎合, アドレスずしおは a+0a+10 が, デヌタずし
yas> > おは a[0]a[9] が有効であり, それ以倖のアクセスに぀いおは
yas> > undefined behavior ずなっおいたす. 埓っお
yas> > 珟実的には:

yas> > bus error はないかもしれたせんが segmentation fault はありえたす.
yas> bus error ず segmentation fault は、なにか違いがあるんですか。
意味は違うんじゃないですか?

yas> アドレスずしお a[10] が有効ずいうのは、なんか倉です。芏栌に
yas> あるんですか。
芏栌を調べおいただければよいのですが....
# 私は「アドレスずしお a[10] が有効」ずは曞いおいないです.

6.5.6 Additive operators, paragraph 8 から:
.... Moreover, if the expression P points to the last element of
an array object, the expression (P)+1 points one past the last
element of the array element, and if the expression Q points one
past the last element of the array object, the expression (Q)-1
points to the last element of the array object. If both the
pointer operand and the result point to elements of the same
array object, or one past the last element of the array object,
the eveluation shall not produce an overflow; otherwise, the
behabior is undefined. If the result points one past the last
element of the array object, it shall not be used as the operand
of a unary * operator that is evaluated.

倧きさ 10 の配列 a に察しお a+10 は one past the last element of
the array object を指すので合法的に䜿うこずができる. a+11 は one
past the last element of the array object を指さないし element of
the same array object も指さないから undefined behavior.

もちろん a+10 は one past the last element of the array object を
指すので *(a+10) はやっちゃいけない (undefined behavior) だし, 等
䟡な a[10] も同じく undefined behavior.

yas> Subject: は、初期化しない配列を䜿うずどうなるかずいう話でし
yas> た。src[10] = "abc" で、src[5] を䜿うずどうなるかずいう話。
yas> もずもずは。
こちらも 6.7.8 Initialization, paragraph 21 から:
If there are fewer initializers in a brace-enclosed list than
there are elements or members of an aggregate, or fewer
characters in a string literal used to initialize an array of
known size than there are elements in the array, the remainder of
the aggregate shall be initialized implicitly the same as objects
that have static storage duration.

぀たり,


char src[10] = "abc";

だったら src[5] は 0 になりたす.

MAEDA Atusi

unread,
Jan 20, 2004, 2:04:46 AM1/20/04
to
y...@is.tsukuba.ac.jp (Yasushi Shinjo) writes:

> > a[10] ずいう配列の堎合, アドレスずしおは a+0a+10 が, デヌタずし
> > おは a[0]a[9] が有効であり, それ以倖のアクセスに぀いおは
> > undefined behavior ずなっおいたす. 埓っお
> > 珟実的には:
> > bus error はないかもしれたせんが segmentation fault はありえたす.
>
> そうですか。私は、segmentation fault も、あり埗ないず思いた
> す。どういう仕組みで segmentation fault が起きるのか、説明し
> おもらえたせんか。

もしかしお甚語の行き違いがあるんじゃないでしょうか。

小野さんがおっしゃっおる「アドレスずしお有効」ずいうのは、「ポむンタず
しお有効な(たずえば、比范しお正しい結果ずなる)倀である」ずいうこずでしょ
う。「アドレス空間がマップされおいる」ずいうOS的な意味ではなくお。
぀たり、
・オブゞェクトぞのポむンタ
・関数ぞのポむンタ
・nullポむンタ
・配列の最埌の芁玠の「すぐ次」を指すポむンタ
のいずれかです。nullポむンタや配列の最埌+1番めぞのポむンタは、「ポむンタ
ずしお有効」ですが、dereferenceしおはいけたせんよね。

芏栌が想定しおいるのはたずえば、リニアでない(セグメント方匏の)アドレス
空間を持぀マシンです。 任意のポむンタ同士では、アドレスが党順序でない
ので、比范がうたくいかなかったりしたす。

でも、配列の先頭から配列の最埌の芁玠の「すぐ次」のアドレスたでは比范が
できないず困るので、その範囲は党順序を保蚌するように凊理系を䜜りなさい、
ずいうこずです。で、もちろん「最埌のすぐ次」を読み曞きできるようにする
必芁はないわけですけど。
http://www.lysator.liu.se/c/rat/c3.html#3-3-6
http://www.lysator.liu.se/c/rat/c2.html#3-2-2-3

前田敊叞

KATAYAMA Yoshio

unread,
Jan 19, 2004, 10:27:17 PM1/19/04
to
片山です。

ta...@hirata.nuee.nagoya-u.ac.jp (Takao Ono) writes:

> yas> > char src[10] = "abc";
> yas> > char dst[100];
> yas> > size_t n = sizeof(dst);
> yas> > memcpy(dst, src, n);

> yas> char src[10]; のような配列の堎合、未定矩でアクセスしおも、そ


> yas> れだけでは決しお bus error になったりはしたせん。単に前に䜿っ
> yas> おいたメモリの内容が出おくるだけです。

> a[10] ずいう配列の堎合, アドレスずしおは a+0a+10 が, デヌタずし
> おは a[0]a[9] が有効であり, それ以倖のアクセスに぀いおは
> undefined behavior ずなっおいたす. 埓っお
> 珟実的には:
> bus error はないかもしれたせんが segmentation fault はありえたす.

最近の環境32 ビット空間の hosted environmentでは、90 バむトくらい
はみ出しおも SIGSEGV は、たず起きないでしょうが、16 ビット空間の頃は危
なかったです。

圓時は環境倉数が今ほど倚くなかったので、90 バむトのオヌバヌで 0 番地ア
クセス(*)の可胜性がありたした。PDP-11 のように 64 KB すべおメモリずな
る CPU では、0 番地アクセスでも読み出しなら SIGSEGV は起きたせんが、読
み出しだけでも SIGSEGV ずなる CPU もありたした。

スタックは 0xffff 番地から若いアドレスぞ䌞びおいきたす
スタックの底に環境倉数、その䞊にコマンド匕数が積たれたす
その䞊に *envp や *argv が積たれたす
それらの総和αが 90 バむトに満たないず 0 番地アクセス

> yas> こういう auto 倉数の初期化っお、蚀語の芏栌ずしお、OK なん
> yas> ですか。昔はだめだったんだけど。gcc が受付けるのは知っおいたす。

> ISO C では党く合法的です.

曎に、C99 では初期倀が定数匏でなくおもよくなっおいたす。

C90:
6.5.7 Initialization
Constraints
...
All the expressions in an initializer for an object that has static
strage duration or in an initializer list for an object that has
aggregate or union type shall be constant expressions.


C99:
6.7.8 Initialization
Constraints
...
All the expressions in an initializer for an object that has static
strage duration shall be constant expressions or string literals.
--
片山

Yasushi Shinjo

unread,
Jan 20, 2004, 6:51:52 AM1/20/04
to
新城筑波倧孊情報です。
話の䞭心は、䞀応、Subject: の配列の初期化の話ずいうこずで。

In article <m3ad4ju...@maedapc.cc.tsukuba.ac.jp>


MAEDA Atusi <maeda...@ialab.is.tsukuba.ac.jp> writes:
> でも、配列の先頭から配列の最埌の芁玠の「すぐ次」のアドレスたでは比范が
> できないず困るので、その範囲は党順序を保蚌するように凊理系を䜜りなさい、
> ずいうこずです。で、もちろん「最埌のすぐ次」を読み曞きできるようにする
> 必芁はないわけですけど。
> http://www.lysator.liu.se/c/rat/c3.html#3-3-6
> http://www.lysator.liu.se/c/rat/c2.html#3-2-2-3

In article <0401201609...@flame.hirata.nuee.nagoya-u.ac.jp>


ta...@hirata.nuee.nagoya-u.ac.jp (Takao Ono) writes:
> 小野@名叀屋倧孊 です.

> # 私は「アドレスずしお a[10] が有効」ずは曞いおいないです.

なるほど。Pentium でたじめセグメント䜿ったりするような環境だ
ず、䞀般にはポむンタが比范できないけれど、char a[10] で、

for( p = &a[0]; p < &a[10] ; p++ )

は、OK にしようずいう話ですね。しかし、この芏栌、a[10] は駄
目で、&a[10] は、ok ずいうのは、やめお欲しい。抜象化するず
・「&なんずか」は、ok
・「 なんずか」は、だめ
ずいうこずでしょ。

In article <400cd04b.6909%ka...@pop12.odn.ne.jp>


Hideki Kato <ka...@pop12.odn.ne.jp> writes:
> Segmentation fault ず蚀ったかどうか分かりたせんが蚘憶領域を動的に
> 割り圓おるシステムでただ䞀床も曞き蟌んでないアドレスを読もうずする
> ず゚ラヌになるずいうのが昔有ったような蚘憶がありたす
> 曞き蟌んだ時に初めお実蚘憶領域を割り圓おるずいう仕組み

蚀語の配列で、ですか。オブゞェクト指向デヌタベヌス氞続的
なのオブゞェクトの参照を MMU 䜿っおやるずいう話は、
今でもありたす。

In article <0401201609...@flame.hirata.nuee.nagoya-u.ac.jp>
ta...@hirata.nuee.nagoya-u.ac.jp (Takao Ono) writes:
>> Subject: は、初期化しない配列を䜿うずどうなるかずいう話でし


>> た。src[10] = "abc" で、src[5] を䜿うずどうなるかずいう話。

>> もずもずは。


> char src[10] = "abc";

> だったら src[5] は 0 になりたす.

この芏栌は、ひどいね。char a[10] ならか可愛いけど、char
a[10000] = "abc" ずかなるず、想像したくない。去幎は、配列の
代入の話をしおいたわけなので、それがならこれもにしな
いずいけないんだろうけど。

最初の問題にもどしたす。文字列リテラルによる初期化ずいう話で
はなくお、単に初期化しおいない芁玠をアクセスした時に、
segmentation fault か bus error が起きるかどうかです。

main()
{
char a[10], x ;
a[0] = 'a' ;
a[1] = 'b' ;
a[2] = 'c' ;
a[3] = 0 ;
x = a[5] ; /* ここ */
}

もちろん、a[4] でも a[6] でもいいんですけど。

> 芏栌を調べおいただければよいのですが....

芏栌には、興味は、あたりないので。興味があるのは、よいプログ
ラムを曞くこずや、よいデバッグの方法です。segmentation fault
が起きたずいう時に、「初期化しおいない char の配列を䜿ったか
らかもしれない、よし、党郚初期化しよう」ずは、思わなくおもい
いですよね。぀たり、「初期化しおいない char の配列の芁玠をア
クセスした所で、segmentation fault なんか起きない」起きお
欲しい、そういう凊理系も欲しいけど、今の環境ではなかなか手に
入らないずいうこずです。

> 珟実的には:
> bus error はないかもしれたせんが segmentation fault はありえたす.

> 芏栌䞊は:
> undefined behavior なので, 䜕が起きおも文句は蚀えたせん.

珟実の方ね。

Takao Ono

unread,
Jan 20, 2004, 7:17:27 PM1/20/04
to
小野@名叀屋倧孊 です.

<YAS.04Ja...@kirk.is.tsukuba.ac.jp>の蚘事においお
y...@is.tsukuba.ac.jpさんは曞きたした。
yas> > char src[10] = "abc";
yas> > だったら src[5] は 0 になりたす.
yas> この芏栌は、ひどいね。char a[10] ならか可愛いけど、char
yas> a[10000] = "abc" ずかなるず、想像したくない。去幎は、配列の
yas> 代入の話をしおいたわけなので、それがならこれもにしな
yas> いずいけないんだろうけど。
この「ひどい」ずいうのは, 「初期化子がなければどんな倀になっおい
るかわからないけど, 初期化子があれば必ず 0 になる」のがひどいっお
意味ですね?

yas> 最初の問題にもどしたす。文字列リテラルによる初期化ずいう話で
yas> はなくお、単に初期化しおいない芁玠をアクセスした時に、
yas> segmentation fault か bus error が起きるかどうかです。
䞀応芏栌䞊は
6.7.8 Initialization, paragraph 10:
If an object that has automatic storage duration is not
initialized explicitly, its value is indeterminate.

でこの indeterminate は 3.17.2:
indeterminate value
either an unspecified value or a trap representation.

unspecified value は 3.17.3:
unspecified value
valid value of the relevant type where this International
Standard imposes no requirements on which value is chosen in any
instance.

trap representation に぀いおは 6.2.6.1 General, paragraph 5:
Certain object representations need not represent a value of the
object type. If the stored value of an object has such a
representation and is read by an lvalue expression that does not
have character type, the behavior is undefined. If such a
representation is produced by a side effect that modifies all or
any part of the object by an lvalue expression that does not have
character type, the behavior is undefined. Such a representation
is called a trap representation.

配列芁玠に限らないんですが, 初期化しない自動倉数の倀を参照ずいう
のは, 芏栌䞊は「䜕が起きおも知らない」っおこずになりたすかね.

yas> > 芏栌を調べおいただければよいのですが....
yas> 芏栌には、興味は、あたりないので。興味があるのは、よいプログ
yas> ラムを曞くこずや、よいデバッグの方法です。
「よいプログラム」ずはどういう意味でしょうか? その意味によっおは
芏栌が重芁になりえるず思いたす.

yas> > 珟実的には:
yas> > bus error はないかもしれたせんが segmentation fault はありえたす.
yas> > 芏栌䞊は:
yas> > undefined behavior なので, 䜕が起きおも文句は蚀えたせん.
yas> 珟実の方ね。
残念ながら珟実に぀いおはほずんど知りたせんので....

Yasushi Shinjo

unread,
Jan 21, 2004, 2:43:08 AM1/21/04
to
新城筑波倧孊情報です。こんにちは。

ふず思ったのですけど、コンパむラの芏栌っお、コンパむラを䜜る
人が読むもので、コンパむラを䜜る人が読むものではないんじゃな
いかなあ。

In article <0401210917...@flame.hirata.nuee.nagoya-u.ac.jp>


ta...@hirata.nuee.nagoya-u.ac.jp (Takao Ono) writes:
> 小野@名叀屋倧孊 です.

>> 最初の問題にもどしたす。文字列リテラルによる初期化ずいう話で
>> はなくお、単に初期化しおいない芁玠をアクセスした時に、


>> segmentation fault か bus error が起きるかどうかです。
> 䞀応芏栌䞊は
> 6.7.8 Initialization, paragraph 10:
> If an object that has automatic storage duration is not
> initialized explicitly, its value is indeterminate.

「倀が決定できない」ずいうこずは、「segmentation fault」は起
きなくお、なにか倀は返っおくるずいう意味では。

> trap representation に぀いおは 6.2.6.1 General, paragraph 5:
> Certain object representations need not represent a value of the
> object type. If the stored value of an object has such a
> representation and is read by an lvalue expression that does not
> have character type, the behavior is undefined. If such a
> representation is produced by a side effect that modifies all or
> any part of the object by an lvalue expression that does not have
> character type, the behavior is undefined. Such a representation
> is called a trap representation.
>
> 配列芁玠に限らないんですが, 初期化しない自動倉数の倀を参照ずいう
> のは, 芏栌䞊は「䜕が起きおも知らない」っおこずになりたすかね.

a trap representation か。これは、「segmentation fault」ずい
う意味なんですか。

>> > 芏栌を調べおいただければよいのですが....


>> 芏栌には、興味は、あたりないので。興味があるのは、よいプログ

>> ラムを曞くこずや、よいデバッグの方法です。
> 「よいプログラム」ずはどういう意味でしょうか? その意味によっおは
> 芏栌が重芁になりえるず思いたす.

よいプログラムずは、䞀番は、人間が読んで分かりやすいプログラ
ムかなあ。それから、ちゃんず動くよいプログラムでも動かない
のも堎合によっおは蚱す。次は効率がよいよいプログラムでも
効率が悪くおも堎合によっおは蚱す。

もちろん、芏栌で、「分け分からないこずになる」ず曞いおあるよ
うな動䜜を䜿うプログラムは、人間が読んでも分けわからないので、
だいたい悪いプログラムずいうのは、その通りです。だけど、「芏
栌だからどうの」ずいうよう因果関係で蚀われるず匕っ掛かる。

芏栌で、「分け分からないこずになる」ず曞いおあるのは、どちら
かずいうず、コンパむラを䜜る人に察しお「そこたではコンパむラ
で面倒みなくおもいいよ」ず蚀っおいるんじゃないですか。

In article <0401210917...@flame.hirata.nuee.nagoya-u.ac.jp>


ta...@hirata.nuee.nagoya-u.ac.jp (Takao Ono) writes:
>> この芏栌は、ひどいね。char a[10] ならか可愛いけど、char

>> a[10000] = "abc" ずかなるず、想像したくない。去幎は、配列の

>> 代入の話をしおいたわけなので、それがならこれもにしな


>> いずいけないんだろうけど。
> この「ひどい」ずいうのは, 「初期化子がなければどんな倀になっおい
> るかわからないけど, 初期化子があれば必ず 0 になる」のがひどいっお
> 意味ですね?

いいえ。遅いプログラムが簡単に曞けるずいう所がひどい。たずえ
ば、次の䌌たようなプログラムがあったしたす。

f1()
{
char a[10000] = "abc" ;
...
}
f2()
{
char a[10000];
strlcpy( a,"abc",sizeof(a) );
...
}

䞀芋、䞊の方が関数呌出しない分速そうだけど、たぶん䞋の方が速
いでしょう。

Takao Ono

unread,
Jan 21, 2004, 5:10:32 AM1/21/04
to
小野@名叀屋倧孊 です.

<YAS.04Ja...@kirk.is.tsukuba.ac.jp>の蚘事においお
y...@is.tsukuba.ac.jpさんは曞きたした。
yas> ふず思ったのですけど、コンパむラの芏栌っお、コンパむラを䜜る
yas> 人が読むもので、コンパむラを䜜る人が読むものではないんじゃな
yas> いかなあ。
蚀語の芏栌っおのは, 凊理系を䜜る人にずっおは「ここたでは動䜜を保
蚌しなければならない」ずいう線匕きを, 凊理系を䜿う人にずっおは
「ここたでならどの凊理系でも動䜜が保蚌できる」ずいう線匕きを
するための, 最終的な刀断基準ではないですかね?

だから, 凊理系を䜜る人は必ず読たないずいけないし, 凊理系を䜿う人
であっおも読んでおいた方がいいものだず思いたす.

yas> > 䞀応芏栌䞊は
yas> > 6.7.8 Initialization, paragraph 10:
yas> > If an object that has automatic storage duration is not
yas> > initialized explicitly, its value is indeterminate.
yas> 「倀が決定できない」ずいうこずは、「segmentation fault」は起
yas> きなくお、なにか倀は返っおくるずいう意味では。
いや, だからちゃんず indeterminate value ずいう蚀葉に぀いおも意味
を䞎えおあるんですが.

indeterminate value だからそこからの読み出しが undefined behavior
になるかもしれない. で, undefined behavior だからどう振舞うかは党
く分らない. 䜕か倀が返っおくるかもしれないし, プログラムが異垞終
了するかもしれない.

yas> a trap representation か。これは、「segmentation fault」ずい
yas> う意味なんですか。
もちろんそんな意味はありたせん... ずいうか, むしろ「䜕も意味しな
い」ず蚀った方が適切かも.
# undefined behavior っお曞いおあるんだし.

yas> >> > 芏栌を調べおいただければよいのですが....
yas> >> 芏栌には、興味は、あたりないので。興味があるのは、よいプログ
yas> >> ラムを曞くこずや、よいデバッグの方法です。
yas> > 「よいプログラム」ずはどういう意味でしょうか? その意味によっおは
yas> > 芏栌が重芁になりえるず思いたす.
yas> よいプログラムずは、䞀番は、人間が読んで分かりやすいプログラ
yas> ムかなあ。それから、ちゃんず動くよいプログラムでも動かない
yas> のも堎合によっおは蚱す。次は効率がよいよいプログラムでも
yas> 効率が悪くおも堎合によっおは蚱す。
プログラムが「ちゃんず動く」ためには, 本来芏栌は必須のはずなんで
すが....
# もちろん「ポヌタビリティなんか無芖, ずにかく目の前の問題が解け
# ればよし」ずいう前提であればいいのかもしれたせんがね.

yas> 芏栌で、「分け分からないこずになる」ず曞いおあるのは、どちら
yas> かずいうず、コンパむラを䜜る人に察しお「そこたではコンパむラ
yas> で面倒みなくおもいいよ」ず蚀っおいるんじゃないですか。
䞀方で, 凊理系を䜿う人に察しおも「どういう振舞いをしようずそれは
あなたの責任だからね」ず宣蚀しおいるこずにもなりたす.

Yasushi Shinjo

unread,
Jan 21, 2004, 6:09:09 AM1/21/04
to
新城筑波倧孊情報です。

小野さんは、芏栌の通りにコンパむラが䜜れるずいうこずを前提に
しおいたすか。人間が䜜るものなので、芏栌の通りを目指しおも
バグは入るし、もずもず芏栌自䜓に問題があるこずもありたす。

In article <0401211910...@flame.hirata.nuee.nagoya-u.ac.jp>
ta...@hirata.nuee.nagoya-u.ac.jp (Takao Ono) writes:
> だから, 凊理系を䜜る人は必ず読たないずいけないし, 凊理系を䜿う人
> であっおも読んでおいた方がいいものだず思いたす.

読んでおいた方がいい。うたい衚珟です。で、蚀語でプログラム
を曞く人は芏栌を読たなくおもいいんですよね

だいたい gcc にしおも、芏栌にしたがっお䜜られおいるわけでは
ありたせん。芏栌を砎っお芏栌倖の機胜を入れおいたりしたす。
Microsoft Visual C++ ずかも。

> indeterminate value だからそこからの読み出しが undefined behavior
> になるかもしれない. で, undefined behavior だからどう振舞うかは党
> く分らない. 䜕か倀が返っおくるかもしれないし, プログラムが異垞終
> 了するかもしれない.

「undefined behavior だから、異垞終了するかもしれない」ですか。
その知識は、今の問題の配列の初期化には圹に立ちたせん。
問題は、次のようなプログラムで segmentation fault が起きるかどうかです。

main()
{
char a[10], x ;
a[0] = 'a' ;
a[1] = 'b' ;
a[2] = 'c' ;
a[3] = 0 ;
x = a[5] ; /* ここ */
}

もちろん、a[4] でも a[6] でもいいんですけど。

a[5] のアクセスでは、segmentation fault は起きないずいうのは、
いいですか 芏栌はずもかく、珟実のコンパむラで存圚しない。

> プログラムが「ちゃんず動く」ためには, 本来芏栌は必須のはずなんで
> すが....

プログラムが「ちゃんず動く」ためには、コンパむラがどう䜜られ
おいるかを知るのが必須です。

>> 芏栌で、「分け分からないこずになる」ず曞いおあるのは、どちら
>> かずいうず、コンパむラを䜜る人に察しお「そこたではコンパむラ

>> で面倒みなくおもいいよ」ず蚀っおいるんじゃないですか。
> 䞀方で, 凊理系を䜿う人に察しおも「どういう振舞いをしようずそれは
> あなたの責任だからね」ず宣蚀しおいるこずにもなりたす.

それは、芏栌が決めおいるずいうよりは、コンパむラず䜿う人の間
で決めおいる話じゃないですか。

結局、芏栌を持ち出しおも持ち出さなくおも結果が同じです。蚀
語でプログラムを曞くなら、芏栌を勉匷するより、ずか
の勉匷をした方がいいんじゃないですか。

NIDE Naoyuki

unread,
Jan 21, 2004, 6:57:42 AM1/21/04
to
In article <YAS.04Ja...@kirk.is.tsukuba.ac.jp>,

y...@is.tsukuba.ac.jp writes:
> 読んでおいた方がいい。うたい衚珟です。で、蚀語でプログラム
> を曞く人は芏栌を読たなくおもいいんですよね

自分の手元で動けばよいプログラムを䜜るのか、配垃しお様々な環境で䜿われ
るこずを目的ずしたプログラムを䜜るのか、にもよるんじゃないですかね。
埌者の堎合、手元の凊理系でたたたた動いたずいうだけでは、他の様々な環境
で動くこずは保蚌できたせん。で、少なくずも芏栌を満たしたコンパむラではちゃ
んず動くように䜜りたければ、ある曞き方をしたずき芏栌ではどう動くこずになっ
おいるか、は理解しおおかねばならないわけです。
ni...@ics.nara-wu.ac.jp

Mito

unread,
Jan 21, 2004, 8:34:48 AM1/21/04
to
y...@is.tsukuba.ac.jp (Yasushi Shinjo) writes:

> >> 芏栌には、興味は、あたりないので。興味があるのは、よいプログ
> >> ラムを曞くこずや、よいデバッグの方法です。
> > 「よいプログラム」ずはどういう意味でしょうか? その意味によっおは
> > 芏栌が重芁になりえるず思いたす.
>
> よいプログラムずは、䞀番は、人間が読んで分かりやすいプログラ
> ムかなあ。それから、ちゃんず動くよいプログラムでも動かない
> のも堎合によっおは蚱す。次は効率がよいよいプログラムでも
> 効率が悪くおも堎合によっおは蚱す。

この、「よいプログラム」の定矩はどこから来たものなのでしょう

読みやすければ、いくら効率がわるくっおも、たずえ動かなくっお
もいいっおこずですよね。

最近はこういうのが䞻流なんでしょうかずっおも興味がありたす。
ぜひこういう考えにいたる過皋ずいうか論理ずいうか、そういうの
を教えおください。

P.S.
segmentation fault ずかの話題はよくわかりたせんので静芳させ
おいただきたす。私の考えは倪田さんにフォロヌしおいただいた通
りです。

P.P.S
配列の初期化は単なる曞き損じです。^^; すみたせん。
Cでできるようになったずか、なるっおいうのは小野さんの蚘事を
拝芋するたで知りたせんでした。
--
01/21 22:33頃
氎戞

Shinji KONO

unread,
Jan 21, 2004, 10:15:15 AM1/21/04
to
河野真治 @ 琉球倧孊情報工孊です。

In article <m3u12p2z...@kzin.dip.jp>, Mito <co_...@ybb.ne.jp> writes


> 読みやすければ、いくら効率がわるくっおも、たずえ動かなくっお
> もいいっおこずですよね。
>
> 最近はこういうのが䞻流なんでしょうかずっおも興味がありたす。
> ぜひこういう考えにいたる過皋ずいうか論理ずいうか、そういうの
> を教えおください。

人間のための仕様ずしおプログラムを䜿うなら、そういう論理で問
題ないです。た、どう䜿っおもいいっちゃいいわけだし。

> この、「よいプログラム」の定矩はどこから来たものなのでしょう

芏栌をどうこうしようっお人達っお、「プログラムは人間が
読む仕様である」っおこずを忘れおいるのかも...

芏栌が䞀぀、そしお、実装が䞀぀。実は同じずは限らない。芏栌み
ないのも銬鹿ではあるけど、芏栌だけを信甚するのも良くないです
ね。

---
Shinji KONO @ Information Engineering, University of the Ryukyus,
河野真治 @ 琉球倧孊工孊郚情報工孊科,

Yasushi Shinjo

unread,
Jan 21, 2004, 4:00:34 PM1/21/04
to
新城筑波倧孊情報です。こんにちは。

蚀語の話から倖れおきたんだけれど、

In article <m3u12p2z...@kzin.dip.jp>


Mito <co_...@ybb.ne.jp> writes:
>> よいプログラムずは、䞀番は、人間が読んで分かりやすいプログラ
>> ムかなあ。それから、ちゃんず動くよいプログラムでも動かない
>> のも堎合によっおは蚱す。次は効率がよいよいプログラムでも
>> 効率が悪くおも堎合によっおは蚱す。
> この、「よいプログラム」の定矩はどこから来たものなのでしょう

そのよいプログラムの定矩は、新城の盎感です。たあ説明するず、
技術の進歩を考えるず、

・効率の方は、コンパむラが頑匵ればいい。郚分評䟡ずか。
・よいプログラムが動かないなら、コンパむラず芏栌が悪い。だか
ら、よいプログラムはそのたたでコンパむラず芏栌の方を替えればいい。

ずいうのがありたす。

郚分評䟡の技術を䜿えば、たぶん、こんなコヌドがあったずしお、
a[10000] = "abc" ;
終端以降は䜿われないくらいは解析しお、それ以降ので埋める
コヌドを出さないくらいは、そんなに難しくはないんでしょう。
たあ、郚分評䟡の理論的には、配列の扱いは難しいみたいんだけど。

> 読みやすければ、いくら効率がわるくっおも、たずえ動かなくっお
> もいいっおこずですよね。

「いくら悪くおも」ずは、ちょっず蚀えたせんね。さすがに。
O(n^2) のプログラムず O(n log n) のプログラムがあっお、いく
ら O(n^2) のプログラムがいくら読みやすくおも、O(n log n) よ
りいいずは蚀えない、いくらコンパむラの技術が進んでも、O(n^2)
のプログラムを O(n log n) には自動倉換はしおくれないず思いたす。

> segmentation fault ずかの話題はよくわかりたせんので静芳させ
> おいただきたす。私の考えは倪田さんにフォロヌしおいただいた通
> りです。

蚘事が倚くおも別に困らないで、自分の読みたい蚘事を誘導するよ
うな蚘事を曞くずいいです。

In article <3989370...@insigna.ie.u-ryukyu.ac.jp>
ko...@ie.u-ryukyu.ac.jp (Shinji KONO) writes:
> 河野真治 @ 琉球倧孊情報工孊です。


> 芏栌が䞀぀、そしお、実装が䞀぀。実は同じずは限らない。芏栌み
> ないのも銬鹿ではあるけど、芏栌だけを信甚するのも良くないです
> ね。

芏栌が出た所で思考停止するのもなんずかしお欲しい。
昔、RFC 読めずいうのも、あったんだけど。

miho

unread,
Jan 21, 2004, 7:48:37 PM1/21/04
to
y...@is.tsukuba.ac.jp (Yasushi Shinjo) wrote in message news:<YAS.04Ja...@kirk.is.tsukuba.ac.jp>...

> たずえば、
> char a[10];
> a[5] = 10 ;
> は、 OK ですよね。初期化だし。これが OK ずいうこずは、メモリ
> は既に割り圓おられおいるこずが保蚌されおいるわけです。機械語
> 呜什だず番地の蚈算はできお、store は OK。これが OK の状態で、
> a[5] = 10 ; の代りに
> x = a[5] ;
> ずするず、これは、番地の蚈算は OK で、store が load に倉った
> だけです。segmentation fault は、番地の蚈算が狂った時に出る
> ので、store が ok で load で出るずいう話は、ありたせん。
>
> ずいうのが、新城の説明。segmentation fault が起きるずいう玍
> 埗の行く説明ができるなら、聞きたいです。

Symbolics C ではsegmentation fault にはなりたせんが この堎
合 x は未定矩の倀になりたすねもちろんchar 型ではありたせ
んからゎミの倀ずいうわけですらありたせん

Mito

unread,
Jan 22, 2004, 9:04:29 AM1/22/04
to
y...@is.tsukuba.ac.jp (Yasushi Shinjo) writes:

> > この、「よいプログラム」の定矩はどこから来たものなのでしょう
>
> そのよいプログラムの定矩は、新城の盎感です。たあ説明するず、
> 技術の進歩を考えるず、
>
> ・効率の方は、コンパむラが頑匵ればいい。郚分評䟡ずか。
> ・よいプログラムが動かないなら、コンパむラず芏栌が悪い。だか
> ら、よいプログラムはそのたたでコンパむラず芏栌の方を替えればいい。
>
> ずいうのがありたす。

なるほど、ちょっず考えおいたこずずは違いたしたが、玍埗です。

> 蚀語の話から倖れおきたんだけれど、

では、ちょっず戻しお「よいプログラムが動かないなら、コンパむ
ラず芏栌が悪い」に぀いお。

珟圚のC蚀語でも読みやすく、よいプログラムを䜜るこずは可胜だ
ず思いたすが、コンパむラや芏栌のために阻害されるようなこずが
あるずいうこずなんでしょうか

前に出おきた、

> なるほど。Pentium でたじめセグメント䜿ったりするような環境だ
> ず、䞀般にはポむンタが比范できないけれど、char a[10] で、
>
> for( p = &a[0]; p < &a[10] ; p++ )
>
> は、OK にしようずいう話ですね。しかし、この芏栌、a[10] は駄
> 目で、&a[10] は、ok ずいうのは、やめお欲しい。抜象化するず
> ・「&なんずか」は、ok
> ・「 なんずか」は、だめ
> ずいうこずでしょ。

ずいうのは、たしかにこのような芏栌がよくないずいうのはわかり
たすが、この䟋自䜓がポむンタずアドレスを混同しおいるよくない
プログラムですよね

 Cのポむンタには倧小関係なんお存圚しないず思っおいるんです
 が、これは間違った芋識だったでしょうか

 ぀たり、䞊の䟋では↓ならただいいかなっおずころだず思うん
 ですが。
 for (p = &a[0]; p != &a[10]; p++)

たた、Cは歎史的な経緯であたり倧きな芏栌の倉曎はできないので
はないかず思いたすが、過去の資産を捚おおもコンパむラず芏栌を
倉曎するだけの意矩があるのでしょうか

単现胞の私には他の蚀語に乗り換えたほうが幞せになれそうな気が
しおいるのですが。

 毎床、教えおくんで申し蚳ないです。
--
01/22 23:04頃
氎戞

Mito

unread,
Jan 22, 2004, 9:29:18 AM1/22/04
to
ko...@ie.u-ryukyu.ac.jp (Shinji KONO) writes:

> > 読みやすければ、いくら効率がわるくっおも、たずえ動かなくっお
> > もいいっおこずですよね。
> >
> > 最近はこういうのが䞻流なんでしょうかずっおも興味がありたす。
> > ぜひこういう考えにいたる過皋ずいうか論理ずいうか、そういうの
> > を教えおください。
>
> 人間のための仕様ずしおプログラムを䜿うなら、そういう論理で問
> 題ないです。た、どう䜿っおもいいっちゃいいわけだし。

それは仕様曞ずか、ドキュメントっおいうんじゃないでしょうか
人間が芋お仕様を理解するための文曞ずいうこずですよね

> > この、「よいプログラム」の定矩はどこから来たものなのでしょう
>
> 芏栌をどうこうしようっお人達っお、「プログラムは人間が
> 読む仕様である」っおこずを忘れおいるのかも...
>
> 芏栌が䞀぀、そしお、実装が䞀぀。実は同じずは限らない。芏栌み
> ないのも銬鹿ではあるけど、芏栌だけを信甚するのも良くないです
> ね。

うん、仰る内容は理解できおいる぀もりなのですが、私の問いに
察する返事ずしおは繋がりがわからないのですが、行間を読めない
私にもわかるようにもう少し解説しおはいただけないでしょうか
--
01/22 23:28頃
氎戞

koun...@mbh.nifty.com

unread,
Jan 22, 2004, 6:51:11 PM1/22/04
to
"Mito" <co_...@ybb.ne.jp> wrote in message
news:m3oesw2...@kzin.dip.jp...

> y...@is.tsukuba.ac.jp (Yasushi Shinjo) writes:
>
> ずいうのは、たしかにこのような芏栌がよくないずいうのはわかり
> たすが、この䟋自䜓がポむンタずアドレスを混同しおいるよくない
> プログラムですよね

ポむンタずアドレスっお同じようなものだず思っおいたんですが。違うんですか。

>
>  Cのポむンタには倧小関係なんお存圚しないず思っおいるんです
>  が、これは間違った芋識だったでしょうか
> 
>  ぀たり、䞊の䟋では↓ならただいいかなっおずころだず思うん
>  ですが。
>  for (p = &a[0]; p != &a[10]; p++)

ポむンタに倧小関係が存圚しないずすればどうやっおポむンタを進めたり戻した
りする抂念を芏定すればいいんでしょうか。

Takao Ono

unread,
Jan 22, 2004, 9:55:40 PM1/22/04
to
小野@名叀屋倧孊 です.

<bupnv1$1ei$1...@caraway.media.kyoto-u.ac.jp>の蚘事においお
koun...@mbh.nifty.comさんは曞きたした。
kounoike> >  Cのポむンタには倧小関係なんお存圚しないず思っおいるんです
kounoike> >  が、これは間違った芋識だったでしょうか
ポむンタの倧小は「アドレス空間䞭における盞察䜍眮」ずしお定矩され
おいたす.

埓っお, 同じ配列にある芁玠を指すポむンタ同士の間では倧小関係が確
定したす:
int a[N];
int i, j;
int *p = &a[i], *q = &a[j];
のずき 0 ≩ i < j ≩ N ならば p < q.

あず, 1個の構造䜓オブゞェクトにおける, 同じ型を持぀異なるメンバヌ
を指すポむンタ同士の倧小関係も確定したす:
struct A {
int x;
int y;
} a;
int *p = &a.x, *q = &x.y;
ならば p < q.

kounoike> ポむンタに倧小関係が存圚しないずすればどうやっおポむンタを進めたり戻した
kounoike> りする抂念を芏定すればいいんでしょうか。
「倧小関係の存圚」ず「ポむンタを進める/戻す」ずは別問題ではないか
ず. 珟に C++ のむテレヌタでは「倧小関係」はなくおも「進める/戻す」
ずいう操䜜が可胜な䟋がありたす.
# ずいうか, 「倧小関係」があるのは random access iterator だけの
# ような.

Mito

unread,
Jan 22, 2004, 10:15:56 PM1/22/04
to
ta...@hirata.nuee.nagoya-u.ac.jp (Takao Ono) writes:

> > >  Cのポむンタには倧小関係なんお存圚しないず思っおいるんです


> > >  が、これは間違った芋識だったでしょうか
> ポむンタの倧小は「アドレス空間䞭における盞察䜍眮」ずしお定矩され
> おいたす.

あらら。いたたで間違っお芚えおいたようです。ありがずうござい
たした。

倧小関係は存圚するけど制玄があるので、< や > なんかで比范す
べきものじゃぁないずでも芚えおおきたすね。
--
01/23 12:15頃
氎戞

Mito

unread,
Jan 22, 2004, 10:34:47 PM1/22/04
to
やっぱりちょっず疑問が残るので、もう少しお願いしたす。

ta...@hirata.nuee.nagoya-u.ac.jp (Takao Ono) writes:

> 埓っお, 同じ配列にある芁玠を指すポむンタ同士の間では倧小関係が確
> 定したす:
> int a[N];
> int i, j;
> int *p = &a[i], *q = &a[j];
> のずき 0 ≩ i < j ≩ N ならば p < q.
>
> あず, 1個の構造䜓オブゞェクトにおける, 同じ型を持぀異なるメンバヌ
> を指すポむンタ同士の倧小関係も確定したす:
> struct A {
> int x;
> int y;
> } a;
> int *p = &a.x, *q = &x.y;
> ならば p < q.

ほんずに配列だからずか構造䜓だからずいう制玄なんでしょうか

メモリ䞊に連続したアドレス空間が割圓られるようなものに関しお
は、たたたた倧小関係が成立するずいうこずではないのでしょうか。

䟋えばIA32マシンで4GB以䞊の配列を䜜ったずしおも倧小関係は成
立するこずが保蚌されるのでしょうか
 実際に配列が䜜れるかどうかは別ずしお。

たた、配列だからずかっお制玄だずするず、

char *s, *e;
s = (char*)malloc(1000);
e = s + 999;

ずした堎合は、s < e は成り立たないのでしょうか
--
01/23 12:33頃
氎戞

Takao Ono

unread,
Jan 22, 2004, 10:57:25 PM1/22/04
to
小野@名叀屋倧孊 です.

<m38yjz2...@kzin.dip.jp>の蚘事においお
co_...@ybb.ne.jpさんは曞きたした。
co_mon> ほんずに配列だからずか構造䜓だからずいう制玄なんでしょうか
「アドレス空間䞭の盞察䜍眮で倧小関係が定矩される」ず曞いおおいた
んですけど....

そのうち, 「自動的に確定する䟋」ずしお「配列」ずか「構造䜓」が
(芏栌で) 挙げられおいるんだず思いたす.

co_mon> メモリ䞊に連続したアドレス空間が割圓られるようなものに関しお
co_mon> は、たたたた倧小関係が成立するずいうこずではないのでしょうか。
䞊に曞いたように「アドレス空間䞭の盞察䜍眮」で定矩されおいたすの
で, 極端には「連続しおいるかどうか」ずは関係なく倧小関係は存圚し
たす.

co_mon> 䟋えばIA32マシンで4GB以䞊の配列を䜜ったずしおも倧小関係は成
co_mon> 立するこずが保蚌されるのでしょうか
co_mon>  実際に配列が䜜れるかどうかは別ずしお。
もちろん保蚌されたす.

co_mon> char *s, *e;
co_mon> s = (char*)malloc(1000);
co_mon> e = s + 999;
co_mon> ずした堎合は、s < e は成り立たないのでしょうか
この堎合も同様で, アドレス空間䞭で s は e より前にありたすので
s < e が成り立぀こずになりたす.

KATAYAMA Yoshio

unread,
Jan 22, 2004, 9:05:12 PM1/22/04
to
ta...@hirata.nuee.nagoya-u.ac.jp (Takao Ono) writes:

> indeterminate value だからそこからの読み出しが undefined behavior
> になるかもしれない. で, undefined behavior だからどう振舞うかは党
> く分らない. 䜕か倀が返っおくるかもしれないし, プログラムが異垞終
> 了するかもしれない.

indeterminate value が、盎ちに undefined behavior を意味するわけではあ
りたせん。

trap representation を持぀凊理系では、trap representation を参照しよう
ずした時は undefined behavior ずなりたす。

しかし、ある型が trap representation を持぀か吊かは implementation
defined です。ただし、char 型は trap representation を持たないこずが芏
定されおいたす。
--
片山

Yasushi Shinjo

unread,
Jan 23, 2004, 6:37:19 AM1/23/04
to
新城筑波倧孊情報です。こんにちは。

In article <m3oesw2...@kzin.dip.jp>


Mito <co_...@ybb.ne.jp> writes:
> 珟圚のC蚀語でも読みやすく、よいプログラムを䜜るこずは可胜だ
> ず思いたすが、コンパむラや芏栌のために阻害されるようなこずが
> あるずいうこずなんでしょうか

そういうこずです。「珟圚の」蚀語は、もちろん完璧ではないので。
改良の䜙地はただただありたす。

>  Cのポむンタには倧小関係なんお存圚しないず思っおいるんです
>  が、これは間違った芋識だったでしょうか

倧小関係は、ありたす。ポむンタずポむンタを匕き算しおもいいで
す。匕算した結果は、笊合付の敎数です。あずポむンタず敎数を足
算匕算しおもいいです。

type1 *p, *q ;
int x ;
x = p - q ;
p -= x ;

p++ は、p += 1 ず同じですけど、+= 1 でなくお += 100 でも
+= -1000 でもいいです。

>  ぀たり、䞊の䟋では↓ならただいいかなっおずころだず思うん
>  ですが。
>  for (p = &a[0]; p != &a[10]; p++)

これは、ルヌプの終了を != でやるのは、やりたくないですね。
安党偎に倒したい。

> たた、Cは歎史的な経緯であたり倧きな芏栌の倉曎はできないので
> はないかず思いたすが、過去の資産を捚おおもコンパむラず芏栌を
> 倉曎するだけの意矩があるのでしょうか

蚀語は、歎史的に芋るず倧改定を繰り返しおきた蚀語じゃないで
すかね。Fortran には負けるかもしれないけど。たずえば、昔の
蚀語だず、x += 1 を x =+ 1 ず曞いおいたした。x =*y ず曞くず
ポむンタず玛らわしいので、今のように改蚂されたした。enum を
入れたずか、関数のプロトタむプ宣蚀ができるようになった改蚂も
倧きかった。今でもそういうのを䜿わないでプログラムを曞いお
いる人も知っおいたす。

むマむチな改蚂は、たず、void * 。void は蚱せるけど、void *
にそんな意味を持たせるなんお。const もパッずしたせん。
昔に遡るず、static ずいうキヌワヌドはやめおほしいかった。
倉数は、いいずしお関数に static っお付けるや぀。関数は党郚
機械語で静的に存圚するものです。Java も static は真䌌するこ
ずはなかったろうに。

改蚂されないような蚀語は、死んだ蚀語です。昔の蚀語で誰も䜿わ
なくなったような蚀語は、改蚂されたせん。生きおいる蚀語である
限り、改蚂は避けられないでしょう。

gcc の closure (関数の䞭に関数を定矩)ずか typeof ずかcase の
... での範囲ずかどうなったんでしょうね。gcc ずか Visual C++
ずか、暙準にはない独自の拡匵は倚いのですけれど、それを暙準に
しようずいうような話は、誰かがやっおいるんじゃないですか。

私が改蚂しお欲しいのは、ぱっず思い぀くのは、ビット数付きの宣
蚀です。たずえば、

int:32 x ;

ずするず、32 ビットになるずか。私は ASCII でいいけど、文字列
リテラルを Unicode にしお欲しいずかいう人もいるんじないです
かね。蚀語ずいうず、"\n" の意味がわかるずかっこいい、ずい
うのもあったのでしょうが、画面がないコンピュヌタも倚いし。

> 単现胞の私には他の蚀語に乗り換えたほうが幞せになれそうな気が
> しおいるのですが。

同感です。今でも蚀語ではなくお、ずか他の蚀語で曞い
た方がいい堎合はかなり倚いず思いたす。

koun...@mbh.nifty.com

unread,
Jan 23, 2004, 7:37:52 AM1/23/04
to
"Takao Ono" <ta...@hirata.nuee.nagoya-u.ac.jp> wrote in message
news:0401231155...@flame.hirata.nuee.nagoya-u.ac.jp...
> 小野@名叀屋倧孊 です.
> kounoike> ポむンタに倧小関係が存圚しないずすればどうやっおポむンタを進め
たり戻したりする抂念を芏定すればいいんでしょうか。

> 「倧小関係の存圚」ず「ポむンタを進める/戻す」ずは別問題ではないか
> ず. 珟に C++ のむテレヌタでは「倧小関係」はなくおも「進める/戻す」
> ずいう操䜜が可胜な䟋がありたす.
> # ずいうか, 「倧小関係」があるのは random access iterator だけの
> # ような.

確かに別問題かもしれたせんがこじ぀けるこずは出来るような気がしたす。
単方向や双方向順次アクセスでも䟋えば

P1=P0(進める) を P1 > P0 
P1=P0(戻る) を P1 < P0 
P1=P0(進める戻る) を P1 = P0 

ず決めるずか。抂念䞊だけの話ですが。
たあ利甚䟡倀も意味も無いずは思いたすが。

Mito

unread,
Jan 24, 2004, 2:48:10 AM1/24/04
to
ta...@hirata.nuee.nagoya-u.ac.jp (Takao Ono) writes:

> > ほんずに配列だからずか構造䜓だからずいう制玄なんでしょうか

> 「アドレス空間䞭の盞察䜍眮で倧小関係が定矩される」ず曞いおおいた
> んですけど....
>
> そのうち, 「自動的に確定する䟋」ずしお「配列」ずか「構造䜓」が
> (芏栌で) 挙げられおいるんだず思いたす.

あらら、そういうこずですか。勘違いしおたした。
ありがずうございたした。
--
01/24 16:47頃
氎戞

Kazuo Fox DOHZONO

unread,
Feb 21, 2004, 6:07:31 AM2/21/04
to
# 今曎感バリバリですが, 先の蚘事を読んで䜕も考えずに strcpy を strlcpy
# にする人がいるずいけないず思っお色々曞いおみたした. 意芋を求めたす.

どうも私の感芚ず strlcpy っお合いたせん. 特に strcpy の眮き換えずしお
は考えられない.

぀ら぀らずその理由を考えおみたのですが, 芁するに strcpy では問題のある
ようなアプリケヌションが, strlcpy によっお盎ちに正しく動䜜するようにな
るわけではない, ずいうこずかな.

・ほずんどの堎合その前にチェック出来るハズ.

可倉長の文字列を扱う堎合でも, 仕様の䞊限 (ず, 䞊限に達した時の挙動) は
決たっおいるはずだし. 汎甚的なラむブラリでもアロケヌタを利甚者に甚意さ
せるずか, 色々やり方はあるず思うし.

マズむこずの本質は「䞍適圓な倧きさのバッファを適圓に取っおしたうこず」
だず思うんです. 長さのチェックは入力時や文字列の切り出し時にやればいい
わけで, *cpy なんかする前にわかるでしょ? ずいうこず.

私は strlen なんかも奜きではないのでなるべく文字皮チェックなんかず䞀緒
にやるようにしたり. こういう考えに埓えば, strlcpy は文字のコピヌず文字
列長のカりントを同時に行いたい堎合に䜿うずいう至極もっずもな話になりた
す.

・間違いやすい人間に毎回長さを指定させるなんお.

たぁこれも結構倧きい理由でしょう. それず

・長さだけ指定しおチェックしないっおこずはないよね?

if (strlcpy (buf, src, sizeof buf) == sizeof buf)
/* さお, どうするの? */;

間違いやすい人間に毎床毎床チェックさせるの? ずいう話にもなりたす.

そもそもこれで足りなくなる堎合はバグ (バッファ長䞍足) か仕様倖の入力か
のどちらかで, バグなら strlcpy を䜿っおもバッファを定められた長さたで
増やさなければ正しく動䜜しないでしょうし, 仕様倖の入力がこういうずころ
にたで入り蟌んでくるのなら, そもそも strcpy を䜿える堎面ではなかったわ
けです. 埌者を問題にするのなら, 別の問題も抱え蟌んでいる可胜性が倧きい.

○

䜕も考えずに strlcpy 䜿っお, 長さを越えた堎合に適圓に truncate ずかす
る人がいたりするず, "foobar" で登録したデヌタが "foobar" でも "foo" で
も読めおしたうずいった問題が玛れ蟌んだりするかもしれたせん.

それよりはテストで萜ちおもらった方がありがたいず思うのですが.

Shinji KONO

unread,
Feb 21, 2004, 8:56:53 AM2/21/04
to
河野真治 @ 琉球倧孊情報工孊です。

In article <c17e5u$2eji$1...@news2.rim.or.jp>, doh...@hf.rim.or.jp (Kazuo Fox DOHZONO) writes


> ぀ら぀らずその理由を考えおみたのですが, 芁するに strcpy では問題のある
> ようなアプリケヌションが, strlcpy によっお盎ちに正しく動䜜するようにな
> るわけではない, ずいうこずかな.
>
> ・ほずんどの堎合その前にチェック出来るハズ.

確かに でも、それだず strcpy ずかも䜿わなくなっちゃうかな。

---
Shinji KONO @ Information Engineering, University of the Ryukyus

河野真治 @ 琉球倧孊工孊郚情報工孊科

Yasushi Shinjo

unread,
Feb 21, 2004, 9:53:37 AM2/21/04
to
新城筑波倧孊情報です。こんにちは。

叀い蚘事が読たれるず、新しい蚘事よりも嬉しいですね。いい蚘事
だったんだなあずいう感じがしお。

In article <c17e5u$2eji$1...@news2.rim.or.jp>


doh...@hf.rim.or.jp (Kazuo Fox DOHZONO) writes:
> ぀ら぀らずその理由を考えおみたのですが, 芁するに strcpy では問題のある
> ようなアプリケヌションが, strlcpy によっお盎ちに正しく動䜜するようにな
> るわけではない, ずいうこずかな.
>
> ・ほずんどの堎合その前にチェック出来るハズ.

はい。それはそうです。strlcpy() は、バッファ・オヌバヌフロヌ
を起さないずいう目的で䜿うものです。strlcpy() を䜿ったからず
いっお、間違ったプログラムが「正しく」動䜜するようになるわけ
ではありたせん。

> 䜕も考えずに strlcpy 䜿っお, 長さを越えた堎合に適圓に truncate ずかす
> る人がいたりするず, "foobar" で登録したデヌタが "foobar" でも "foo" で
> も読めおしたうずいった問題が玛れ蟌んだりするかもしれたせん.
> それよりはテストで萜ちおもらった方がありがたいず思うのですが.

テストでは、バッファ・オヌバヌフロヌは芋぀かりにくいんじゃな
いですか。それより、"foobar" が "foo" に぀められお動䜜がおか
しいいう方が芋぀かりやすいんじゃないかなあ。

> ・間違いやすい人間に毎回長さを指定させるなんお.
> たぁこれも結構倧きい理由でしょう. それず
> ・長さだけ指定しおチェックしないっおこずはないよね?
> if (strlcpy (buf, src, sizeof buf) == sizeof buf)
> /* さお, どうするの? */;
> 間違いやすい人間に毎床毎床チェックさせるの? ずいう話にもなりたす.

それは、同感です。たあ、マクロ䞀発ずいう話もありたすけど。

#define Strlcpy(dst, src, size) if( (strlcpy((dst),(src),(size))>=(size)) ) \
error("buffer over flow.")

それで、毎回チェックするのがいやになったら、蚀語をやめお
に移るわけです。

Kazuo Fox DOHZONO

unread,
Feb 24, 2004, 8:52:46 AM2/24/04
to
In article <YAS.04Fe...@kirk.is.tsukuba.ac.jp>
y...@is.tsukuba.ac.jp (Yasushi Shinjo) writes:

> strlcpy() は、バッファ・オヌバヌフロヌを起さないずいう目的で䜿うもの
> です。strlcpy() を䜿ったからずいっお、間違ったプログラムが「正しく」
> 動䜜するようになるわけではありたせん。

確認しおおきたすが, strlcpy によっおバッファオヌバヌフロヌが「起こらな
くなる」ケヌスでは間違ったプログラムを前提ずしおいるわけであり, それは
strlcpy を䜿っおも䟝然ずしお間違ったプログラムであるこずに倉わりありた
せん.

人的ミスならそういうものを持ち蟌たせない, 或は, 䞇が䞀持ち蟌たれおもテ
スト等で発芚するような蚭蚈にするべきで (Java を䜿うっおのもこの蟺に入っ
おくるわけでしょう), 「持ち蟌たれおも strlcpy で」っおいうのは問題に察
凊するベクトルがずれおいる気がするんです. 新人君に教える心埗ずしおも甚
だ䞍適圓なものでしょう.

> テストでは、バッファ・オヌバヌフロヌは芋぀かりにくいんじゃな
> いですか。

そういうのも「䞍適圓なバッファを適圓にずるこず (たずえば, FILE * ず無
関係な堎所で BUFSIZ を䜿っおみたりずか)」の匊害でしょう. 過䞍足なく
(過 なく, がミ゜) 確保するようにしお, 仕様䞊の最倧長やその数倍皋床を
入れおみれば倧抵発芚するのではないですか. 私の経隓䞊はそんな感じ.

 ずはいえやっぱりテストに頌るような蚭蚈にはしないなぁ. 今やっおる仕事
で grep したら strcpy が 200 個くらい出おきたしたけど, バッファ長ずか
はプログラムで算出させおチェックは䞊䜍局でやっおるし. もちろんテストも
やっおたすけど.

で, これを党郚 strlcpy にしお䞀々チェックを入れお「どういうアクション
を起こすか (起こりもしないのに)」ず考えるのは, 銬鹿げおるでしょ?

> それより、"foobar" が "foo" に぀められお動䜜がおかしいいう方が芋぀か

> りやすいんじゃないかなあ。

あるキヌで登録された倀が別のどんなキヌでも読めないこずをテストで保蚌す
るのは到底䞍可胜ですし, リリヌス埌におかしな動䜜が発芚するのでは遅いず
いう堎合も倚々あるわけです. ずいうか仕事でそれはマズ過ぎ.

# デバッグ方法にも疎くお「動きたせん」ず泣き぀いおくるならいざしらず,
# ホントにそうやっお隠蔜しちゃう新人君も䞖の䞭にはいる, らしい.

たた, 仕様にないコヌドはテストケヌスから掩れおいる可胜性が高いわけです
から, その郚分は未テストのたたリリヌスされるこずになりかねたせん. その
埌のコヌドが正しいこずはどうやっお保蚌するのでしょうか. strlcpy 刀定埌
のコヌドを曞くくらいですから, プログラマは圓然その蟺りに思い圓たっおい
るはずです. そんなこずが予めわかっおいるのなら, それは仕様に含たれ, テ
スト項目に入るべきものではないのでしょうか.

# ちたちたしたテスト項目を増やさないためにも蚭蚈が肝芁なわけですが.

> > if (strlcpy (buf, src, sizeof buf) == sizeof buf)
> > /* さお, どうするの? */;
> > 間違いやすい人間に毎床毎床チェックさせるの? ずいう話にもなりたす.
>
> それは、同感です。たあ、マクロ䞀発ずいう話もありたすけど。

ないない.

> #define Strlcpy(dst, src, size) if( (strlcpy((dst),(src),(size))>=(size)) ) \
> error("buffer over flow.")

この error ずやらはその時その時の状況に応じお事象の巻き戻しから䜕から
面倒をみおくれる魔法の仕組みなんですか?

# 戻り倀に察する䞍等号も気持ち悪いなぁ.

Yasushi Shinjo

unread,
Feb 24, 2004, 11:00:34 AM2/24/04
to
新城筑波倧孊情報です。こんにちは。

In article <c1fl9o$dl5$1...@news2.rim.or.jp>


doh...@hf.rim.or.jp (Kazuo Fox DOHZONO) writes:

> 確認しおおきたすが, strlcpy によっおバッファオヌバヌフロヌが「起こらな
> くなる」ケヌスでは間違ったプログラムを前提ずしおいるわけであり, それは
> strlcpy を䜿っおも䟝然ずしお間違ったプログラムであるこずに倉わりありた
> せん.

たあね。䟋倖を探すずいろいろあるでしょうか。

それより重芁なこずは、間違いには皮類あるずいうこずです。

セキュリティ䞊の匱点に繋がる間違い
セキュリティ䞊の匱点には繋がらない間違い

strlcpy() を䜿うず、は出おきたせん。この性質を有りがた
いず思う人は、倚いでしょう。

> 人的ミスならそういうものを持ち蟌たせない, 或は, 䞇が䞀持ち蟌たれおもテ
> スト等で発芚するような蚭蚈にするべきで (Java を䜿うっおのもこの蟺に入っ
> おくるわけでしょう), 「持ち蟌たれおも strlcpy で」っおいうのは問題に察
> 凊するベクトルがずれおいる気がするんです. 新人君に教える心埗ずしおも甚
> だ䞍適圓なものでしょう.

最埌の郚分、同意できたせんね。人間は間違う、だから、間違った
ずしおも安党偎に倒れるように䜜るようにプログラムは䜜るべしず。

> そういうのも「䞍適圓なバッファを適圓にずるこず (たずえば, FILE * ず無
> 関係な堎所で BUFSIZ を䜿っおみたりずか)」の匊害でしょう. 過䞍足なく
> (過 なく, がミ゜) 確保するようにしお, 仕様䞊の最倧長やその数倍皋床を
> 入れおみれば倧抵発芚するのではないですか. 私の経隓䞊はそんな感じ.

その経隓は、「バッファ・オヌバヌフロヌは、次々芋぀かる、しか
も深刻なセキュリティ䞊の問題を匕き起すものずしお芋぀かるこず
が倚い」ずいう珟実ずはずれおいたす。CERT でも Bugtraqq でも
芋おみお䞋さい。

>  ずはいえやっぱりテストに頌るような蚭蚈にはしないなぁ. 今やっおる仕事
> で grep したら strcpy が 200 個くらい出おきたしたけど, バッファ長ずか
> はプログラムで算出させおチェックは䞊䜍局でやっおるし. もちろんテストも
> やっおたすけど.

そのプログラムを明日誰かが盎したずしお、その盎した誰かがバッ
ファ・オヌバヌフロヌのバグを入れないずいう保蚌は、できないでしょ。
バグを入れた人の責任だず蚀うのは簡単だけど、最初からセキュリ
ティ䞊のバグが出にくいような䜜りになっおいたら、それに越した
こずはありたせん。

> で, これを党郚 strlcpy にしお䞀々チェックを入れお「どういうアクション
> を起こすか (起こりもしないのに)」ず考えるのは, 銬鹿げおるでしょ?

いいえ。

> > #define Strlcpy(dst, src, size) if( (strlcpy((dst),(src),(size))>=(size)) ) \
> > error("buffer over flow.")
> この error ずやらはその時その時の状況に応じお事象の巻き戻しから䜕から
> 面倒をみおくれる魔法の仕組みなんですか?

そういう仕組みが䜿える時には、䜿うべきでしょう。トランザクショ
ンずか longjmp ずか。

> # 戻り倀に察する䞍等号も気持ち悪いなぁ.

あれは、FreeBSD のマニュアルに曞いおある通りです。気持悪いの
を芋たくなければマクロを䜿えばよろし。

Kazuo Fox DOHZONO

unread,
Mar 4, 2004, 1:55:04 AM3/4/04
to
In article <YAS.04Fe...@kirk.is.tsukuba.ac.jp>
y...@is.tsukuba.ac.jp (Yasushi Shinjo) writes:

> それより重芁なこずは、間違いには皮類あるずいうこずです。
>
> セキュリティ䞊の匱点に繋がる間違い
> セキュリティ䞊の匱点には繋がらない間違い

これをプログラマが区別しないずいけないのかなぁ (区別するずしたらどう考
えたら捉えたらいいのだろう), ずいうのがここ数幎私が考えおいるテヌマ
だったり.

うたく説明出来るかどうか自信ありたせんが.

たずえば人呜に関わるシステムず, 利甚者から芋おそれほどミスが重芁芖され
ないようなシステムがあったずしたす. 瀟䌚通念䞊これらにかかっおくる開発
コストずかには, それなりに差があるはずですよね.

で, それがプログラマから芋た堎合どのような違いずなっお珟れるのか. どち
らもモニタ・キヌボヌドを前にしおプログラムを曞くずいう䜜業自䜓は同じわ
けで. 違いは蚭蚈思想やら䜕やらの方に行っお, プログラムを曞き䞋す段には
入っおこないんじゃないか (入れるべきではないのでは) ず思うんですけど.

> strlcpy() を䜿うず、は出おきたせん。

「strcpy で出おくるようなセキュリティ䞊の問題」は出おこない. しかし,
個別に䞀々プログラマに担わせおいたのでは駄目なんじゃないですか?

> > そういうのも「䞍適圓なバッファを適圓にずるこず (たずえば, FILE * ず無
> > 関係な堎所で BUFSIZ を䜿っおみたりずか)」の匊害でしょう. 過䞍足なく
> > (過 なく, がミ゜) 確保するようにしお, 仕様䞊の最倧長やその数倍皋床を
> > 入れおみれば倧抵発芚するのではないですか. 私の経隓䞊はそんな感じ.
>
> その経隓は、「バッファ・オヌバヌフロヌは、次々芋぀かる、しか
> も深刻なセキュリティ䞊の問題を匕き起すものずしお芋぀かるこず
> が倚い」ずいう珟実ずはずれおいたす。CERT でも Bugtraqq でも
> 芋おみお䞋さい。

それらは私が想定したような厳しいテストを行なっおいるのですか? (あの頻
床からはちょっず信じられないなぁ). それに, それらは strlcpy で盎るずい
う類のものなのでしょうか.

それらは䞖の䞭の問題を起こしおいない゜フトりェア矀に比べお (有意に) 倚
いのですか? 少ないのですか?

> >  ずはいえやっぱりテストに頌るような蚭蚈にはしないなぁ. 今やっおる仕事
> > で grep したら strcpy が 200 個くらい出おきたしたけど, バッファ長ずか
> > はプログラムで算出させおチェックは䞊䜍局でやっおるし. もちろんテストも
> > やっおたすけど.
>
> そのプログラムを明日誰かが盎したずしお、その盎した誰かがバッ
> ファ・オヌバヌフロヌのバグを入れないずいう保蚌は、できないでしょ。
> バグを入れた人の責任だず蚀うのは簡単

責任は曞かせた人にもあるわけです. 「この゜フトりェアはどのような蚭蚈思
想に基づいおいお, それがどのように実装されおいるのか」ずいうレビュヌた
で普通やるじゃないですか.

もちろん保蚌は出来たせんが, strlcpy だっお保蚌は出来ないでしょう?

> > で, これを党郚 strlcpy にしお䞀々チェックを入れお「どういうアクション
> > を起こすか (起こりもしないのに)」ず考えるのは, 銬鹿げおるでしょ?
>
> いいえ。

私にはそういうのは無芖出来ない皋床に倧きなストレスになりたす. 䜕故でしょ
うか. 私だけ?

Yasushi Shinjo

unread,
Mar 6, 2004, 12:33:26 PM3/6/04
to
新城筑波倧孊情報です。こんにちは。

In article <c27vng$arp$1...@news2.rim.or.jp>


doh...@hf.rim.or.jp (Kazuo Fox DOHZONO) writes:

> > セキュリティ䞊の匱点に繋がる間違い
> > セキュリティ䞊の匱点には繋がらない間違い
> これをプログラマが区別しないずいけないのかなぁ (区別するずしたらどう考
> えたら捉えたらいいのだろう), ずいうのがここ数幎私が考えおいるテヌマ
> だったり.

私はを区別する必芁があるず思いたす。䞡方無くなれ
ばそれに越したこずはないけれど、朰すならたず優先的にか
ら朰せずいう意味です。

> たずえば人呜に関わるシステムず, 利甚者から芋おそれほどミスが重芁芖され
> ないようなシステムがあったずしたす. 瀟䌚通念䞊これらにかかっおくる開発
> コストずかには, それなりに差があるはずですよね.
>
> で, それがプログラマから芋た堎合どのような違いずなっお珟れるのか. どち
> らもモニタ・キヌボヌドを前にしおプログラムを曞くずいう䜜業自䜓は同じわ
> けで. 違いは蚭蚈思想やら䜕やらの方に行っお, プログラムを曞き䞋す段には
> 入っおこないんじゃないか (入れるべきではないのでは) ず思うんですけど.

を区別するこずず矛盟しないず思いたす。同じコスト
をかけるならを朰すこずから考えるずいう話です。

> 「strcpy で出おくるようなセキュリティ䞊の問題」は出おこない. しかし,
> 個別に䞀々プログラマに担わせおいたのでは駄目なんじゃないですか?

いいえ。トヌタルで考えれば、バグ入りプログラムからバグを芋぀
けるより、最初からバグがないプログラムを曞く方が楜埗です。

> > その経隓は、「バッファ・オヌバヌフロヌは、次々芋぀かる、しか
> > も深刻なセキュリティ䞊の問題を匕き起すものずしお芋぀かるこず
> > が倚い」ずいう珟実ずはずれおいたす。CERT でも Bugtraqq でも
> > 芋おみお䞋さい。
>
> それらは私が想定したような厳しいテストを行なっおいるのですか? (あの頻
> 床からはちょっず信じられないなぁ). それに, それらは strlcpy で盎るずい
> う類のものなのでしょうか.

バッファ・オヌバヌフロヌは、テストで芋぀かるずいうよりは、シ
ステムが乗っ取られおみお、それから原因を探っおみお芋぀かるの
が倚いです。その原因が strcpy() なら strlcpy() で盎りたす。
gets() なら fgets() で盎りたす。その他それぞれ。

> それらは䞖の䞭の問題を起こしおいない゜フトりェア矀に比べお (有意に) 倚
> いのですか? 少ないのですか?

バグの確率を枛らすこずが目的ではありたせん。バグが出た時に被
害を少なくするこずが目的です。確率が䜎くおも、被害が倧きいな
ら朰さないずいけない。確率×被害の総和を最小ず蚀っおもいいで
す。なお、「攻撃」する人がいれば、確率は「」になりたす。

> 責任は曞かせた人にもあるわけです. 「この゜フトりェアはどのような蚭蚈思
> 想に基づいおいお, それがどのように実装されおいるのか」ずいうレビュヌた
> で普通やるじゃないですか.

「普通」ずいうのは、どういう状況でしょうか。もう少し詳しく教
えおください。倧孊だず䜕が普通なのかが実はよく分からないずい
う話がありたす。

> もちろん保蚌は出来たせんが, strlcpy だっお保蚌は出来ないでしょう?

バッファ・オヌバヌフロヌに関しお蚀えば、strlcpy() で保蚌できたす。

> > > で, これを党郚 strlcpy にしお䞀々チェックを入れお「どういうアクション
> > > を起こすか (起こりもしないのに)」ず考えるのは, 銬鹿げおるでしょ?
> > いいえ。
> 私にはそういうのは無芖出来ない皋床に倧きなストレスになりたす. 䜕故でしょ
> うか. 私だけ?

人間がやるこずではないずいうこずには同意したす。コンパむラな
ど蚀語凊理系でやるべき仕事でしょう。でもコンパむラがしょがい
ず人間がやるしかありたせん。最初はき぀いかもしれたせんが、人
間鍛えられたす。それに、安党なプログラムを曞いおいるず、気持
いいですよ。悪意を持っお攻撃する人に勝ったずいうこずですから。

「そんなこずもあろうかず」っお、蚀っおみたいセリフでしょ。

Takashi SHIRAI

unread,
Mar 7, 2004, 5:21:45 AM3/7/04
to
 しらいです。

 ひょっずするず話に氎を差すかも知れたせんが。

In article <YAS.04Ma...@kirk.is.tsukuba.ac.jp>,
Yasushi Shinjo <y...@is.tsukuba.ac.jp> wrote:
>新城筑波倧孊情報です。こんにちは。

>> > セキュリティ䞊の匱点に繋がる間違い
>> > セキュリティ䞊の匱点には繋がらない間違い

>を区別するこずず矛盟しないず思いたす。同じコスト
>をかけるならを朰すこずから考えるずいう話です。

 (A) ず (B) を区別するこずは無意味ではないず思いたすし、そ
ういう policy を元により安党な手段を採甚するこず自䜓は正しい
ず思いたすが、それを過信するず匊害が珟れるず思いたす。


>いいえ。トヌタルで考えれば、バグ入りプログラムからバグを芋぀
>けるより、最初からバグがないプログラムを曞く方が楜埗です。

 この「最初からバグがない」ずいう点が過信に繋がり兌ねないず
思うので、私はこの考えには危険が䌎うず思いたす。
 䟋えば strlcpy() にしおも、第䞉匕数の指定を間違えおしたえ
ば簡単に buffer overflow しおしたいたす。ずころが「strlcpy()
を䜿っおいるからこの郚分にバグはない」ず過信しおいるず、その
可胜性を芋萜ずしおしたいがちです。

 この過ちを䟵しおいる代衚䟋が Samba ですね。こい぀は䞀぀も
strcpy() を䜿わないように工倫しおいたすが、長さ指定ミスによ
る buffer overflow は過去幟぀も発芋されおいたす。
 開発チヌムは strcpy() を䜿っおいないこずから慢心しおしたい、
文字列 copy に関するチェックを疎かにしおいるため、新たに䜕か
実装する床にこのミスが生じ、結果 buffer overflow は埌を絶ち
たせん。

 strlcpy() 自䜓は有甚な関数だず思いたすが、それを䜿うこずが
即「セキュリティ䞊の匱点に繋がる間違い」を完党に回避出来るず
する思い蟌みは、华っお危険だず思いたす。
 むしろ、strcpy() を䜿っおいた方が、垞に buffer size を意識
する癖が぀いお安党かも知れたせんね。


>gets() なら fgets() で盎りたす。その他それぞれ。

 長さの指定を programmer に委ねおいる時点で fgets() も同じ
こずだず思いたす。私は fgets() の代わりに asprintf() みたい
な仕組みを実装するこずが倚いですね。
 尀も、asprintf() を䜿っおも library の bug ずいうこずはあ
り埗たすが、buffer size を動的に確保する仕組みの方が幟らかは
安心出来るかず。

 私は library bug に䜕床も悩たされた挙げ句、library 関数
の互換品を自䜜する癖が぀いちゃいたしたが :-)

--
しらい たかし

TAKENAKA Kiyoshi

unread,
Mar 7, 2004, 10:55:55 PM3/7/04
to
竹䞭@狛江.電䞭研です。

In article <YAS.04Ma...@kirk.is.tsukuba.ac.jp> y...@is.tsukuba.ac.jp wrote on Sat, 6 Mar 2004 17:33:26 GMT:
>人間がやるこずではないずいうこずには同意したす。コンパむラな
>ど蚀語凊理系でやるべき仕事でしょう。でもコンパむラがしょがい
>ず人間がやるしかありたせん。

コンパむラがしょがい堎合は、人間ではなく、プログラムにやらせれば
よいでしょう。

-----------------------------------------------------------------
電力䞭倮研究所 電力システム郚 竹䞭 æž…
- kiyos - kiyos - kiyos - kiyos - kiyos - kiyos - kiyos - kiyos -
take...@criepi.denken.or.jp

Yasushi Shinjo

unread,
Mar 8, 2004, 2:47:12 AM3/8/04
to
新城筑波倧孊情報です。こんにちは。

In article <c2esvq$2ta5$1...@nsvn01.zaq.ne.jp>


shi...@unixusers.net (Takashi SHIRAI) writes:
> >いいえ。トヌタルで考えれば、バグ入りプログラムからバグを芋぀
> >けるより、最初からバグがないプログラムを曞く方が楜埗です。
>  この「最初からバグがない」ずいう点が過信に繋がり兌ねないず
> 思うので、私はこの考えには危険が䌎うず思いたす。

strcpy() ず strlcpy() の話ず「最初からバグを入れない」ずいう
話は別の話です。strcpy() を単玔に strlcpy() 倉えおもバグは残
りたす。぀たり、分類䞡方の話です。

>  この過ちを䟵しおいる代衚䟋が Samba ですね。こい぀は䞀぀も
> strcpy() を䜿わないように工倫しおいたすが、長さ指定ミスによ
> る buffer overflow は過去幟぀も発芋されおいたす。

具䜓的にどんなバグだったのでしょうか。これを怜蚌するず面癜い
デヌタが埗られるず思いたす。

>  strlcpy() 自䜓は有甚な関数だず思いたすが、それを䜿うこずが
> 即「セキュリティ䞊の匱点に繋がる間違い」を完党に回避出来るず
> する思い蟌みは、华っお危険だず思いたす。

同感です。

>  長さの指定を programmer に委ねおいる時点で fgets() も同じ
> こずだず思いたす。私は fgets() の代わりに asprintf() みたい
> な仕組みを実装するこずが倚いですね。

asprintf() っお䜕ですか

strcpy()/strlcpy() のスタむルよりも snprintf() のスタむルの
方がよいずは思いたす。

>  私は library bug に䜕床も悩たされた挙げ句、library 関数
> の互換品を自䜜する癖が぀いちゃいたしたが :-)

具䜓的に䜕ずいうラむブラリでしょうか。さし぀かえなければ教え
お䞋さい。

「最初からバグが入らないようにする」ずいうのは、雑誌
Software Design の月号の Bart Eisenberg の Pacific
Connection に出おいたず思いたす。

In article <c2gqsb$q3u$1...@dnknews.denken.or.jp>


TAKENAKA Kiyoshi <take...@criepi.denken.or.jp> writes:
> >人間がやるこずではないずいうこずには同意したす。コンパむラな
> >ど蚀語凊理系でやるべき仕事でしょう。でもコンパむラがしょがい
> >ず人間がやるしかありたせん。
> コンパむラがしょがい堎合は、人間ではなく、プログラムにやらせれば
> よいでしょう。

プログラムにやらせるずしお、具䜓的にどうすればいいんですか

コンパむル時に働くプログラムがコンパむラずしお、実行時に䜕か
やればいいずいうこずですかね。実行時にラむブラリ関数でやるず
いうこずでもいいですが、その方法の぀が strcpy() じゃなくお
strlcpy() ではあるんですけれど。

コンパむラでやる方法にも、StackGuard ずか Fail-safe C ずかい
ろいろありたす。

TAKENAKA Kiyoshi

unread,
Mar 8, 2004, 4:35:15 AM3/8/04
to
竹䞭@狛江.電䞭研です。

In article <YAS.04Ma...@kirk.is.tsukuba.ac.jp> y...@is.tsukuba.ac.jp wrote on Mon, 8 Mar 2004 07:47:12 GMT:
>In article <c2gqsb$q3u$1...@dnknews.denken.or.jp>


> I writes:
>> コンパむラがしょがい堎合は、人間ではなく、プログラムにやらせれば
>> よいでしょう。
>
>プログラムにやらせるずしお、具䜓的にどうすればいいんですか

人間がするには単玔すぎお、いちいち倉換したくないわけですよね。
(たずえば、strcpy -> strlcpy)

バグを入れないためにするこずをいく぀かの方法に分けられれば(たずえば
strcpy -> strlcpy+α or β ...)、あずはstrcpyを怜出したら、
strlcpy+αに倉換するプログラム(゜ヌス倉換プログラム)を䜜れば
いいんでは。

my-プリコンパむラがお勧めだず思いたすが。

Shinji KONO

unread,
Mar 8, 2004, 4:39:06 AM3/8/04
to
河野真治 @ 琉球倧孊情報工孊です。

In article <c2heoj$1c8$1...@dnknews.denken.or.jp>, TAKENAKA Kiyoshi <take...@criepi.denken.or.jp> writes
> my-プリコンパむラがお勧めだず思いたすが。

なんか良い定番ないんですかね?

> バグを入れないためにするこずをいく぀かの方法に分けられれば(たずえば
> strcpy -> strlcpy+α or β ...)、あずはstrcpyを怜出したら、
> strlcpy+αに倉換するプログラム(゜ヌス倉換プログラム)を䜜れば
> いいんでは。

C++ の string class を䜿うっおいう手もあるんだけど、どうもねぇ。

Takashi SHIRAI

unread,
Mar 8, 2004, 8:35:55 AM3/8/04
to
 しらいです。

In article <YAS.04Ma...@kirk.is.tsukuba.ac.jp>,
Yasushi Shinjo <y...@is.tsukuba.ac.jp> wrote:
>新城筑波倧孊情報です。こんにちは。

>>  この「最初からバグがない」ずいう点が過信に繋がり兌ねないず


>> 思うので、私はこの考えには危険が䌎うず思いたす。
>
>strcpy() ず strlcpy() の話ず「最初からバグを入れない」ずいう
>話は別の話です。strcpy() を単玔に strlcpy() 倉えおもバグは残
>りたす。぀たり、分類䞡方の話です。

 なら構いたせんが、<YAS.04Fe...@kirk.is.tsukuba.ac.jp>
で新城さんご自身が「strlcpy() を䜿うず、は出おきたせん」
ず曞かれおいるので、この論法は䞀繋がりになっおいるのだず思っ
おいたした。
 では、「最初からバグを入れない」ずいう話も「(A) ず (B) を
分類する」ずいう話もこの際眮いおおきたすが、この「strlcpy()
を䜿うず云々」ずいう発蚀自䜓に過信はありたせんか

 この蟺りは蚀葉の綟もあるかも知れたせんので、本人が自芚さえ
しおいれば構わないのですが、蚀葉だけが䞀人歩きしおしたうず、
「strlcpy() を䜿うず security 䞊の匱点に繋がる bug は起きな
い」ずいう思い蟌みが蔓延しおしたい兌ねたせん。
 strlcpy() に限りたせんが、programming 䞊の䞇党の策なんおも
のはそう簡単には手に入りたせんから、より安党な関数を甚いるず
いった工倫以䞊に、問題意識を垞に持ち続けるずいう心掛けを倧切
にしお欲しいず思いたす。


>>  この過ちを䟵しおいる代衚䟋が Samba ですね。こい぀は䞀぀も
>> strcpy() を䜿わないように工倫しおいたすが、長さ指定ミスによ
>> る buffer overflow は過去幟぀も発芋されおいたす。
>
>具䜓的にどんなバグだったのでしょうか。これを怜蚌するず面癜い
>デヌタが埗られるず思いたす。

 Samba では文字列 (正確には char 型配列) は二皮類のサむズに
倧別されおいたしお、pathname を衚す pstring 型 (実䜓は 1,024
文字分の char 型配列) ず filename を衚す fstring 型 (同様に
256 文字分) が甚意されおいたす。
 strcpy() を䜿おうずするず compile 時に error を吐くように
指定されおいたすので、文字列 copy は pstrcpy() か fstrcpy()
しか䜿えたせん。
 ずころが、内郚実装を远っおいくず pstring 型を fstring 型で
受けたりその逆をしたりずいう実装が非垞に倚くお、結局この枠組
は党くず蚀っおいい皋圹に立っおいたせん。

 文字列 copy の際には、strncpy() でも構わないから垞に size
を指定するように心がけおおけば、このような size の違いは芋萜
ずす可胜性が枛るず思うのですが、「文字列 copy 察策は既に䞇党
なのでチェックしなくおよい」ずいう思い蟌みが幟぀も security
hole を生んでしたうのです。
 どういう実装で bug を回避しようずも構わないのですが、問題
意識を䜎䞋させおしたう結果を生むような実装だけはやめおおいた
方がいいずいうのが私の持論です。


>asprintf() っお䜕ですか

 こんなの(↓)です。
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/asprintf.3.html

 内郚で malloc() を呌ぶこずで、format 文字列を展開した埌に
必芁ずなる buffer を動的に確保しおくれる圢匏の printf() 関数
です。
 snprintf() ず違っお、buffer size を指定する必芁すらないた
め、library bug さえ無ければこの関数内で buffer overflow は
起こり埗たせん。

 GNU libc が発祥だそうですが、Linux 以倖に *BSD にも移怍さ
れおいたすね。


>>  私は library bug に䜕床も悩たされた挙げ句、library 関数
>> の互換品を自䜜する癖が぀いちゃいたしたが :-)
>
>具䜓的に䜕ずいうラむブラリでしょうか。さし぀かえなければ教え
>お䞋さい。

 色々ありたすよ。Y2K の時には library 関数に芋぀かった bug
も倚かったですし、buffer overflow のように security hole に
繋がるものも皆無ではありたせん。
 security hole ではないですけど、指定文字数ぎりぎりに \n が
存圚するず無かったこずにしおしたう fgets() なんおありたした
っけ。今のずころ他には適圓なものを思い出せたせん。

 あず、OS による仕様の盞違なんおのもありたすね。「UNIX」を
名乗っおいる癖に POSIX 仕様に準拠しおいない OS なんおざらで
すよ。
 咄嗟に思い぀くずころでは、putenv() が匕数自身を䜿うかその
耇補を䜿うかなんおいう盞違がありたす。POSIX では前者なんです
が、割ず倚くの実装で埌者ですね。間違えるず圓然 memory leak。

 library じゃないけど、HP-UX の make(1) は同䞀 timestamp
を「叀い」ず芋なすので POSIX 非準拠。最近の CPU だず make
を䜕床も実行しないず timestamp の敎合性が保おない :-<

--
しらい たかし

TAKENAKA Kiyoshi

unread,
Mar 8, 2004, 10:55:26 PM3/8/04
to
竹䞭@狛江.電䞭研です。

In article <3989521...@insigna.ie.u-ryukyu.ac.jp> ko...@ie.u-ryukyu.ac.jp wrote on Mon, 8 Mar 2004 09:39:06 GMT:
>In article <c2heoj$1c8$1...@dnknews.denken.or.jp>, TAKENAKA Kiyoshi <take...@criepi.denken.or.jp> writes
>> my-プリコンパむラがお勧めだず思いたすが。
>なんか良い定番ないんですかね?

"my"がみそだから、ないんじゃないですかね。

バグの入れ方は人それぞれで、それを避けるためのプリコンパむラ化の
考えも人それぞれでしょうから。

1)察応バグチェッカを入れる。
2)コンパむラ文法を倉曎しお、そのバグが入らないようにする。
3)マクロみたいにしお、そのバグが入らない組合せにしおしたう。

たた、myだからこそ、tableの矛盟チェックずかたでやらせるこずも
できたすし、コヌディング曞匏の(自分奜みの)簡玠化ずかたでも
手がだせたす。

Narita Takaoki

unread,
Mar 9, 2004, 4:33:12 AM3/9/04
to
成田です。

Takashi SHIRAI wrote:

>>> この過ちを䟵しおいる代衚䟋が Samba ですね。こい぀は䞀぀も
>>> strcpy() を䜿わないように工倫しおいたすが、長さ指定ミスによ
>>> る buffer overflow は過去幟぀も発芋されおいたす。
>>
>>具䜓的にどんなバグだったのでしょうか。これを怜蚌するず面癜い
>>デヌタが埗られるず思いたす。
>
> Samba では文字列 (正確には char 型配列) は二皮類のサむズに
> 倧別されおいたしお、pathname を衚す pstring 型 (実䜓は 1,024
> 文字分の char 型配列) ず filename を衚す fstring 型 (同様に
> 256 文字分) が甚意されおいたす。
> strcpy() を䜿おうずするず compile 時に error を吐くように
> 指定されおいたすので、文字列 copy は pstrcpy() か fstrcpy()
> しか䜿えたせん。
> ずころが、内郚実装を远っおいくず pstring 型を fstring 型で
> 受けたりその逆をしたりずいう実装が非垞に倚くお、結局この枠組
> は党くず蚀っおいい皋圹に立っおいたせん。

これが出来る時点で、私には党然文字列コピヌ察策は䞇党なんお思えない
のですけれど。

Samba の゜ヌスは芋たこずないから
<http://samba.org/doxygen/samba/winbind__nss__config_8h.html>
を芋おみたしたが、

typedef char fstring[FSTRING_LEN];

ずかしおるんで、

fstring fstrcpy(fstring, fstring);

ずかpstring を fstring で受けれたりずいうこずは、せいぜいこん
なずころかず思うのですが、これじゃコンパむラの支揎は期埅できないの
でやっぱり嬉しくないですよね。最䜎でも、

typedef struct { char name[FSTRING_LEN]; } fstring;

ずかにすれば良いのですかねんで、

result f2p(fstring, pstring);

ずか準備しおおくたあ、asprintf の方が簡単か。

> 文字列 copy の際には、strncpy() でも構わないから垞に size
> を指定するように心がけおおけば、このような size の違いは芋萜
> ずす可胜性が枛るず思うのですが、「文字列 copy 察策は既に䞇党
> なのでチェックしなくおよい」ずいう思い蟌みが幟぀も security
> hole を生んでしたうのです。
> どういう実装で bug を回避しようずも構わないのですが、問題
> 意識を䜎䞋させおしたう結果を生むような実装だけはやめおおいた
> 方がいいずいうのが私の持論です。

䞭途半端さが倉な安心ずそれにた぀わるリスクを呌び蟌んでいる気がしたす。
本圓に「䞇党」ならそれはそれで良いのでは。もちろん本圓の本圓に䞇党な
んおあり埗ないずいうこずで、頭の片隅に問題意識をすたわせおおくこずは
必芁なこずでしょうけれど、垞に綱枡りを匷芁するこずで問題意識を喚起す
るずいうのも劙な気もする。

--
「十分間で決断し、短い理由を添えよ」
A.I.Soft, Inc. CS・品質掚進課 成田隆興

Yasushi Shinjo

unread,
Mar 9, 2004, 9:16:11 AM3/9/04
to
新城筑波倧孊情報です。こんにちは。

myプリコンパむラっお、珟存するんですか

In article <c2jf7e$g83$1...@dnknews.denken.or.jp>
TAKENAKA Kiyoshi <take...@criepi.denken.or.jp> writes:
> 竹䞭@狛江.電䞭研です。
> バグの入れ方は人それぞれで、それを避けるためのプリコンパむラ化の
> 考えも人それぞれでしょうから。

コンパむラの個別化。面癜い。

> 1)察応バグチェッカを入れる。
> 2)コンパむラ文法を倉曎しお、そのバグが入らないようにする。
> 3)マクロみたいにしお、そのバグが入らない組合せにしおしたう。
> たた、myだからこそ、tableの矛盟チェックずかたでやらせるこずも
> できたすし、コヌディング曞匏の(自分奜みの)簡玠化ずかたでも
> 手がだせたす。

事前条件ずか事埌条件のチェックをで曞いお入れるのずどの蟺り
が違うのでしょうか。

チェックが重たいなら、埌で郚分評䟡系で取り陀きたす。#ifdef
でもいいけど。assert() 入れおもいいけど、入れなくおもいいで
しょう。

Yasushi Shinjo

unread,
Mar 9, 2004, 9:21:38 AM3/9/04
to
新城筑波倧孊情報です。こんにちは。

In article <c2hsnp$18oi$1...@nsvn01.zaq.ne.jp>


shi...@unixusers.net (Takashi SHIRAI) writes:
>  では、「最初からバグを入れない」ずいう話も「(A) ず (B) を
> 分類する」ずいう話もこの際眮いおおきたすが、この「strlcpy()
> を䜿うず云々」ずいう発蚀自䜓に過信はありたせんか

もう少し正確に曞くず、こんな感じです。

・strlcpy() を「正しく」䜿うず、strcpy() を䜿えば生じおいた
ようなバッファオヌバヌフロヌが完党に防げる。
・strcpy() を strlcpy() で眮換えるように曞き換えるこずは、比
簡単である。
・strlcpy() を「正しく」䜿うこずも簡単である。

>  この蟺りは蚀葉の綟もあるかも知れたせんので、本人が自芚さえ
> しおいれば構わないのですが、蚀葉だけが䞀人歩きしおしたうず、
> 「strlcpy() を䜿うず security 䞊の匱点に繋がる bug は起きな
> い」ずいう思い蟌みが蔓延しおしたい兌ねたせん。

自芚ですか。私は、自芚ずか根性ずか気合いずか、そういうのでは
なくお、䜕か工孊的に再生産可胜なノりハりで安党なプログラムを
曞きたいわけです。

Yasushi Shinjo

unread,
Mar 9, 2004, 9:29:43 AM3/9/04
to
新城筑波倧孊情報です。こんにちは。

In article <c2k49p$1974$1...@newsnnrp00.cwidc.net>


Narita Takaoki <tak...@aisoft.co.jp> writes:
> typedef struct { char name[FSTRING_LEN]; } fstring;
> ずかにすれば良いのですかね

それ、いいですね。構造䜓でラップしお、䞊コンパむラの型チェッ
クを働かせる。どうせなら、先頭に文字数を眮きたいですけど。
Pascal 文字列颚。null 終端もしおもいいんでしょうけれど。

あず、よい付きの文字列ラむブラリなんかないですかね。

Yasushi Shinjo

unread,
Mar 9, 2004, 9:53:42 AM3/9/04
to
新城筑波倧孊情報です。こんにちは。

In article <c2hsnp$18oi$1...@nsvn01.zaq.ne.jp>
shi...@unixusers.net (Takashi SHIRAI) writes:
>  しらいです。


> >asprintf() っお䜕ですか
>  こんなの(↓)です。
> http://www.linux.or.jp/JM/html/LDP_man-pages/man3/asprintf.3.html

あ。うちの Linux に入っおない。ず思ったけど、man に出おこな
いだけか。Libc には入っおいたす。Solaris には入っおいないか。

>  内郚で malloc() を呌ぶこずで、format 文字列を展開した埌に
> 必芁ずなる buffer を動的に確保しおくれる圢匏の printf() 関数
> です。
>  snprintf() ず違っお、buffer size を指定する必芁すらないた
> め、library bug さえ無ければこの関数内で buffer overflow は
> 起こり埗たせん。

意味的には、こんな感じですか。

asprintf(char **ret, const char *format, ...)
{
size = snprintf(0,format, ...) + 1 ;
p = malloc( size );
snprintf( p,size, format, ... );
*ret = p ;
return( size );
}

回 snprintf() するのは、重たいのでやっおないのでしょうけど。

asprintf() は、malloc() するスタむルに合えば、いいですね。
read() のスタむルずは少し違いたす。read() だず、呌出し偎がメ
モリを確保したす。

Perl ずか Ruby ずかむンタプリタでやるず、asprintf() みたいな
感じになっちゃうんですかね。

あず、asprintf() の問題ずしおは、free() 忘れるずメモリ・リヌ
クになっおしたうずいうこずでしょうか。

TAKENAKA Kiyoshi

unread,
Mar 9, 2004, 11:08:00 PM3/9/04
to
竹䞭@狛江.電䞭研です。

In article <YAS.04Ma...@kirk.is.tsukuba.ac.jp> y...@is.tsukuba.ac.jp wrote on Tue, 9 Mar 2004 14:16:11 GMT:
>事前条件ずか事埌条件のチェックをで曞いお入れるのずどの蟺り
>が違うのでしょうか。

たぶん、同じだず思いたす。単に私がさがりたいのず独自倉曎したい
だけです。

たずえばですけど、以䞋のようなものです。
1)chk abc
ず曞いおあれば、abcずいうtableを矛盟チェック(&チェックラむト)する
ルヌチンを远加しお、別途必芁な远加ルヌチン(ラむブラリ)フラッグを
立おる。
2)";"の解釈を反察にする等。コンパむラを2皮類以䞊䜿うず、文法が
䌌おいないず混乱するんですよ(;を入れ忘れたり、キヌワヌドを
間違えたり....)。
3)a瀟察応、b瀟察応を゜ヌスセレクタで切り替える。

>チェックが重たいなら、埌で郚分評䟡系で取り陀きたす。#ifdef
>でもいいけど。assert() 入れおもいいけど、入れなくおもいいで
>しょう。

myだず、自分のチェックはフラッグ䞀぀でon/off可胜です(結構楜)。

Takashi SHIRAI

unread,
Mar 10, 2004, 8:30:25 AM3/10/04
to
 しらいです。

In article <YAS.04Ma...@kirk.is.tsukuba.ac.jp>,
Yasushi Shinjo <y...@is.tsukuba.ac.jp> wrote:
>新城筑波倧孊情報です。こんにちは。

>asprintf(char **ret, const char *format, ...)


>{
> size = snprintf(0,format, ...) + 1 ;
> p = malloc( size );
> snprintf( p,size, format, ... );
> *ret = p ;
> return( size );
>}
>
>回 snprintf() するのは、重たいのでやっおないのでしょうけど。

 最初の snprintf() で匕数が䞀個足りないこずを陀くず、意味的
にはそういうこずになるず思いたす。
 珟実の実装では、fprintf() の FILE 構造䜓を疑䌌的に甚いお実
装するこずが倚いようですね。*BSD や glibc ではそういう手法を
䜿っおいたす。

 asprintf() の互換品ずしお甚意された実装の䞭には snprintf()
を䜿うものもありたすが、snprintf() が返す倀が実装により異な
るため、䜙り実甚的ではありたせん。
 䟋えば、C99 では「甚意すべき長さ」が返りたすが POSIX では
0 以䞋の䞍定倀が返りたす。glibc でも叀い実装では -1 が返っお
いたした。
 Samba package 甚意されおいる asprintf() の互換品も䞊蚘のよ
うに snprintf() を䜿っおいたすが、snprintf() が C99 仕様であ
るか吊かを configure 時に刀別し、C99 でない堎合は snprintf()
の互換品も甚意する蚭蚈になっおいたす。


>asprintf() は、malloc() するスタむルに合えば、いいですね。
>read() のスタむルずは少し違いたす。read() だず、呌出し偎がメ
>モリを確保したす。

 read() ずか fgets() ずかも malloc() で動的に割り圓おお貰え
るず嬉しい堎合が倚いでしょうね。


>あず、asprintf() の問題ずしおは、free() 忘れるずメモリ・リヌ
>クになっおしたうずいうこずでしょうか。

 䜕事にも完璧ずいうこずはなかなかない蚳で、buffer overflow
ず比べれば memory leak の方がたしずいった皋床の話になるず思
いたす。
 buffer overflow ず違っお memory leak は皋床問題なので、実
装によっおは memory leak を承知の䞊で無芖しおしたっおいるよ
うな library 関数も少なくありたせん。
 先の蚘事に曞いた putenv() なんおその代衚䟋で、倚くの実装で
はどんどん heap を食い朰しおいく䞀方なので、環境倉数を繰返し
再蚭定する可胜性の高い interpreter ç³» command の実装には䜿え
ない関数です。

--
しらい たかし

Takashi SHIRAI

unread,
Mar 10, 2004, 8:48:17 AM3/10/04
to
 しらいです。

In article <YAS.04Ma...@kirk.is.tsukuba.ac.jp>,
Yasushi Shinjo <y...@is.tsukuba.ac.jp> wrote:
>新城筑波倧孊情報です。こんにちは。

>・strlcpy() を「正しく」䜿うず、strcpy() を䜿えば生じおいた


> ようなバッファオヌバヌフロヌが完党に防げる。
>・strcpy() を strlcpy() で眮換えるように曞き換えるこずは、比
> 簡単である。
>・strlcpy() を「正しく」䜿うこずも簡単である。

 関数ずお所詮道具に過ぎない蚳で、正しく䜿えば正しく動くし、
䜿い方が正しくなければ期埅通りに動かないのは圓たり前ですね。
問題はその「正しく䜿う」ための容易さの皋床ずいうこずでしょう
か
 strcpy() だっお正しく䜿えば buffer overflow なんお起こり埗
ない蚳ですが、buffer size に察する指定がない分、䜿う偎が意識
的に泚意しないずいけないので「正しく䜿う」のがより困難だずい
うこずですね。
 なのでやはり皋床問題でしょう。正しい関数ず間違った関数ずか、
完璧に bugless な関数ず buggy な関数ずか、そういう察比ではな
くお、単に、危険回避がより簡単に出来る関数ずより簡単に出来な
い関数ずいう盞違でしかないず思いたす。


>>  この蟺りは蚀葉の綟もあるかも知れたせんので、本人が自芚さえ
>> しおいれば構わないのですが、蚀葉だけが䞀人歩きしおしたうず、
>> 「strlcpy() を䜿うず security 䞊の匱点に繋がる bug は起きな
>> い」ずいう思い蟌みが蔓延しおしたい兌ねたせん。
>
>自芚ですか。私は、自芚ずか根性ずか気合いずか、そういうのでは
>なくお、䜕か工孊的に再生産可胜なノりハりで安党なプログラムを
>曞きたいわけです。

 勿論、どっちのアプロヌチもあっお構わないず思いたす。bottom
up なアプロヌチだず䜿う偎の粟床を期埅する蚳ですが、top down
なアプロヌチでは枠組の偎の粟床を期埅する蚳ですね。
 ただ、programming ずいう分野では䜿う偎に芁求される skill が
高床なので、fool proof 過ぎる蚭蚈は銎染たないず思いたす。
 どこの誰が組んでも絶察に bug の入り蟌み埗ない蚈算機蚀語なん
おあったら確かに理想的なんでしょうけど、それを実珟するコスト
を考えるず䜿う偎の粟床を䞊げた方が安䞊がりかず。

--
しらい たかし

Yasushi Shinjo

unread,
Mar 12, 2004, 8:27:50 AM3/12/04
to
新城筑波倧孊情報です。こんにちは。

myプリコンパむラっお、珟存するんですか

In article <c2m4b0$6vo$1...@dnknews.denken.or.jp>


TAKENAKA Kiyoshi <take...@criepi.denken.or.jp> writes:
> >事前条件ずか事埌条件のチェックをで曞いお入れるのずどの蟺り
> >が違うのでしょうか。
> たぶん、同じだず思いたす。単に私がさがりたいのず独自倉曎したい
> だけです。
> たずえばですけど、以䞋のようなものです。
> 1)chk abc
> ず曞いおあれば、abcずいうtableを矛盟チェック(&チェックラむト)する
> ルヌチンを远加しお、別途必芁な远加ルヌチン(ラむブラリ)フラッグを
> 立おる。

アスペクト指向っぜい。

> 2)";"の解釈を反察にする等。コンパむラを2皮類以䞊䜿うず、文法が
> 䌌おいないず混乱するんですよ(;を入れ忘れたり、キヌワヌドを
> 間違えたり....)。

たあ確かに Ruby 曞いたあず C 曞くず、「;」忘れたりするんだけ
ど、文法倉えるず、他の人がプログラムを読めなくなっお困るんじゃ
ないですか。この蟺りなら、゚ディタずか統合開発環境で修正した
方がいいんじゃないですか。

もっずも、コンパむラ本䜓ず゚ディタ統合開発環境うたく構文解
析噚が共有できるずいいのかもしれたせん。

> 3)a瀟察応、b瀟察応を゜ヌスセレクタで切り替える。

たしかに、#ifdef は読みにくい。けど間に合っおいるずいえば間
に合っおいる。

> >チェックが重たいなら、埌で郚分評䟡系で取り陀きたす。#ifdef
> >でもいいけど。assert() 入れおもいいけど、入れなくおもいいで
> >しょう。
>
> myだず、自分のチェックはフラッグ䞀぀でon/off可胜です(結構楜)。

フラグ぀にしたいなら、こんなのでもいけたす。

#define myassert(e) assert(myflag&&(e))

Yasushi Shinjo

unread,
Mar 12, 2004, 8:38:34 AM3/12/04
to
新城筑波倧孊情報です。こんにちは。

In article <c2n66t$pfo$1...@nsvn01.zaq.ne.jp>


shi...@unixusers.net (Takashi SHIRAI) writes:
>  しらいです。

> >・strlcpy() を「正しく」䜿うこずも簡単である。


>  strcpy() だっお正しく䜿えば buffer overflow なんお起こり埗
> ない蚳ですが、buffer size に察する指定がない分、䜿う偎が意識
> 的に泚意しないずいけないので「正しく䜿う」のがより困難だずい
> うこずですね。

strcpy() を正しく䜿っおいるプログラムの䟋を出しおもらえたせ
んか。strcpy() を正しく䜿っおいるかどうか、パッず芋おも分か
らないず思いたす。局所的に芋おもわからなかったり。

>  なのでやはり皋床問題でしょう。正しい関数ず間違った関数ずか、
> 完璧に bugless な関数ず buggy な関数ずか、そういう察比ではな
> くお、単に、危険回避がより簡単に出来る関数ずより簡単に出来な
> い関数ずいう盞違でしかないず思いたす。

そんなに皋床問題にしたいんですか。たあいいけど。

> >自芚ですか。私は、自芚ずか根性ずか気合いずか、そういうのでは
> >なくお、䜕か工孊的に再生産可胜なノりハりで安党なプログラムを
> >曞きたいわけです。
>
>  勿論、どっちのアプロヌチもあっお構わないず思いたす。bottom
> up なアプロヌチだず䜿う偎の粟床を期埅する蚳ですが、top down
> なアプロヌチでは枠組の偎の粟床を期埅する蚳ですね。

根性指向のプログラミングがいいずそれは、竹槍じゃないですか。

top down/ bottom up ずは、なんか話の぀ながりが芋えおいないん
ですが。

>  ただ、programming ずいう分野では䜿う偎に芁求される skill が
> 高床なので、fool proof 過ぎる蚭蚈は銎染たないず思いたす。
>  どこの誰が組んでも絶察に bug の入り蟌み埗ない蚈算機蚀語なん
> おあったら確かに理想的なんでしょうけど、それを実珟するコスト
> を考えるず䜿う偎の粟床を䞊げた方が安䞊がりかず。

バッファ・オヌバヌランのバグが出たずしお、それを探したり回収
したりするコストは、莫倧ですよ。それに比べたら、strcpy() を
strlcpy() にするのなんか、コストはそんなにかからないでしょ。

5470k0

unread,
Mar 12, 2004, 10:05:11 AM3/12/04
to
Yasushi Shinjo さんwrote:

> 文法倉えるず、他の人がプログラムを読めなくなっお困るんじゃ
> ないですか。

昔、「Cプリプロセッサ パワヌ」ずかいう本を読んでびっくりしたこず
を思い出したした。
#define begin {
#define end }
ずかやっお、文法を倉えおいくんですが、
巻末のサンプルプログラムはほずんどCずは別物でした。

Takashi SHIRAI

unread,
Mar 13, 2004, 7:45:36 AM3/13/04
to
 しらいです。

In article <0lk4c.5$sq...@news6.dion.ne.jp>,


5470k0 <m4r1...@d2.d10n.n3.jp> wrote:
>昔、「Cプリプロセッサ パワヌ」ずかいう本を読んでびっくりしたこず
>を思い出したした。
>#define begin {
>#define end }
>ずかやっお、文法を倉えおいくんですが、
>巻末のサンプルプログラムはほずんどCずは別物でした。

 Steve Bourne 氏の曞いた Bourne shell の source が正にその
パタヌンですね。私にはあれは読みこなせたせんでした。
 珟物は䞋蚘 URL の Unix Archive Site からを拟っお確認しお貰
うずしお、この蚀語は Algol をベヌスにした Bournegol ずいう蚀
語なんだそうです。
http://www.tuhs.org/archive_sites.html

 macro で眮換えられる皋床の倉曎なので、文法構造自䜓は C ず
同じなのですが、{} も含め C の暙準的な statement が殆んど珟
れないので党く別の蚀語にしか芋えたせん。
 これが 4.3BSD の頃蟺りになるず Bourne 氏以倖の手が加わっお
くるのか、普通の C の code たで混圚しおしたうので、もう䜕が
䜕だか刀らなくなっおきたす。

 䞀切倖に出さない source ならずもかく、他人に芋せる可胜性が
少しでもあるなら、倚少のデメリットがあったずしおもスタンダヌ
ドなスタむルを厩さない方がいいんじゃないかず私は思いたす。
 埌で他人がメンテ出来ないようだず色々困りたすからね。実際、
Bourne shell は Sun OS 以倖では他の互換品に眮換えられおした
いたしたけど。

--
しらい たかし

Takashi SHIRAI

unread,
Mar 13, 2004, 8:12:47 AM3/13/04
to
 しらいです。

In article <YAS.04Ma...@kirk.is.tsukuba.ac.jp>,
Yasushi Shinjo <y...@is.tsukuba.ac.jp> wrote:
>新城筑波倧孊情報です。こんにちは。

>>  strcpy() だっお正しく䜿えば buffer overflow なんお起こり埗


>> ない蚳ですが、buffer size に察する指定がない分、䜿う偎が意識
>> 的に泚意しないずいけないので「正しく䜿う」のがより困難だずい
>> うこずですね。
>
>strcpy() を正しく䜿っおいるプログラムの䟋を出しおもらえたせ
>んか。strcpy() を正しく䜿っおいるかどうか、パッず芋おも分か
>らないず思いたす。局所的に芋おもわからなかったり。

 䟋えば元々同じサむズの char 型配列間で copy する時なんかだ
ず、source 偎で buffer overflow が起こっおいない限り strcpy()
で buffer overflow は発生し埗たせんよね。
 既に䟋ずしお挙がっおいるような、strdup() 時に memcpy() の
代わりに strcpy() を䜿うような䟋でも、無駄ずか合理性ずかの問
題を陀けばそう間違った䜿い方でもないず思いたす。


>>  勿論、どっちのアプロヌチもあっお構わないず思いたす。bottom
>> up なアプロヌチだず䜿う偎の粟床を期埅する蚳ですが、top down
>> なアプロヌチでは枠組の偎の粟床を期埅する蚳ですね。
>
>根性指向のプログラミングがいいずそれは、竹槍じゃないですか。

 そもそも「問題意識」っお「根性」ずは別物だず私は考えおいる
ので、「粟神さえ鍛えれば竹槍で戊闘機が萜ずせる」なんお䞖界ず
同列には考えられたせん。
 暪断歩道を枡る時には信号を過信せず巊右の確認をしたしょうず
いったような、安党に察する問題意識の話をしおいる぀もりなんで
すが、これっお粟神論ずはたた別ではありたせんか


>top down/ bottom up ずは、なんか話の぀ながりが芋えおいないん
>ですが。

 亀通安党の䟋で蚀うならば、信号機の蚭眮や道路の敎備ずいった
アプロヌチが top down で、巊右を良く芋るずか安党運転を心がけ
るずかいったアプロヌチが bottom up になるず思いたす。
 どっちか䞀方だけで十分だずいうようなこずはないず思うんです
が、bottom up 偎のアプロヌチが党く䞍芁になるくらいに top down
偎のアプロヌチを敎備すべきなんでしょうか

 文法的に strcpy() を蚱さないような仕組みは簡単に甚意出来る
でしょうけど、strcpy() を党お strlcpy() に眮換えたからず蚀っ
お、文字列 copy 時の buffer overflow に関しお programmer が
䞀切泚意を払わなくお枈むずいうのは思い䞊がりなんじゃないかず
思いたす。
 勿論 strlcpy() で眮換えるずいう方向性の努力は倧切ですけど、
その方向のアプロヌチだけで党おの安党を確保しようずするずどこ
かで砎綻するんじゃないでしょうか。
 それはむしろ危険な方法論だず思いたす。


>バッファ・オヌバヌランのバグが出たずしお、それを探したり回収
>したりするコストは、莫倧ですよ。それに比べたら、strcpy() を
>strlcpy() にするのなんか、コストはそんなにかからないでしょ。

 そうですかchar 型 pointer を匕数に持぀関数党おに size も
枡しおやるのは結構倧きなコストになるず思いたすけど。strlcpy()
の portability もそこそこ倧きな問題かず。

--
しらい たかし

ca...@xxx.kgc.co.jp

unread,
Mar 13, 2004, 11:25:43 AM3/13/04
to
5470k0 <m4r1...@d2.d10n.n3.jp> writes:

> 昔、「Cプリプロセッサ パワヌ」ずかいう本を読んでびっくりしたこず
> を思い出したした。

うわああぁぁぁあぁ
これっお林晎比叀さんのでしょ
圌の「C 蚀語スタむルブック(?)」ずか、ネタで持っおたしたが、
ほんずにネタにしかなりたせん。
「プリプロセッサパワヌ」は読んだこずありたせんが、
たあ、びっくりするような内容なんでしょうね(いろんな意味で)。

林さんの堎合、䞉田兞玄の入門・応甚・実践䞉郚䜜ずは違っお、
「デタラメをたきちらす有害図曞」指定ではないんですけどね。

神田敏広 <ca...@kgc.co.jp>

Yasushi Shinjo

unread,
Mar 16, 2004, 7:23:07 AM3/16/04
to
新城筑波倧孊情報です。こんにちは。

In article <c2v18b$1g7t$2...@nsvn01.zaq.ne.jp>


shi...@unixusers.net (Takashi SHIRAI) writes:
>  しらいです。

>  文法的に strcpy() を蚱さないような仕組みは簡単に甚意出来る
> でしょうけど、strcpy() を党お strlcpy() に眮換えたからず蚀っ
> お、文字列 copy 時の buffer overflow に関しお programmer が
> 䞀切泚意を払わなくお枈むずいうのは思い䞊がりなんじゃないかず
> 思いたす。

誰も「䞀切泚意を払わなくお枈む」ずは蚀っおいないず思いたす。
strcpy() を䜿うより strlcpy() を䜿った方が圢匏的に分かるから、
その分、プログラミングが楜だずいう話です。

> >strcpy() を正しく䜿っおいるプログラムの䟋を出しおもらえたせ
> >んか。strcpy() を正しく䜿っおいるかどうか、パッず芋おも分か
> >らないず思いたす。局所的に芋おもわからなかったり。
>  䟋えば元々同じサむズの char 型配列間で copy する時なんかだ
> ず、source 偎で buffer overflow が起こっおいない限り strcpy()
> で buffer overflow は発生し埗たせんよね。

こういう堎合でも、strcpy() より strlcpy() が楜です。

char a[100],b[100];
...
strcpy( a,b ); /* (1) */

if( strlcpy(a,b,sizeof(a)) >= sizeof(a) ) /* (2) */
{
....;
}

ここで、(1) ず (2) を比べたす。strcpy() でバッファ・オヌバヌ
フロヌが起きないこずを調べるには、次のこずを調べる必芁があり
たす。

・元々同じサむズの char 型配列間で copy であるこずを確認する
・source 偎で buffer overflow が起こっおいないこずを確認する

strlcpy() の堎合、こうりたす。

・if文を通り越しお䞋に抜けたこずを確認する

こんな感じで、strlcpy() を䜿った方が、プログラマが楜できたす。
コストが䞋がるず蚀っおもいいです。

>  そもそも「問題意識」っお「根性」ずは別物だず私は考えおいる
> ので、「粟神さえ鍛えれば竹槍で戊闘機が萜ずせる」なんお䞖界ず
> 同列には考えられたせん。
>  暪断歩道を枡る時には信号を過信せず巊右の確認をしたしょうず
> いったような、安党に察する問題意識の話をしおいる぀もりなんで
> すが、これっお粟神論ずはたた別ではありたせんか

問題意識は、わかりたした。それで、問題意識が高ければ、䜿える
道具、この堎合は、strlcpy() ですが、そういう道具を䜿うずいう
のが結論ずしお出お来るんじゃないですか。

゚アバッグも付けた方がいいし、暪滑り防止装眮も付けた方がいい。
亀通信号も付けた方がいい。亀通信号だけ信じお突っ蟌むのはバカ
です。

> >バッファ・オヌバヌランのバグが出たずしお、それを探したり回収
> >したりするコストは、莫倧ですよ。それに比べたら、strcpy() を
> >strlcpy() にするのなんか、コストはそんなにかからないでしょ。
>
>  そうですかchar 型 pointer を匕数に持぀関数党おに size も
> 枡しおやるのは結構倧きなコストになるず思いたすけど。strlcpy()
> の portability もそこそこ倧きな問題かず。

strlcpy() くらい、なければ自分で曞いお入れたらいいじゃないで
すか。BSD からコピヌしおきおもいいし。

可倉長なら、ポむンタず倧きさをいっしょに枡すのは、安党なプロ
グラムを曞く時には圓然の話です。関数呌出しで、担圓者が違うか
もしれないし、同じ担圓者でも䜕ヵ月も眮いおからいじるかもしれ
ないわけでしょ。これは倧䞈倫なんお、いちいち芚えおいられたせ
んよ。そんなこずを芚えるのはコストがかかりたす。それよりは、
可倉長の堎合は党郚倧きさも匕き回すようにした方が芚えるコスト
が䞋がっお楜できるずいうものです。

Kazuo Fox DOHZONO

unread,
Mar 24, 2004, 1:35:39 AM3/24/04
to
In article <YAS.04Ma...@kirk.is.tsukuba.ac.jp>
y...@is.tsukuba.ac.jp (Yasushi Shinjo) writes:

> > typedef struct { char name[FSTRING_LEN]; } fstring;
> > ずかにすれば良いのですかね
>
> それ、いいですね。

正盎, このコメントには「䜕を今曎 」ず思わされたした. 私の strcpy が数
癟出おくるものでも䜿われおるし ([] 内は即倀で長さが必芁な堎合 *_LEN は
䜿わず芁玠数から埗るようにしおたすけど).

ずかいっおも人間の手でサむズを指定させる為ではなくお, デヌタ定矩ファむ
ルからスクリプトでそれぞれをメンバずした union を構成させお, 䞀時領域
(strcpy のストア先ずか. 䞀時ずはいえ確保しっぱなしだけど) はそのサむズ
で確保したりするわけです. チェックルヌチンも同様.

# ちなみにこの仕組みをバむパスしおデヌタを定矩するず, 諞々の関連ルヌチ
# ン (コンストラクタみたいなのずか) が生成されないので簡単にはリンク出
# 来なくなりたす. 楜しようずした結果こうなっただけですが.

Kazuo Fox DOHZONO

unread,
Mar 24, 2004, 1:22:10 AM3/24/04
to
堂園です.

なんか色々話が進んでいるようですが.

In article <YAS.04Ma...@kirk.is.tsukuba.ac.jp>
y...@is.tsukuba.ac.jp (Yasushi Shinjo) writes:

> > > セキュリティ䞊の匱点に繋がる間違い
> > > セキュリティ䞊の匱点には繋がらない間違い
> > これをプログラマが区別しないずいけないのかなぁ (区別するずしたらどう考
> > えたら捉えたらいいのだろう), ずいうのがここ数幎私が考えおいるテヌマ
> > だったり.
>
> 私はを区別する必芁があるず思いたす。䞡方無くなれ
> ばそれに越したこずはないけれど、朰すならたず優先的にか
> ら朰せずいう意味です。

そういう蚭蚈指針 (プログラマに個別に負担させる) であれば, C 蚀語を遞ん
だ時点で間違っおいるず思いたす. C を䜿うのであれば, 別の蚭蚈指針を採択
すべきだず思うし.

> > 「strcpy で出おくるようなセキュリティ䞊の問題」は出おこない. しかし,
> > 個別に䞀々プログラマに担わせおいたのでは駄目なんじゃないですか?
>
> いいえ。トヌタルで考えれば、バグ入りプログラムからバグを芋぀
> けるより、最初からバグがないプログラムを曞く方が楜埗です。

そういう方針で䜜れるプログラムっおずおもずおも小さなものに限られちゃう
ず思いたす. 芋通しも悪くなるし.

> > 責任は曞かせた人にもあるわけです. 「この゜フトりェアはどのような蚭蚈思
> > 想に基づいおいお, それがどのように実装されおいるのか」ずいうレビュヌた
> > で普通やるじゃないですか.
>
> 「普通」ずいうのは、どういう状況でしょうか。もう少し詳しく教
> えおください。倧孊だず䜕が普通なのかが実はよく分からないずい
> う話がありたす。

手を入れる゜フトりェアに䞊の「」のような文曞がない堎合, それを䜜成する
ずころから始たりたす. で, その蚭蚈方針が「ちょっずなぁ」ずいうものであっ
た堎合は, ゜フトりェア党䜓を䜜り盎すこずもあるわけです.

次に実際の゜フトりェアず぀き合わせながら, 手を入れるこずによっお及ぶ圱
響の範囲ずテストの条件などを掗い出しおいきたす (で, 芋積りを出したり).

 なんおこずを䌚瀟ではやるわけですが, 文曞に起こすかどうかは別ずしお普
通個人で゜フトりェアを改倉する堎合でもやっおいるこずだず思いたす (私は
孊生時代からそうしおいたけどなぁ). 以前䜕凊かでコヌディングスタむルの
話が出た時に「基本的に元のスタむルに合わせる」ずいう話になっおいたず思
いたすが, それのもうちょっず䞊のレむダでもそうする, ずいう感じ.

> 「そんなこずもあろうかず」っお、蚀っおみたいセリフでしょ。

strlcpy が働いた時点で蚀える台詞ではありたせんよね. それは正しくない゜
フトりェアが, 正しくない動䜜をした時なのですから.

○

「正しさよりもセキュリティに重点を眮く」ずいう指針からは「䜕もしないプ
ログラム」が導かれちゃう, ずいう話に぀いおはどうお考えですか?

Yasushi Shinjo

unread,
Mar 25, 2004, 3:13:12 AM3/25/04
to
新城筑波倧孊情報です。こんにちは。
話がもどっおしたうんだけど、

In article <c3sj8v$21rk$1...@news2.rim.or.jp>


doh...@hf.rim.or.jp (Kazuo Fox DOHZONO) writes:

> 堂園です.
> なんか色々話が進んでいるようですが.
> > > > セキュリティ䞊の匱点に繋がる間違い
> > > > セキュリティ䞊の匱点には繋がらない間違い


> > 私はを区別する必芁があるず思いたす。䞡方無くなれ
> > ばそれに越したこずはないけれど、朰すならたず優先的にか
> > ら朰せずいう意味です。
> そういう蚭蚈指針 (プログラマに個別に負担させる) であれば, C 蚀語を遞ん
> だ時点で間違っおいるず思いたす. C を䜿うのであれば, 別の蚭蚈指針を採択
> すべきだず思うし.

最初から私は蚀語を䜿うなず曞いおいたす。

> > > 責任は曞かせた人にもあるわけです. 「この゜フトりェアはどのような蚭蚈思
> > > 想に基づいおいお, それがどのように実装されおいるのか」ずいうレビュヌた
> > > で普通やるじゃないですか.

> 手を入れる゜フトりェアに䞊の「」のような文曞がない堎合, それを䜜成する
> ずころから始たりたす. で, その蚭蚈方針が「ちょっずなぁ」ずいうものであっ
> た堎合は, ゜フトりェア党䜓を䜜り盎すこずもあるわけです.
>
> 次に実際の゜フトりェアず぀き合わせながら, 手を入れるこずによっお及ぶ圱
> 響の範囲ずテストの条件などを掗い出しおいきたす (で, 芋積りを出したり).

それで、どういう方針なら、「strlcpy() を䜿うな、strcpy() を
䜿え」ず出おくるののですか

> > 「そんなこずもあろうかず」っお、蚀っおみたいセリフでしょ。
> strlcpy が働いた時点で蚀える台詞ではありたせんよね. それは正しくない゜
> フトりェアが, 正しくない動䜜をした時なのですから.

人間は垞に間違うずいうこずを認めようずいう話をしおいるんだけ
ど。人間は正しいく動䜜する゜フトりェアを曞いた぀もりなんだけ
ど必ず間違えたす。それで、間違いをしないようにプログラムを曞
くのはもちろん倧事です。でも、間違ったずしおも、安党なプログ
ラムを曞くずいうのも倧事です。そういう話をしおいたす。

> 「正しさよりもセキュリティに重点を眮く」ずいう指針からは「䜕もしないプ
> ログラム」が導かれちゃう, ずいう話に぀いおはどうお考えですか?

始めお聞きたした。堂園さんのオリゞナルですか誰がの蚀葉ですか

「正しさ」の䞭に「セキュリティ的な匱点ががない」も入れおおけ
ばいいだけの話だず思いたす。察立する話じゃないです。

 新城 靖 しんじょう やすし 
 筑波倧孊 電子・情報       

----------------------------------------------------------------------
From: y...@is.tsukuba.ac.jp (Yasushi Shinjo)
Message-ID: <YAS.04Fe...@kirk.is.tsukuba.ac.jp>
Date: 21 Feb 2004 14:53:37 GMT
Organization: Institute of Information Sciences and Electronics, University of
Tsukuba
In-reply-to: doh...@hf.rim.or.jp's message of 21 Feb 2004 11:07:31 GMT
Newsgroups: fj.comp.lang.c
Subject: Re: strcpy, strlcpy.
References: <YAS.04Ja...@kirk.is.tsukuba.ac.jp>
<c17e5u$2eji$1...@news2.rim.or.jp>

新城筑波倧孊情報です。こんにちは。

叀い蚘事が読たれるず、新しい蚘事よりも嬉しいですね。いい蚘事
だったんだなあずいう感じがしお。

In article <c17e5u$2eji$1...@news2.rim.or.jp>


doh...@hf.rim.or.jp (Kazuo Fox DOHZONO) writes:

> ぀ら぀らずその理由を考えおみたのですが, 芁するに strcpy では問題のある
> ようなアプリケヌションが, strlcpy によっお盎ちに正しく動䜜するようにな
> るわけではない, ずいうこずかな.
>
> ・ほずんどの堎合その前にチェック出来るハズ.

はい。それはそうです。strlcpy() は、バッファ・オヌバヌフロヌ
を起さないずいう目的で䜿うものです。strlcpy() を䜿ったからず
いっお、間違ったプログラムが「正しく」動䜜するようになるわけ
ではありたせん。

> 䜕も考えずに strlcpy 䜿っお, 長さを越えた堎合に適圓に truncate ずかす
> る人がいたりするず, "foobar" で登録したデヌタが "foobar" でも "foo" で
> も読めおしたうずいった問題が玛れ蟌んだりするかもしれたせん.
> それよりはテストで萜ちおもらった方がありがたいず思うのですが.

テストでは、バッファ・オヌバヌフロヌは芋぀かりにくいんじゃな
いですか。それより、"foobar" が "foo" に぀められお動䜜がおか
しいいう方が芋぀かりやすいんじゃないかなあ。

> ・間違いやすい人間に毎回長さを指定させるなんお.
> たぁこれも結構倧きい理由でしょう. それず
> ・長さだけ指定しおチェックしないっおこずはないよね?
> if (strlcpy (buf, src, sizeof buf) == sizeof buf)
> /* さお, どうするの? */;
> 間違いやすい人間に毎床毎床チェックさせるの? ずいう話にもなりたす.

それは、同感です。たあ、マクロ䞀発ずいう話もありたすけど。

#define Strlcpy(dst, src, size) if( (strlcpy((dst),(src),(size))>=(size)) ) \
error("buffer over flow.")

それで、毎回チェックするのがいやになったら、蚀語をやめお
に移るわけです。

miho

unread,
Mar 31, 2004, 6:51:47 AM3/31/04
to
C 蚀語だず(b)のように曞くのが普通で,
(b)のほうが読み易いず感じる人が非垞に倚いでしょうから,
ちょっず䟋ずしおは良くないかもしれたせんが,
本質はそこではないこずをご理解䞋さい.

for (i=0; i!=sup; ++i) { ... } /* (a) */

for (i=0; i<sup; ++i) { ... } /* (b) */

昔は, これらのプログラムの断蟺の盎前たでに sup の倀の正圓性が
確認されおいたずしおも, 埌者の様に曞けず蚀われたもんです.
埌者の方が遅い凊理系だったずしおもです.
(昔はそんな凊理系が本圓にあったんです.)

どうも, strcpy ず strlcpy の関係は, 䞊の2䟋の関係ず䌌おいる様な気がしたす.
なんずいうか, 気持ずしおは, フェむルセヌフだず思うんです.

それはさおおき,
党おのプログラムをきちんず蚭蚈しお党く問題の無い補品を䜜れれば
それはそれでずおも良いこずでしょう.
しかし, それは補品の正しさを 100% 保蚌するずいうこずで,
実際問題ずしおそれは非垞に困難なこずです.

珟代工孊および珟代の工業補品では, 補品に䞀定の䞍良率を蚱しおいたす.
䟋えば, アポロ宇宙船なら 99.999999999% の皌働率を目暙ずする,
ずいった感じで, この堎合なら 0.000000001% の堎合は盎ちに人呜にかかわる
にもかかわらず, です.
これは宇宙船に限ったこずではなく,
建造物(建物, 橋, 道路など),
乗り物(電車, 自動車, 飛行機など),
電子郚品, コンピュヌタ,
その他身の回りにある倧小さたざたな工業補品ずいえるもので,
その性胜や安党性を 100% 保蚌しおいるものはどれひず぀ずしおありたせん.
(極東のずある島囜では,
原子力発電所などは 100% 壊れないこずになっおいるそうです.)

それが゜フトりェアになったずたん 100% の保蚌が付いおくる,
なんおのはおかしい話です.
゜フトりェアは時間の経過で劣化するこずはないので,
ほずんどの堎合,
壊れるずいうよりは䞍具合が発芋されるこずになりたす.

゜フトりェアは工業補品ではない? そうかもしれたせん.
だずしたら議論はここで終り.
私は゜フトりェアも工業補品だず思いたい(*** 自己矛盟しおしたった...).
そしお, 珟代に生きる我々は, ゚ンゞニアもナヌザも,
゜フトりェアに぀いお, ある䞀定の䞍具合たでならそれを受け入れるべきです.
そうした時に初めお,
「䞍具合がある. そのため, 正しくはないけれども, 悪さはしない゜フトりェア」
ずいう考え方が意味を持っおくるのではないでしょうか.

同じ䞍具合でも, 呜やセキュリティに関る䞍具合の方が
そうでない䞍具合より眪が重いずは蚀えたせんか.
゚ンゞニアリングでは, それらそれぞれに぀いお
䞍具合の発生率を蚭定し, それをクリアするこずを目暙のひず぀ずしたす.
それができない゚ンゞニアぱンゞニアずは呌び難い.
そういう意味では, ゜フトりェアの倚くぱンゞニアリングの成果, すなわち
工業補品ではないのかもしれたせん(*** ここ).

䞀方, サむ゚ンスではそんなマヌケなこずは考えたせん.
サむ゚ンティストは「この理論が正しいなら, これこれこうなる」ずいう
立堎にたっお仕事を進めたす.
理論から挔繹したこずはその理論が正しい限り 100% 正しい,
それがサむ゚ンスっおもんです.
䞍具合などずいう埗䜓の知れないが発生する䜙地はどこにもありたせん.
オレの理論に埓い, オレの䜜った蚀語を䜿っおプログラミングすれば,
100% 正しい゜フトりェアを䜜るこずができる,
そう考えるのです.
(.* Software Science .* ずいう孊䌚名はそいう点ではチャレンゞングだず思う.)

私ず strcpy 掟の人の感芚の違いが,
゚ンゞニアの感芚ずサむ゚ンティストの感芚の違いでなければ良いのですが...

ずころで, 私も゜フトりェアを䜜りたすが, その䞍良率は蚈算しおいたせん.
いいかげんですみたせん.

おわび
わざずステレオティピカルに曞きたした.
実際はサむ゚ンスから゚ンゞニアリングたでは連続しおいお,
その䞭間の様々な立堎がありたすし, 誰しも, 状況に応じお
立堎を適切に切り換えおいるこずが倚いず思いたす.

Yasushi Shinjo

unread,
Apr 1, 2004, 11:28:52 AM4/1/04
to
新城筑波倧孊情報です。こんにちは。

In article <6500ebba.0403...@posting.google.com>
mihoga...@yahoo.com (miho) writes:
> 私ず strcpy 掟の人の感芚の違いが,
> ゚ンゞニアの感芚ずサむ゚ンティストの感芚の違いでなければ良いのですが...

なるほど。そういう芋方もあったんですね。面癜い。ずころで、サ
む゚ンティストの方は、strcpy() を䜿うのですか、それずも、
strlcpy() を䜿うのですか。

> オレの理論に埓い, オレの䜜った蚀語を䜿っおプログラミングすれば,
> 100% 正しい゜フトりェアを䜜るこずができる,
> そう考えるのです.

幎くらい前の仕様の怜蚌の話は、なんかトヌトロゞヌのような
感じがしたした。正しいものは正しいっお。プログラムが仕様にそっ
おいるこずはわかる。でも仕様が正しいかどうかは結局よくわから
ない。最近は、どうなんでしょうか。

仕様ずいっおも、䞀般的なものではなくお、「限られた範囲のメモ
リだけアクセスする」ずいうような仕様だったら、実甚的な速床で
動く技術はありたす。こういうのは䜿えたす。

> (.* Software Science .* ずいう孊䌚名はそいう点ではチャレンゞングだず思う.)

私は日本゜フトりェア科孊䌚の䌚員です。あんたりそういう颚に名
前は気にしたこずはなかったなあ。

In article <6500ebba.0403...@posting.google.com>
mihoga...@yahoo.com (miho) writes:
> C 蚀語だず(b)のように曞くのが普通で,
> (b)のほうが読み易いず感じる人が非垞に倚いでしょうから,


> for (i=0; i!=sup; ++i) { ... } /* (a) */
> for (i=0; i<sup; ++i) { ... } /* (b) */

これ芋お思い出したのですが、int ず unsigned int のバグが
のカヌネルからちょがちょが芋぀かっおいたす。のカヌネルは、
普通のアプリケヌションよりもくらいバグが少ないずいう
話を聞いたこずがありたす。かなり気を぀けお曞くからか、あるい
は、元々腕がた぀人が曞いおいるからか。

バグずいう意味では、Pentium ずかちょっずしたより耇雑そう
なんだけど、バグの話はあんたり聞きたせん。

> それが゜フトりェアになったずたん 100% の保蚌が付いおくる,
> なんおのはおかしい話です.

100% 保蚌ずいう話は誰もしおいたせん。CPU にできるなら、
にもアプリケヌションにもできおもいいような気がするけれど、そ
れができないのはどういう事なんでしょうね。

SAITOH akinori

unread,
Apr 2, 2004, 4:45:34 AM4/2/04
to
倧阪倧孊の霊藀です

Yasushi Shinjo wrote:
> 新城筑波倧孊情報です。こんにちは。


> バグずいう意味では、Pentium ずかちょっずしたより耇雑そう
> なんだけど、バグの話はあんたり聞きたせん。

それは、CPUのバグを話題にするコミュニティに居ないず蚀うだけでは

Pentiumは浮動小数点のわり算のバグで有名ですし(このずきは
無償亀換したはず)。

2002JulyリリヌスのPentiumIIのSpecificationUpdateは
95ペヌゞほどありたすが、そのうち2275ペヌゞたでが
ERRATAです。
しかも、結構盎しおないバグがある。たずえば、浮動小数点
挔算埌にフラグが正しくならない可胜性があるバグは、
「連続する浮動小数点挔算の間にはNOPを぀入れお回避
せよ」ずいうこずになっおいたす。

intel最初のビットCPU i8080もバグで早々に8080Aに
代わりたしたし、CPUのバグは結構あるものだずいうのが
僕の認識です。しかも、改修できないのをいいこずに、
゜フトりェアでの回避をOSに抌し぀けおいる。
昔のMIPS Rx000を䜿ったUNIX WSのシステムダりンの
ある割合いは、゜フトのバグずいえばバグだがCPUのバグ
を回避しそこなったせいだずか蚀う話をきいたこずが
ありたす。誰に聞いたのか忘れたけど。

Windowsの゜ヌスが3000䞇行あるずいわれおいたすね。
Linux2.4カヌネルが180䞇行、2.6が240䞇行だずか。
ちなみにlinux0.01は䞇行ほど。
䞀方Pentiumは、Pentium4のコアL2キャッシュを陀いた残り
が2350䞇トランゞスタだそうで。

゜ヌス行が100トランゞスタくらいだず思えば、今の
Pentiumは23䞇行皋床のプログラム盞圓。
MULTICSが䞇行だずか蚀う話なので、確かにちょっずした
OSよりは耇雑かも。

霊藀明玀 sai...@ist.osaka-u.ac.jp

It is loading more messages.
0 new messages