仮想マシンでプログラムを実行しています。ある時点で strcat を呼び出すループを実行しています。いくつかのループ (この数は異なる実行間で変化します) の後、セグメンテーション違反を受け取ります。
私はそれをデバッグしようとしました:
(gdb) backtrace
0 0x001a3d5d in strcat () from /lib/tls/i686/cmov/libc.so.6
1 0x080493f4 in ChangetoDnsNameFormat (dns=0xbffef313 "",
host=0xbffff3b8 "a.com", '.' <repeats 195 times>...) at my_dns.c:378
2 0x08048c96 in nreplacehost (
host=0xbffff3b8 "a.com", '.' <repeats 195 times>..., query_type=1,
ip=0xbffff354 "3.3.3.3") at my_dns.c:179
3 0x080489a1 in main (argc=774778414, argv=0xbffff4d4) at my_dns.c:106
(gdb) frame 1
1 0x080493f4 in ChangetoDnsNameFormat (dns=0xbffef313 "",
host=0xbffff3b8 "a.com", '.' <repeats 195 times>...) at my_dns.c:378
378 strcat((char*)host,".");
(gdb) print host
6 = (unsigned char *) 0xbffff3b8 "a.com", '.' <repeats 195 times>...
任意のヒント?
これは私が strcat を呼び出す関数です
void ChangetoDnsNameFormat(unsigned char* dns,unsigned char* host)
{
int lock = 0 , i;
strcat((char*)host,".");
for(i = 0 ; i < strlen((char*)host) ; i++)
{
if(host[i]=='.')
{
*dns++ = i-lock;
for(;lock<i;lock++)
{
*dns++=host[lock];
}
lock++; //or lock=i+1;
}
}
*dns++='\0';
}
この関数は 1000 回以上正常に呼び出されています。