è²ããªæ¬ã®ããã¯ãã³ããŒãªã©ãèªã¿æŒã£ãŠããä»æ¥ãã®ããããšãã
æ¬ã«ãé¢æ°ã®æ»ãå€ãèŠãªãããã°ã©ã æžãåŠçå€éãããšãæžãããŠ
ãã£ãŠãããããè³ãçãããšããç¶æ
ã§ãã
ããã§ã¡ãããšæ»ãå€ãèŠãããšããäºã§ãä»æžããŠããã³ãŒãã®äžã«
é »åºãã 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
Hiroki Kashiwazaki <r...@cc.hokudai.ac.jp> writes:
> æåŽïŒ åæµ·éã§ãã
>
> è²ããªæ¬ã®ããã¯ãã³ããŒãªã©ãèªã¿æŒã£ãŠããä»æ¥ãã®ããããšãã
> æ¬ã«ãé¢æ°ã®æ»ãå€ãèŠãªãããã°ã©ã æžãåŠçå€éãããšãæžãããŠ
> ãã£ãŠãããããè³ãçãããšããç¶æ
ã§ãã
ã¡ãã¡ãã§ãã
ãã£ãšèè
ã¯ãExceptionãæ°ã«ããªãåŠçå€éãããšããæå³ã§æžããã®ã§ã¯
ãªãã§ããããïŒ
FILE fp=fopen("foo.txt","r");
fread(buf,10,sizeof(char),fp);
ãšãããããããã ãã«ãã£ãŠãã ãšãããããª...
# ãã®èè ãããã ã®printfã®è¿ãå€ã¯æ» å€ãªããšã§ã¯èŠããã¯ããã§ãããã«ããã
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
äžæãããprintfã®è¿ãå€ã¯å€æãããã£ãŒã«ãã®æ°ã ã£ããåãããã€ãæ°
ã ã£ãããããã§ãäºææ§ãâŠ
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() 䜿ã人ãå€ããŠå°ããŸããã©ããããããã§ããããã
ã©ã€ãã©ãªé¢æ°ã®ååã®åœ±é¿ã¯æãã§ããã
ãæ°åãéãïŒãããããããããïŒã
ãç波倧åŠãé»åã»æ
å ±ããããããã
In article <86wu82...@xh6.cc.hokudai.ac.jp>,
r...@cc.hokudai.ac.jp writes:
> è²ããªæ¬ã®ããã¯ãã³ããŒãªã©ãèªã¿æŒã£ãŠããä»æ¥ãã®ããããšãã
> æ¬ã«ãé¢æ°ã®æ»ãå€ãèŠãªãããã°ã©ã æžãåŠçå€éãããšãæžãããŠ
> ãã£ãŠãããããè³ãçãããšããç¶æ
ã§ãã
ãšã©ãŒãã§ãã¯ãã©ã®çšåºŠãã¡ããšããªããã°ãªããªããã¯ãå Žåã«ãããŸã
ãããèªåãããã¯ãã®ããã°ã©ã ãããç¥ã£ãŠãã人ã ãã䜿ãããã°ã©ã ãã
䜿ãæšãŠã«è¿ãããã°ã©ã ã®å Žåã¯ãããã»ã©ãã¡ããšããªããŠããã(éçºã®
ã¹ããŒãã®æ¹ãéèŠèŠããã)ããšãå€ã
ããã§ãããããéã«ãé
åžããŠä»äºº
ã«ã䜿ãããæ±çšããã°ã©ã ãæå³ããŠããå Žåãªã©ã¯ãããŠã³ããªãã§ãã¯ä»¥
å€ã«ãæ°ã«ããªããã°ãªããªãããšã¯å€ãã§ããããçµæ§å€§å€ãäŸãã°(ããã
å Žåã«ããããŸãã)
> printf ("FAILED.\n");
â fprintf(stderr, "FAILED.\n"); ãšãã
ããããå Žåã¯ãstrlcpy()äºæåãäœã£ãŠããã°ã©ã ã«æ·»ä»ããŠãããŠã
Linuxã§äœ¿ãå Žåã¯ããããªã³ã¯ãããããã«ããŠããã®ãããããæã§ãããã
1床äœã£ãŠããã°ä»¥åŸäœ¿ãåããã§ããããsnprintf()ã ãš(ããã¥ã¢ã«èŠãŠãé£
ããããªã®ã§?)䜿ã£ãŠãããªã人ããstrlcpy()ã ãš(æ
£ããŠããstrncpy()ã«äŒŒ
ãŠãããããš)䜿ã£ãŠãããŸããããã
ni...@ics.nara-wu.ac.jp
> ãããã¡ã»ãªãŒããŒãããŒãé²ãã«ã¯ã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é
æ°Žæž
æ³åã§ããå€åïŒstrlcpy/strlcatã¯NUL-terminate ãä¿èšŒãããŠãããïŒstrncpyã¯
å¿
ããããããšã¯èšããªãïŒstrncatã¯ä¿èšŒãããŠãããã©ïŒãšããããšãšïŒ
strlcpy/strlcatã¯ïŒã³ããŒã®çµæã®ãµã€ãºãåžžã«size_t sizeã§åºå®ãããŠãããšèš
ãããšã§ã¯ãªãã§ãããããïŒstrncatã§ã¯ïŒãããã¡ãè¶
ããŠã³ããŒããããïŒ
ã§ãïŒstrlcpy/strlcatã§ééã£ãŠïŒchar *dstã®ãããã¡ãµã€ãºä»¥äžã®æ°ãsize_t
sizeã«å
¥ããŠããŸã£ãå Žåã®åäœã¯ã©ããªã£ãŠããã®ã ããããã£ã±ïŒãããã¡ã»
ãªãŒããŒãããŒããããã®ã ããããªãïŒãããšãèªåçã«ãããã¡ãµã€ãºã«åãã
ã®
ã ããããã§ãïŒãããªã£ãŠãããšãããåãããsize_t sizeã®ãã©ã¡ãŒã¿ãªããŠ
å¿
èŠãªããªãããïŒ
--
******************************
keizi kounoike
******************************
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() ã䜿ãæ¹æ³ãšã®æ¯èŒããŸãããã
> > 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é
æ°Žæž
æ¬çããã¯é¢ããŸããïŒäžãšã»ãŒåãããšã§ãããªãïŒ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ã§ã¹ããŒãã®ããšãèšãããŠããæ°Žæžãããªã®ã«ïŒãªããå€ãªæããããŸã
ãã
>
> 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;
ãšãªããããªæ°ããããã§ãããã©ããªãã§ããããã
> ïŒ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
--
æ± ç°ç äº çš²åé§
ååšäœ
ãªãã»ã©ãæ± ç°ããïŒæ å ±æé£ãããããŸããã
strlcpyã¯ïŒNUL-terminate ãä¿èšŒããããŠããã ãã§ãªãïŒstrncpyã¿ããã«ãã
ãã¡ã®æ®ããnulã§åãããã®ãšæã£ãŠããŸãããïŒãããããªãã®ãã
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() ãªããããã ãã©ã
y...@is.tsukuba.ac.jp (Yasushi Shinjo) writes:
> ãã€ãåäœã§ã³ããŒããã®ãš memcpy() ãšã©ããªãã§ããããã
> memcpy() ã¯ã倧ãããšãã€ãåäœã§ã¯ãªããŠãã¯ãŒãåäœã§ã³ããŒ
> ãããããããããªãããªããCPU ã«ããããããããªãããã©ã
RISC 系㮠CPU ãªããmemcpy() ã ãã§ãªããstrcpy() ã§ãã¯ãŒãåäœã§è»¢é
ããå®è£
ã®æ¹ãå€ããšæããŸãã
> Pentium ã£ãŠããã€ãåäœã®æŒç®ãåŠã«éããã§ãããã
x86 ã® GNU libc ãèŠãŠã¿ãããmemcpy() ã¯ã¯ãŒãåäœãstrcpy() ã¯ãã€ã
åäœã®è»¢éã«ãªã£ãŠãŸããã
--
çå±±ïŒ ïŒ°ïŒŠïŒµ
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,
æ²³éçæ²» @ çç倧åŠå·¥åŠéšæ
å ±å·¥åŠç§,
>
> > ãããã§ããããããªããŸãïŒä»æ§ã¯è¥å¹²éã£ãŠããŸããïŒ
> > strncpy(dst, src, n);
> > dst[n] = '\0';
> > ã§ãååãªæ°ãããŸãã
>
> src ãçãæãããã¯éããã§ããstrlcpy() ãªããããã ãã©ã
質åã§ãããã€ãåäœïŒã¯ãŒãåäœã®éãã¯ããããç¥ããŸãããïŒmemcpyã£ãŠ
size_t nåãã¡ã£ãã³ããŒãããã§ã¯ãã ãšãããïŒstrncpyãéããšèšãã®ã¯
ã¡ãã£ãšçŽåŸã§ããŸãããã€ãŸãïŒã¯ãŒãåäœãèæ
®ããstrncpyãäœãã°ïŒããã®
ããç¥ããŸãããïŒmemcpyæ¡çšããã¯éããªãã¯ããšæããŸãããïŒstrlen(src)ã
äžèŠãªåã ããïŒ
> ãããã«ã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é
æ°Žæž
> ãããã«ã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() ã£ãŠã»ãšãã©äœ¿ããŸããã
>ã ãšãããïŒstrncpyãéããšèšãã®ã¯
> ã¡ãã£ãšçŽåŸã§ããŸãããã€ãŸãïŒã¯ãŒãåäœãèæ
®ããstrncpyãäœãã°ïŒãã
ã®
> ããç¥ããŸãããïŒmemcpyæ¡çšããã¯éããªãã¯ããšæããŸãããïŒstrlen(src)
ã
> äžèŠãªåã ããïŒ
èªå·±ãã©ããŒããããŸããïŒããæ€åãããŠé ããŸããæ©ãšã¡ãã§ãããã¯ãŒãåäœ
ãèæ
®ããstrncpyã®ã¹ããŒããªå®è£
ã£ãŠããç°¡åã§ã¯ãªããããªæ°ãããŸããã§ã
ããšããã§memcpyããéããªããšã¯æããŸãããã€ãŸãïŒã©ããã£ãŠæ®ãïŒããã
strlen(src)ããªããã°åãããªããïŒãã¯ãŒãåäœã«ïŒããã'\0'ã§åããã®ããš
èãããšãã¡ãã£ãšç§ã§ã¯æãã€ããŸããã
è足ã§ããïŒäžã®äŸã§ã¯ïŒæååã®ã³ããŒã ãèãããªã
memcpy(dst,src,n);
dst[n] = 0;
ã§çšã¯ãªãããã«æããŸããdst[l] = 0ã¯ä¿èšŒãããŠããããã
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ãšãããŠããã³ãããŒã¯ã§æé
> ãå€ãããªããŠã³ã£ããããããšããããŸãã
è€æ°ãã€ãã®ã¹ãã¢ããã¯ãŒãåäœã®ã®ã¹ãã¢ã«èªåçã«ãŸãšãã
ãã¯ããªããã§ãããããŒãã®æ¹ã¯ãèªåçã«ãããªããã ããã
ãã©ããã£ãã·ã¥ã§ã©ã€ãããã¯ãªãèªåçã«ãããªããšããããš
ããªãã
> > æ°åããã®èãã¯ãããšã 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é
æ°Žæž
> è足ã§ããïŒäžã®äŸã§ã¯ïŒæååã®ã³ããŒã ãèãããªã
> memcpy(dst,src,n);
> dst[n] = 0;
> ã§çšã¯ãªãããã«æããŸããdst[l] = 0ã¯ä¿èšŒãããŠããããã
ã§ãïŒãããããšïŒ memcpy ã src ã®(é
åãšããŠã®)æåŸãè¶
ããŠ
ã¢ã¯ã»ã¹ããããšãããåŸãŸãïŒãã®å ŽåïŒçµæã¯æªå®çŸ©ã«ãªããŸããïŒ
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; ã§çšã¯ãªãããã«æããŸããâã¯ïŒãŸããŸãæ€åãããŠé ããŸ
ããïŒå£ã¯çœãã®å
ãšã¯ããèšã£ããã®ã ãããã¹ãã°ããã¹ãã»ã©ãããåºããïŒ
> > > è足ã§ããïŒäžã®äŸã§ã¯ïŒæååã®ã³ããŒã ãèãããªã
> > > 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é
æ°Žæž
ãïœãããšãªããšïŒ memcpy ã¯æååã®ã³ããŒã«ã¯å±ãªã£ããããŠäœ¿ããªããšããã
ãšã«ãªãã®ããªãããïŒåãããŸãããã
> ãããã 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("ã§ãïŒç§»æ€æ§äœããïŒ");
}
ã§ããã°ã£ãŠãããŸããããã¶ãïŒæ°Žæžããã¯
if (memcmp(&s1, &s2, sizeof(s1)) == 0)
ã
if (memcmp(&s1.s, &s2.s, sizeof(s1.s)) == 0)
ãšæžãä»æãããšããããïŒæãæããã ãã ãšæã£ãŠããŸããã
ãŸãïŒäžã®å Žåã§ïŒstrncpyã䜿ãïŒä»ãŸã§ã®æ°Žæžããã®èšãããŠããããšããã¯ïŒ
æå³ã«ã€ããŠã¯ããåãããŸãããã©ã
> ã§ããã°ã£ãŠãããŸããããã¶ãïŒæ°Žæžããã¯
> 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é
æ°Žæž
"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ã®èªã¿æ¹ããã§ããªããšèšãçŽ äººã®èªã¿æ¹
ã§ãããïŒåçïŒ
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");
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() é¢æ°ãå®çŸ©ããŸãã
<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 ã§ã¯å
šãåæ³çã§ã.
--
åå€å±å€§åŠå€§åŠé¢ æ
å ±ç§åŠç ç©¶ç§ èšç®æ©æ°çç§åŠå°æ»
å°é åç·
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 ãäœããå
¥ã£ãŠããããšãä¿èšŒãããŠã
ããã§ãããã
<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?
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
ä»ã¯ã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] ã䜿ããšã©ããªãããšãã話ã
ããšããšã¯ã
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 =---
<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 ã«ãªããŸã.
> > 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
åç°æŠåž
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.
--
çå±±ïŒ ïŒ°ïŒŠïŒµ
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 ãªããèµ·ããªããïŒèµ·ããŠ
欲ãããããããåŠçç³»ã欲ãããã©ãä»ã®ç°å¢ã§ã¯ãªããªãæã«
å
¥ããªãïŒãšããããšã§ãã
In article <0401192051...@flame.hirata.nuee.nagoya-u.ac.jp>
ta...@hirata.nuee.nagoya-u.ac.jp (Takao Ono) writes:
> çŸå®çã«ã¯:
> bus error ã¯ãªããããããŸããã segmentation fault ã¯ããããŸã.
> èŠæ Œäžã¯:
> undefined behavior ãªã®ã§, äœãèµ·ããŠãæå¥ã¯èšããŸãã.
çŸå®ã®æ¹ãã
<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> çŸå®ã®æ¹ãã
æ®å¿µãªããçŸå®ã«ã€ããŠã¯ã»ãšãã©ç¥ããŸããã®ã§....
ãµãšæã£ãã®ã§ããã©ãã³ã³ãã€ã©ã®èŠæ Œã£ãŠãã³ã³ãã€ã©ãäœã
人ãèªããã®ã§ãã³ã³ãã€ã©ãäœã人ãèªããã®ã§ã¯ãªãããããª
ãããªãã
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) );
...
}
äžèŠãäžã®æ¹ãé¢æ°åŒåºããªãåéããã ãã©ããã¶ãäžã®æ¹ãé
ãã§ãããã
<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> ã§é¢åã¿ãªããŠããããããšèšã£ãŠããããããªãã§ããã
äžæ¹ã§, åŠçç³»ã䜿ã人ã«å¯ŸããŠããã©ãããæ¯èããããããšããã¯
ããªãã®è²¬ä»»ã ãããããšå®£èšããŠããããšã«ããªããŸã.
å°éããã¯ãèŠæ Œã®éãã«ã³ã³ãã€ã©ãäœãããšããããšãåæã«
ããŠããŸããã人éãäœããã®ãªã®ã§ãèŠæ Œã®éããç®æããŠã
ãã°ã¯å
¥ãããããšããšèŠæ Œèªäœã«åé¡ãããããšããããŸãã
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 ã¯èµ·ããªããšããã®ã¯ã
ããã§ããïŒãïŒèŠæ Œã¯ãšããããçŸå®ã®ã³ã³ãã€ã©ã§ååšããªããïŒ
> ããã°ã©ã ããã¡ãããšåããããã«ã¯, æ¬æ¥èŠæ Œã¯å¿
é ã®ã¯ããªãã§
> ãã....
ããã°ã©ã ããã¡ãããšåããããã«ã¯ãã³ã³ãã€ã©ãã©ãäœãã
ãŠããããç¥ãã®ãå¿
é ã§ãã
>> èŠæ Œã§ããåãåãããªãããšã«ãªãããšæžããŠããã®ã¯ãã©ã¡ã
>> ããšãããšãã³ã³ãã€ã©ãäœã人ã«å¯ŸããŠããããŸã§ã¯ã³ã³ãã€ã©
>> ã§é¢åã¿ãªããŠããããããšèšã£ãŠããããããªãã§ããã
> äžæ¹ã§, åŠçç³»ã䜿ã人ã«å¯ŸããŠããã©ãããæ¯èããããããšããã¯
> ããªãã®è²¬ä»»ã ãããããšå®£èšããŠããããšã«ããªããŸã.
ããã¯ãèŠæ Œã決ããŠãããšããããã¯ãã³ã³ãã€ã©ãšäœ¿ã人ã®é
ã§æ±ºããŠãã話ãããªãã§ããã
çµå±ãèŠæ Œãæã¡åºããŠãæã¡åºããªããŠãçµæãåãã§ããèš
èªã§ããã°ã©ã ãæžããªããèŠæ Œãå匷ããããããšã
ã®å匷ãããæ¹ãããããããªãã§ããã
èªåã®æå
ã§åãã°ããããã°ã©ã ãäœãã®ããé
åžããŠæ§ã
ãªç°å¢ã§äœ¿ãã
ãããšãç®çãšããããã°ã©ã ãäœãã®ããã«ãããããããªãã§ãããã
åŸè
ã®å Žåãæå
ã®åŠçç³»ã§ããŸããŸåãããšããã ãã§ã¯ãä»ã®æ§ã
ãªç°å¢
ã§åãããšã¯ä¿èšŒã§ããŸãããã§ãå°ãªããšãèŠæ Œãæºãããã³ã³ãã€ã©ã§ã¯ã¡ã
ããšåãããã«äœããããã°ãããæžãæ¹ããããšãèŠæ Œã§ã¯ã©ãåãããšã«ãªã£
ãŠããããã¯ç解ããŠãããã°ãªããªãããã§ãã
ni...@ics.nara-wu.ac.jp
> >> èŠæ Œã«ã¯ãèå³ã¯ãããŸããªãã®ã§ãèå³ãããã®ã¯ãããããã°
> >> ã©ã ãæžãããšãããããããã°ã®æ¹æ³ã§ãã
> > ãããããã°ã©ã ããšã¯ã©ãããæå³ã§ãããã? ãã®æå³ã«ãã£ãŠã¯
> > èŠæ ŒãéèŠã«ãªããããšæããŸã.
>
> ããããã°ã©ã ãšã¯ãäžçªã¯ã人éãèªãã§åãããããããã°ã©
> ã ããªãããããããã¡ãããšåãïŒããããã°ã©ã ã§ãåããªã
> ã®ãå Žåã«ãã£ãŠã¯èš±ãïŒã次ã¯å¹çãããïŒããããã°ã©ã ã§ã
> å¹çãæªããŠãå Žåã«ãã£ãŠã¯èš±ãïŒã
ãã®ããããããã°ã©ã ãã®å®çŸ©ã¯ã©ãããæ¥ããã®ãªã®ã§ãããïŒ
èªã¿ããããã°ããããå¹çããããã£ãŠããããšãåããªãã£ãŠ
ãããã£ãŠããšã§ãããã
æè¿ã¯ããããã®ãäž»æµãªãã§ããããïŒãšã£ãŠãèå³ããããŸãã
ãã²ããããèãã«ãããéçšãšãããè«çãšããããããããã®
ãæããŠãã ããã
P.S.
segmentation fault ãšãã®è©±é¡ã¯ããããããŸããã®ã§é芳ãã
ãŠããã ããŸããç§ã®èãã¯å€ªç°ããã«ãã©ããŒããŠããã ããé
ãã§ãã
P.P.S
é
åã®åæåã¯åãªãæžãæãã§ãã^^; ãã¿ãŸããã
Cã§ã§ããããã«ãªã£ããšãããªãã£ãŠããã®ã¯å°éããã®èšäºã
æèŠãããŸã§ç¥ããŸããã§ããã
--
01/21 22:33é
æ°Žæž
In article <m3u12p2z...@kzin.dip.jp>, Mito <co_...@ybb.ne.jp> writes
> èªã¿ããããã°ããããå¹çããããã£ãŠããããšãåããªãã£ãŠ
> ãããã£ãŠããšã§ãããã
>
> æè¿ã¯ããããã®ãäž»æµãªãã§ããããïŒãšã£ãŠãèå³ããããŸãã
> ãã²ããããèãã«ãããéçšãšãããè«çãšããããããããã®
> ãæããŠãã ããã
人éã®ããã®ä»æ§ãšããŠããã°ã©ã ã䜿ããªããããããè«çã§å
é¡ãªãã§ãããŸãã©ã䜿ã£ãŠãããã£ã¡ãããããã ãã
> ãã®ããããããã°ã©ã ãã®å®çŸ©ã¯ã©ãããæ¥ããã®ãªã®ã§ãããïŒ
èŠæ Œãã©ããããããã£ãŠäººéã£ãŠããããã°ã©ã ã¯äººéã
èªãä»æ§ã§ãããã£ãŠããšãå¿ããŠããã®ãã...
èŠæ Œãäžã€ããããŠãå®è£
ãäžã€ãå®ã¯åããšã¯éããªããèŠæ Œã¿
ãªãã®ã銬鹿ã§ã¯ãããã©ãèŠæ Œã ããä¿¡çšããã®ãè¯ããªãã§ã
ãã
---
Shinji KONO @ Information Engineering, University of the Ryukyus,
æ²³éçæ²» @ çç倧åŠå·¥åŠéšæ
å ±å·¥åŠç§,
èšèªã®è©±ããå€ããŠãããã ããã©ã
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 èªããšããã®ãããã£ããã ãã©ã
Symbolics C ã§ã¯ïŒsegmentation fault ã«ã¯ãªããŸããã ãã®å Ž
åãx ã¯æªå®çŸ©ã®å€ã«ãªããŸããïŒãã¡ããïŒchar åã§ã¯ãããŸã
ãããïŒãŽãã®å€ãšããããã§ãããããŸããïŒ
> > ãã®ããããããã°ã©ã ãã®å®çŸ©ã¯ã©ãããæ¥ããã®ãªã®ã§ãããïŒ
>
> ãã®ããããã°ã©ã ã®å®çŸ©ã¯ãæ°åã®çŽæã§ãããŸã説æãããšã
> æè¡ã®é²æ©ãèãããšã
>
> ã»å¹çã®æ¹ã¯ãã³ã³ãã€ã©ãé 匵ãã°ãããéšåè©äŸ¡ãšãã
> ã»ããããã°ã©ã ãåããªããªããã³ã³ãã€ã©ãšèŠæ Œãæªããã ã
> ããããããã°ã©ã ã¯ãã®ãŸãŸã§ã³ã³ãã€ã©ãšèŠæ Œã®æ¹ãæ¿ããã°ããã
>
> ãšããã®ããããŸãã
ãªãã»ã©ãã¡ãã£ãšèããŠããããšãšã¯éããŸããããçŽåŸã§ãã
> èšèªã®è©±ããå€ããŠãããã ããã©ã
ã§ã¯ãã¡ãã£ãšæ»ããŠãããããã°ã©ã ãåããªããªããã³ã³ãã€
ã©ãšèŠæ Œãæªããã«ã€ããŠã
çŸåšã®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é
æ°Žæž
> > èªã¿ããããã°ããããå¹çããããã£ãŠããããšãåããªãã£ãŠ
> > ãããã£ãŠããšã§ãããã
> >
> > æè¿ã¯ããããã®ãäž»æµãªãã§ããããïŒãšã£ãŠãèå³ããããŸãã
> > ãã²ããããèãã«ãããéçšãšãããè«çãšããããããããã®
> > ãæããŠãã ããã
>
> 人éã®ããã®ä»æ§ãšããŠããã°ã©ã ã䜿ããªããããããè«çã§å
> é¡ãªãã§ãããŸãã©ã䜿ã£ãŠãããã£ã¡ãããããã ãã
ããã¯ä»æ§æžãšããããã¥ã¡ã³ãã£ãŠããããããªãã§ããããïŒ
人éãèŠãŠä»æ§ãç解ããããã®ææžãšããããšã§ãããïŒ
> > ãã®ããããããã°ã©ã ãã®å®çŸ©ã¯ã©ãããæ¥ããã®ãªã®ã§ãããïŒ
>
> èŠæ Œãã©ããããããã£ãŠäººéã£ãŠããããã°ã©ã ã¯äººéã
> èªãä»æ§ã§ãããã£ãŠããšãå¿ããŠããã®ãã...
>
> èŠæ Œãäžã€ããããŠãå®è£
ãäžã€ãå®ã¯åããšã¯éããªããèŠæ Œã¿
> ãªãã®ã銬鹿ã§ã¯ãããã©ãèŠæ Œã ããä¿¡çšããã®ãè¯ããªãã§ã
> ãã
ãïœããä»°ãå
容ã¯ç解ã§ããŠããã€ãããªã®ã§ãããç§ã®åãã«
察ããè¿äºãšããŠã¯ç¹ãããããããªãã®ã§ãããè¡éãèªããªã
ç§ã«ããããããã«ããå°ã解説ããŠã¯ããã ããªãã§ããããïŒ
--
01/22 23:28é
æ°Žæž
ãã€ã³ã¿ãšã¢ãã¬ã¹ã£ãŠåããããªãã®ã ãšæã£ãŠãããã§ãããéããã§ããã
>
> ïŒ Cã®ãã€ã³ã¿ã«ã¯å€§å°é¢ä¿ãªããŠååšããªããšæã£ãŠãããã§ã
> ïŒ ããããã¯ééã£ãèŠèã ã£ãã§ããããïŒ
> ïŒ
> ïŒ ã€ãŸããäžã®äŸã§ã¯âãªããŸã ããããªã£ãŠãšããã ãšæãã
> ïŒ ã§ããã
> ïŒ for (p = &a[0]; p != &a[10]; p++)
ãã€ã³ã¿ã«å€§å°é¢ä¿ãååšããªããšããã°ïŒã©ããã£ãŠãã€ã³ã¿ãé²ãããïŒæ»ãã
ãããæŠå¿µãèŠå®ããã°ãããã§ããããã
<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 ã ãã®
# ãããª.
> > > ïŒ Cã®ãã€ã³ã¿ã«ã¯å€§å°é¢ä¿ãªããŠååšããªããšæã£ãŠãããã§ã
> > > ïŒ ããããã¯ééã£ãèŠèã ã£ãã§ããããïŒ
> ãã€ã³ã¿ã®å€§å°ã¯ãã¢ãã¬ã¹ç©ºéäžã«ãããçžå¯Ÿäœçœ®ããšããŠå®çŸ©ãã
> ãŠããŸã.
ããããããŸãŸã§ééã£ãŠèŠããŠããããã§ããããããšãããã
ãŸããã
倧å°é¢ä¿ã¯ååšãããã©å¶çŽãããã®ã§ã< ã > ãªããã§æ¯èŒã
ã¹ããã®ããããªããšã§ãèŠããŠãããŸããã
--
01/23 12:15é
æ°Žæž
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é
æ°Žæž
<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 ãæãç«ã€ããšã«ãªããŸã.
> indeterminate value ã ããããããã®èªã¿åºãã undefined behavior
> ã«ãªããããããªã. ã§, undefined behavior ã ããã©ãæ¯èããã¯å
š
> ãåããªã. äœãå€ãè¿ã£ãŠãããããããªãã, ããã°ã©ã ãç°åžžçµ
> äºãããããããªã.
indeterminate value ããçŽã¡ã« undefined behavior ãæå³ããããã§ã¯ã
ããŸããã
trap representation ãæã€åŠçç³»ã§ã¯ãtrap representation ãåç
§ããã
ãšããæ㯠undefined behavior ãšãªããŸãã
ããããããåã trap representation ãæã€ãåŠã㯠implementation
defined ã§ãããã ããchar å㯠trap representation ãæããªãããšãèŠ
å®ãããŠããŸãã
--
çå±±ïŒ ïŒ°ïŒŠïŒµ
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" ã®æå³ãããããšãã£ãããããšã
ãã®ããã£ãã®ã§ãããããç»é¢ããªãã³ã³ãã¥ãŒã¿ãå€ããã
> å现èã®ç§ã«ã¯ä»ã®èšèªã«ä¹ãæããã»ãã幞ãã«ãªããããªæ°ã
> ããŠããã®ã§ããã
åæã§ããä»ã§ãèšèªã§ã¯ãªããŠãïœïœïœãšãä»ã®èšèªã§æžã
ãæ¹ãããå Žåã¯ããªãå€ããšæããŸãã
> ã倧å°é¢ä¿ã®ååšããšããã€ã³ã¿ãé²ãã/æ»ãããšã¯å¥åé¡ã§ã¯ãªãã
> ãš. çŸã« C++ ã®ã€ãã¬ãŒã¿ã§ã¯ã倧å°é¢ä¿ãã¯ãªããŠããé²ãã/æ»ãã
> ãšããæäœãå¯èœãªäŸããããŸã.
> # ãšããã, ã倧å°é¢ä¿ããããã®ã¯ random access iterator ã ãã®
> # ãããª.
確ãã«å¥åé¡ãããããŸãããïŒããã€ããããšã¯åºæ¥ããããªæ°ãããŸãã
åæ¹åïŒãåæ¹åïŒé 次ã¢ã¯ã»ã¹ã§ãïŒäŸãã°
P1=P0ïŒ(é²ãã)ãããP1 > P0ã
P1=P0ïŒ(æ»ã)ãããP1 < P0ã
P1=P0ïŒ(ïœé²ããïŒïœæ»ã)ãããP1 = P0ã
ãšæ±ºãããšããïŒæŠå¿µäžã ãã®è©±ã§ãããïŒ
ãŸãïŒå©çšäŸ¡å€ãæå³ãç¡ããšã¯æããŸããã
> > ã»ããšã«é åã ãããšãæ§é äœã ãããšããå¶çŽãªãã§ããããïŒ
> ãã¢ãã¬ã¹ç©ºéäžã®çžå¯Ÿäœçœ®ã§å€§å°é¢ä¿ãå®çŸ©ãããããšæžããŠããã
> ãã§ããã©....
>
> ãã®ãã¡, ãèªåçã«ç¢ºå®ããäŸããšããŠãé
åããšããæ§é äœãã
> (èŠæ Œã§) æããããŠãããã ãšæããŸã.
ããããããããããšã§ãããåéãããŠãŸããã
ããããšãããããŸããã
--
01/24 16:47é
æ°Žæž
ã©ããç§ã®æèŠãš strlcpy ã£ãŠåããŸãã. ç¹ã« strcpy ã®çœ®ãæããšããŠ
ã¯èããããªã.
ã€ãã€ããšãã®çç±ãèããŠã¿ãã®ã§ãã, èŠããã« strcpy ã§ã¯åé¡ã®ãã
ãããªã¢ããªã±ãŒã·ã§ã³ã, strlcpy ã«ãã£ãŠçŽã¡ã«æ£ããåäœããããã«ãª
ãããã§ã¯ãªã, ãšããããšããª.
ã»ã»ãšãã©ã®å Žåãã®åã«ãã§ãã¯åºæ¥ãããº.
å¯å€é·ã®æååãæ±ãå Žåã§ã, ä»æ§ã®äžé (ãš, äžéã«éããæã®æå) ã¯
決ãŸã£ãŠããã¯ãã ã. æ±çšçãªã©ã€ãã©ãªã§ãã¢ãã±ãŒã¿ãå©çšè
ã«çšæã
ãããšã, è²ã
ããæ¹ã¯ãããšæãã.
ããºã€ããšã®æ¬è³ªã¯ãäžé©åœãªå€§ããã®ãããã¡ãé©åœã«åã£ãŠããŸãããšã
ã ãšæããã§ã. é·ãã®ãã§ãã¯ã¯å
¥åæãæååã®åãåºãæã«ããã°ãã
ããã§, *cpy ãªããããåã«ãããã§ãã? ãšããããš.
ç§ã¯ strlen ãªããã奜ãã§ã¯ãªãã®ã§ãªãã¹ãæåçš®ãã§ãã¯ãªãããšäžç·
ã«ããããã«ããã. ããããèãã«åŸãã°, strlcpy ã¯æåã®ã³ããŒãšæå
åé·ã®ã«ãŠã³ããåæã«è¡ãããå Žåã«äœ¿ããšããè³æ¥µãã£ãšããªè©±ã«ãªããŸ
ã.
ã»ééãããã人éã«æ¯åé·ããæå®ããããªããŠ.
ãŸããããçµæ§å€§ããçç±ã§ããã. ãããš
ã»é·ãã ãæå®ããŠãã§ãã¯ããªãã£ãŠããšã¯ãªããã?
if (strlcpy (buf, src, sizeof buf) == sizeof buf)
/* ããŠ, ã©ãããã®? */;
ééãããã人éã«æ¯åºŠæ¯åºŠãã§ãã¯ãããã®? ãšãã話ã«ããªããŸã.
ããããããã§è¶³ããªããªãå Žåã¯ãã° (ãããã¡é·äžè¶³) ãä»æ§å€ã®å
¥åã
ã®ã©ã¡ããã§, ãã°ãªã strlcpy ã䜿ã£ãŠããããã¡ãå®ããããé·ããŸã§
å¢ãããªããã°æ£ããåäœããªãã§ãããã, ä»æ§å€ã®å
¥åããããããšãã
ã«ãŸã§å
¥ã蟌ãã§ããã®ãªã, ãããã strcpy ã䜿ããå Žé¢ã§ã¯ãªãã£ãã
ãã§ã. åŸè
ãåé¡ã«ããã®ãªã, å¥ã®åé¡ãæ±ã蟌ãã§ããå¯èœæ§ã倧ãã.
â
äœãèããã« strlcpy 䜿ã£ãŠ, é·ããè¶ããå Žåã«é©åœã« truncate ãšãã
ã人ãããããããš, "foobar" ã§ç»é²ããããŒã¿ã "foobar" ã§ã "foo" ã§
ãèªããŠããŸããšãã£ãåé¡ãçŽã蟌ãã ããããããããŸãã.
ããããã¯ãã¹ãã§èœã¡ãŠããã£ãæ¹ãããããããšæãã®ã§ãã.
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
æ²³éçæ²» @ çç倧åŠå·¥åŠéšæ
å ±å·¥åŠç§
å€ãèšäºãèªãŸãããšãæ°ããèšäºãããå¬ããã§ãããããèšäº
ã ã£ããã ãªããšããæããããŠã
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.")
ããã§ãæ¯åãã§ãã¯ããã®ãããã«ãªã£ãããèšèªããããŠ
ïœïœïœã«ç§»ãããã§ãã
> 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 ãšããã¯ãã®æãã®æã®ç¶æ³ã«å¿ããŠäºè±¡ã®å·»ãæ»ãããäœãã
é¢åãã¿ãŠãããéæ³ã®ä»çµã¿ãªãã§ãã?
# æ»ãå€ã«å¯Ÿããäžçå·ãæ°æã¡æªããªã.
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 ã®ããã¥ã¢ã«ã«æžããŠããéãã§ããæ°ææªãã®
ãèŠãããªããã°ãã¯ãã䜿ãã°ãããã
> ããããéèŠãªããšã¯ãééãã«ã¯ïŒçš®é¡ãããšããããšã§ãã
>
> ïŒïŒ¡ïŒã»ãã¥ãªãã£äžã®åŒ±ç¹ã«ç¹ããééã
> ïŒïŒ¢ïŒã»ãã¥ãªãã£äžã®åŒ±ç¹ã«ã¯ç¹ãããªãééã
ãããããã°ã©ããåºå¥ããªããšãããªãã®ããªã (åºå¥ãããšãããã©ãè
ãããïŒæãããããã®ã ãã), ãšããã®ãããæ°å¹Žç§ãèããŠããããŒã
ã ã£ãã.
ããŸã説æåºæ¥ããã©ããèªä¿¡ãããŸããã.
ããšãã°äººåœã«é¢ããã·ã¹ãã ãš, å©çšè
ããèŠãŠããã»ã©ãã¹ãéèŠèŠãã
ãªããããªã·ã¹ãã ããã£ããšããŸã. 瀟äŒé念äžãããã«ããã£ãŠããéçº
ã³ã¹ããšãã«ã¯, ãããªãã«å·®ãããã¯ãã§ããã.
ã§, ãããããã°ã©ãããèŠãå Žåã©ã®ãããªéããšãªã£ãŠçŸããã®ã. ã©ã¡
ããã¢ãã¿ã»ããŒããŒããåã«ããŠããã°ã©ã ãæžããšããäœæ¥èªäœã¯åãã
ãã§. éãã¯èšèšææ³ããäœããã®æ¹ã«è¡ã£ãŠ, ããã°ã©ã ãæžãäžã段ã«ã¯
å
¥ã£ãŠããªãããããªãã (å
¥ããã¹ãã§ã¯ãªãã®ã§ã¯) ãšæããã§ããã©.
> strlcpy() ã䜿ããšãïŒïŒ¡ïŒã¯åºãŠããŸããã
ãstrcpy ã§åºãŠãããããªã»ãã¥ãªãã£äžã®åé¡ãã¯åºãŠããªã. ããã,
åå¥ã«äžã
ããã°ã©ãã«æ
ãããŠããã®ã§ã¯é§ç®ãªããããªãã§ãã?
> > ããããã®ããäžé©åœãªãããã¡ãé©åœã«ãšãããš (ããšãã°, FILE * ãšç¡
> > é¢ä¿ãªå Žæ㧠BUFSIZ ã䜿ã£ãŠã¿ãããšã)ãã®åŒå®³ã§ããã. éäžè¶³ãªã
> > (éâŠãªã, ãããœ) 確ä¿ããããã«ããŠ, ä»æ§äžã®æ倧é·ããã®æ°åçšåºŠã
> > å
¥ããŠã¿ãã°å€§æµçºèŠããã®ã§ã¯ãªãã§ãã. ç§ã®çµéšäžã¯ãããªæã.
>
> ãã®çµéšã¯ãããããã¡ã»ãªãŒããŒãããŒã¯ã次ã
èŠã€ããããã
> ãæ·±å»ãªã»ãã¥ãªãã£äžã®åé¡ãåŒãèµ·ããã®ãšããŠèŠã€ããããš
> ãå€ãããšããçŸå®ãšã¯ãããŠããŸããCERT ã§ã Bugtraqq ã§ã
> èŠãŠã¿ãŠäžããã
ãããã¯ç§ãæ³å®ãããããªå³ãããã¹ããè¡ãªã£ãŠããã®ã§ãã? (ãã®é »
床ããã¯ã¡ãã£ãšä¿¡ããããªããªã). ããã«, ããã㯠strlcpy ã§çŽããšã
ãé¡ã®ãã®ãªã®ã§ãããã.
ãããã¯äžã®äžã®åé¡ãèµ·ãããŠããªããœãããŠã§ã¢çŸ€ã«æ¯ã¹ãŠ (ææã«) å€
ãã®ã§ãã? å°ãªãã®ã§ãã?
> > âŠãšã¯ãããã£ã±ããã¹ãã«é Œããããªèšèšã«ã¯ããªããªã. ä»ãã£ãŠãä»äº
> > 㧠grep ããã strcpy ã 200 åãããåºãŠããŸãããã©, ãããã¡é·ãšã
> > ã¯ããã°ã©ã ã§ç®åºãããŠãã§ãã¯ã¯äžäœå±€ã§ãã£ãŠãã. ãã¡ãããã¹ãã
> > ãã£ãŠãŸããã©.
>
> ãã®ããã°ã©ã ãææ¥èª°ããçŽãããšããŠããã®çŽãã誰ãããã
> ãã¡ã»ãªãŒããŒãããŒã®ãã°ãå
¥ããªããšããä¿èšŒã¯ãã§ããªãã§ããã
> ãã°ãå
¥ãã人ã®è²¬ä»»ã ãšèšãã®ã¯ç°¡å
責任ã¯æžããã人ã«ãããããã§ã. ããã®ãœãããŠã§ã¢ã¯ã©ã®ãããªèšèšæ
æ³ã«åºã¥ããŠããŠ, ãããã©ã®ããã«å®è£
ãããŠããã®ãããšããã¬ãã¥ãŒãŸ
ã§æ®éãããããªãã§ãã.
ãã¡ããä¿èšŒã¯åºæ¥ãŸããã, strlcpy ã ã£ãŠä¿èšŒã¯åºæ¥ãªãã§ããã?
> > ã§, ãããå
šéš strlcpy ã«ããŠäžã
ãã§ãã¯ãå
¥ããŠãã©ãããã¢ã¯ã·ã§ã³
> > ãèµ·ããã (èµ·ãããããªãã®ã«)ããšèããã®ã¯, 銬鹿ããŠãã§ãã?
>
> ãããã
ç§ã«ã¯ããããã®ã¯ç¡èŠåºæ¥ãªãçšåºŠã«å€§ããªã¹ãã¬ã¹ã«ãªããŸã. äœæ
ã§ãã
ãã. ç§ã ã?
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 ã«ããŠäžã
ãã§ãã¯ãå
¥ããŠãã©ãããã¢ã¯ã·ã§ã³
> > > ãèµ·ããã (èµ·ãããããªãã®ã«)ããšèããã®ã¯, 銬鹿ããŠãã§ãã?
> > ãããã
> ç§ã«ã¯ããããã®ã¯ç¡èŠåºæ¥ãªãçšåºŠã«å€§ããªã¹ãã¬ã¹ã«ãªããŸã. äœæ
ã§ãã
> ãã. ç§ã ã?
人éãããããšã§ã¯ãªããšããããšã«ã¯åæããŸããã³ã³ãã€ã©ãª
ã©èšèªåŠçç³»ã§ããã¹ãä»äºã§ããããã§ãã³ã³ãã€ã©ããããŒã
ãšäººéããããããããŸãããæåã¯ãã€ããããããŸãããã人
ééããããŸããããã«ãå®å
šãªããã°ã©ã ãæžããŠãããšãæ°æ
ããã§ãããæªæãæã£ãŠæ»æãã人ã«åã£ããšããããšã§ãããã
ããããªããšããããããšãã£ãŠãèšã£ãŠã¿ããã»ãªãã§ããã
ãã²ãã£ãšãããšè©±ã«æ°Žãå·®ãããç¥ããŸãããã
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 é¢æ°
ïŒã®äºæåãèªäœããçãã€ãã¡ãããŸããã :-)
--
ããã ããã
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
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 ãšãã
ããããããŸãã
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-ããªã³ã³ãã€ã©ããå§ãã ãšæããŸããã
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 ã䜿ãã£ãŠããæããããã ãã©ãã©ããããã
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 ã®æŽåæ§ãä¿ãŠãªã :-<
--
ããã ããã
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ã®ççŸãã§ãã¯ãšããŸã§ããããããšã
ã§ããŸãããã³ãŒãã£ã³ã°æžåŒã®(èªå奜ã¿ã®)ç°¡çŽ åãšããŸã§ã
æãã ããŸãã
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ã»å質æšé²èª² æç°éè
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() å
¥ããŠããããã©ãå
¥ããªããŠãããã§
ãããã
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 ã¯èµ·ããª
> ãããšããæã蟌ã¿ãè延ããŠããŸãå
ŒããŸããã
èªèŠã§ãããç§ã¯ãèªèŠãšãæ ¹æ§ãšãæ°åããšããããããã®ã§ã¯
ãªããŠãäœãå·¥åŠçã«åçç£å¯èœãªããŠããŠã§å®å
šãªããã°ã©ã ã
æžãããããã§ãã
In article <c2k49p$1974$1...@newsnnrp00.cwidc.net>
Narita Takaoki <tak...@aisoft.co.jp> writes:
> typedef struct { char name[FSTRING_LEN]; } fstring;
> ãšãã«ããã°è¯ãã®ã§ãããïŒ
ãããããã§ãããæ§é äœã§ã©ããããŠã䞊ã³ã³ãã€ã©ã®åãã§ã
ã¯ãåããããã©ãããªããå
é ã«æåæ°ã眮ãããã§ããã©ã
Pascal æåå颚ãnull çµç«¯ãããŠããããã§ãããããã©ã
ããšãããä»ãã®æååã©ã€ãã©ãªãªãããªãã§ãããã
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() å¿ãããšã¡ã¢ãªã»ãªãŒ
ã¯ã«ãªã£ãŠããŸããšããããšã§ããããã
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å¯èœã§ã(çµæ§æ¥œ)ã
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 ã®å®è£
ã«ã¯äœ¿ã
ãªãé¢æ°ã§ãã
--
ããã ããã
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 ã®å
¥ã蟌ã¿åŸãªãèšç®æ©èšèªãªã
ãŠãã£ãã確ãã«çæ³çãªãã§ããããã©ããããå®çŸããã³ã¹ã
ãèãããšäœ¿ãåŽã®ç²ŸåºŠãäžããæ¹ãå®äžããããšã
--
ããã ããã
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))
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() ã«ããã®ãªãããã³ã¹ãã¯ãããªã«ããããªãã§ããã
> ææ³å€ãããšãä»ã®äººãããã°ã©ã ãèªããªããªã£ãŠå°ãããã
> ãªãã§ããã
æããCããªããã»ããµããã¯ãŒããšãããæ¬ãèªãã§ã³ã£ããããããš
ãæãåºããŸããã
#define begin {
#define end }
ãšããã£ãŠãææ³ãå€ããŠãããã§ããã
å·»æ«ã®ãµã³ãã«ããã°ã©ã ã¯ã»ãšãã©Cãšã¯å¥ç©ã§ããã
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 以å€ã§ã¯ä»ã®äºæåã«çœ®æããããŠããŸ
ããŸãããã©ã
--
ããã ããã
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 ããããã倧ããªåé¡ããšã
--
ããã ããã
> æããCããªããã»ããµããã¯ãŒããšãããæ¬ãèªãã§ã³ã£ããããããš
> ãæãåºããŸããã
ãããããããããïœïœïœïœ
ããã£ãŠææŽæ¯å€ããã®ã§ãã
圌ã®ãC èšèªã¹ã¿ã€ã«ããã¯(?)ããšãããã¿ã§æã£ãŠãŸãããã
ã»ããšã«ãã¿ã«ãããªããŸããã
ãããªããã»ããµãã¯ãŒãã¯èªãã ããšãããŸãããã
ãŸããã³ã£ãããããããªå
容ãªãã§ãããã(ããããªæå³ã§)ã
æããã®å Žåãäžç°å
žçã®å
¥éã»å¿çšã»å®è·µäžéšäœãšã¯éã£ãŠã
ããã¿ã©ã¡ããŸãã¡ããæ害å³æžãæå®ã§ã¯ãªããã§ããã©ãã
ç¥ç°æåº <ca...@kgc.co.jp>
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 ããã³ããŒããŠããŠããããã
å¯å€é·ãªãããã€ã³ã¿ãšå€§ããããã£ããã«æž¡ãã®ã¯ãå®å
šãªãã
ã°ã©ã ãæžãæã«ã¯åœç¶ã®è©±ã§ããé¢æ°åŒåºãã§ãæ
åœè
ãéãã
ããããªãããåãæ
åœè
ã§ãäœãµæã眮ããŠããããããããã
ãªãããã§ãããããã¯å€§äžå€«ãªããŠããã¡ãã¡èŠããŠããããŸã
ããããããªããšãèŠããã®ã¯ã³ã¹ããããããŸããããããã¯ã
å¯å€é·ã®å Žåã¯å
šéšå€§ãããåŒãåãããã«ããæ¹ãèŠããã³ã¹ã
ãäžãã£ãŠæ¥œã§ãããšãããã®ã§ãã
> > typedef struct { char name[FSTRING_LEN]; } fstring;
> > ãšãã«ããã°è¯ãã®ã§ãããïŒ
>
> ãããããã§ããã
æ£çŽ, ãã®ã³ã¡ã³ãã«ã¯ãäœãä»æŽâŠããšæããããŸãã. ç§ã® strcpy ãæ°
çŸåºãŠãããã®ã§ã䜿ãããŠãã ([] å
ã¯å³å€ã§é·ããå¿
èŠãªå Žå *_LEN ã¯
䜿ããèŠçŽ æ°ããåŸãããã«ããŠãŸããã©).
ãšããã£ãŠã人éã®æã§ãµã€ãºãæå®ãããçºã§ã¯ãªããŠ, ããŒã¿å®çŸ©ãã¡ã€
ã«ããã¹ã¯ãªããã§ãããããã¡ã³ããšãã union ãæ§æãããŠ, äžæé å
(strcpy ã®ã¹ãã¢å
ãšã. äžæãšã¯ãã確ä¿ãã£ã±ãªãã ãã©) ã¯ãã®ãµã€ãº
ã§ç¢ºä¿ãããããããã§ã. ãã§ãã¯ã«ãŒãã³ãåæ§.
# ã¡ãªã¿ã«ãã®ä»çµã¿ããã€ãã¹ããŠããŒã¿ãå®çŸ©ãããš, è«žã
ã®é¢é£ã«ãŒã
# ã³ (ã³ã³ã¹ãã©ã¯ã¿ã¿ãããªã®ãšã) ãçæãããªãã®ã§ç°¡åã«ã¯ãªã³ã¯åº
# æ¥ãªããªããŸã. 楜ããããšããçµæãããªã£ãã ãã§ãã.
ãªããè²ã 話ãé²ãã§ããããã§ãã.
In article <YAS.04Ma...@kirk.is.tsukuba.ac.jp>
y...@is.tsukuba.ac.jp (Yasushi Shinjo) writes:
> > > ïŒïŒ¡ïŒã»ãã¥ãªãã£äžã®åŒ±ç¹ã«ç¹ããééã
> > > ïŒïŒ¢ïŒã»ãã¥ãªãã£äžã®åŒ±ç¹ã«ã¯ç¹ãããªãééã
> > ãããããã°ã©ããåºå¥ããªããšãããªãã®ããªã (åºå¥ãããšãããã©ãè
> > ãããïŒæãããããã®ã ãã), ãšããã®ãããæ°å¹Žç§ãèããŠããããŒã
> > ã ã£ãã.
>
> ç§ã¯ïŒïŒ¡ïŒïŒïŒ¢ïŒãåºå¥ããå¿
èŠããããšæããŸããäž¡æ¹ç¡ããªã
> ã°ããã«è¶ããããšã¯ãªãããã©ã朰ããªããŸãåªå
çã«ïŒïŒ¡ïŒã
> ã朰ããšããæå³ã§ãã
ããããèšèšæé (ããã°ã©ãã«åå¥ã«è² æ
ããã) ã§ããã°, C èšèªãéžã
ã æç¹ã§ééã£ãŠãããšæããŸã. C ã䜿ãã®ã§ããã°, å¥ã®èšèšæéãæ¡æ
ãã¹ãã ãšæãã.
> > ãstrcpy ã§åºãŠãããããªã»ãã¥ãªãã£äžã®åé¡ãã¯åºãŠããªã. ããã,
> > åå¥ã«äžã
ããã°ã©ãã«æ
ãããŠããã®ã§ã¯é§ç®ãªããããªãã§ãã?
>
> ããããããŒã¿ã«ã§èããã°ããã°å
¥ãããã°ã©ã ãããã°ãèŠã€
> ãããããæåãããã°ããªãããã°ã©ã ãæžãæ¹ã楜ïŒåŸïŒã§ãã
ããããæ¹éã§äœããããã°ã©ã ã£ãŠãšãŠããšãŠãå°ããªãã®ã«éããã¡ãã
ãšæããŸã. èŠéããæªããªãã.
> > 責任ã¯æžããã人ã«ãããããã§ã. ããã®ãœãããŠã§ã¢ã¯ã©ã®ãããªèšèšæ
> > æ³ã«åºã¥ããŠããŠ, ãããã©ã®ããã«å®è£
ãããŠããã®ãããšããã¬ãã¥ãŒãŸ
> > ã§æ®éãããããªãã§ãã.
>
> ãæ®éããšããã®ã¯ãã©ãããç¶æ³ã§ãããããããå°ã詳ããæ
> ããŠãã ããã倧åŠã ãšäœãæ®éãªã®ããå®ã¯ããåãããªããšã
> ã話ããããŸãã
æãå
¥ãããœãããŠã§ã¢ã«äžã®ããã®ãããªææžããªãå Žå, ãããäœæãã
ãšããããå§ãŸããŸã. ã§, ãã®èšèšæ¹éããã¡ãã£ãšãªãããšãããã®ã§ãã£
ãå Žåã¯, ãœãããŠã§ã¢å
šäœãäœãçŽãããšãããããã§ã.
次ã«å®éã®ãœãããŠã§ã¢ãšã€ãåãããªãã, æãå
¥ããããšã«ãã£ãŠåã¶åœ±
é¿ã®ç¯å²ãšãã¹ãã®æ¡ä»¶ãªã©ãæŽãåºããŠãããŸã (ã§, èŠç©ããåºããã).
âŠãªããŠããšãäŒç€Ÿã§ã¯ããããã§ãã, ææžã«èµ·ãããã©ããã¯å¥ãšããŠæ®
éå人ã§ãœãããŠã§ã¢ãæ¹å€ããå Žåã§ããã£ãŠããããšã ãšæããŸã (ç§ã¯
åŠçæ代ããããããŠãããã©ãªã). 以åäœåŠãã§ã³ãŒãã£ã³ã°ã¹ã¿ã€ã«ã®
話ãåºãæã«ãåºæ¬çã«å
ã®ã¹ã¿ã€ã«ã«åãããããšãã話ã«ãªã£ãŠãããšæ
ããŸãã, ããã®ããã¡ãã£ãšäžã®ã¬ã€ã€ã§ããããã, ãšããæã.
> ããããªããšããããããšãã£ãŠãèšã£ãŠã¿ããã»ãªãã§ããã
strlcpy ãåããæç¹ã§èšããå°è©ã§ã¯ãããŸãããã. ããã¯æ£ãããªããœ
ãããŠã§ã¢ã, æ£ãããªãåäœãããæãªã®ã§ããã.
â
ãæ£ãããããã»ãã¥ãªãã£ã«éç¹ã眮ãããšããæéããã¯ãäœãããªãã
ãã°ã©ã ããå°ããã¡ãã, ãšãã話ã«ã€ããŠã¯ã©ããèãã§ãã?
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.")
ããã§ãæ¯åãã§ãã¯ããã®ãããã«ãªã£ãããèšèªããããŠ
ïœïœïœã«ç§»ãããã§ãã
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 掟ã®äººã®æèŠã®éãã,
ãšã³ãžãã¢ã®æèŠãšãµã€ãšã³ãã£ã¹ãã®æèŠã®éãã§ãªããã°è¯ãã®ã§ãã...
ãšããã§, ç§ããœãããŠã§ã¢ãäœããŸãã, ãã®äžè¯çã¯èšç®ããŠããŸãã.
ãããããã§ãã¿ãŸãã.
ããã³
ãããšã¹ãã¬ãªãã£ãã«ã«ã«æžããŸãã.
å®éã¯ãµã€ãšã³ã¹ãããšã³ãžãã¢ãªã³ã°ãŸã§ã¯é£ç¶ããŠããŠ,
ãã®äžéã®æ§ã
ãªç«å ŽããããŸãã, 誰ãã, ç¶æ³ã«å¿ããŠ
ç«å Žãé©åã«åãæããŠããããšãå€ããšæããŸã.
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 ã«ã§ãããªãã
ã«ãã¢ããªã±ãŒã·ã§ã³ã«ãã§ããŠããããããªæ°ãããããã©ãã
ããã§ããªãã®ã¯ã©ãããäºãªãã§ããããã
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