0

私はC++の初心者です。以前にインタープリター言語でコードを書いたことがあります。

ソケット プログラミングを使用してファイル操作を実行する C++ でクライアント サーバー コードを作成しています。クライアントはファイル名をサーバーに送信し、サーバーはそのファイルを開いて操作を実行します。

次のスニペットは、クライアントからファイル名を受け入れる手順を示しています。

char buf[512];
char *name;
connectionID = accept(socketID, (sockaddr *) NULL, NULL);
cout << "Connection created" << endl;
int bytes = recv(connectionID, buf, sizeof(buf), 0);
buf[bytes] = '\0';
strcpy(name, buf);
cout << name << endl;

このコードはランダムに動作します。別のファイルに移植したところ、突然動作しなくなりました。セグメンテーション違反が発生した場所を確認するために GDB を使用しようとすると、GDB は空の行またはコード内の任意の行を表示しますが、関係がないようです。

>(gdb) where
>#0  0xb74a8979 in ?? ()
>#1  0x00000000 in ?? ()
>(gdb) up
>#1  0x00000000 in ?? ()
>(gdb) down
>#0  0xb74a8979 in ?? ()
>(gdb) down
>Bottom (innermost) frame selected; you cannot go down.

ただし、valgrind の出力にはいくつかの情報が表示されますが、ここで何が問題なのかまだわかりません。

>==11855== Invalid write of size 1
>==11855==    at 0x402C6C3: strcpy (in /usr/lib/valgrind/vgpreload_memcheck-x86-    linux.so)
>==11855==    by 0x804D38A: main (server.cpp:100)
>==11855==  Address 0x0 is not stack'd, malloc'd or (recently) free'd
>==11855== 
>==11855== 
>==11855== Process terminating with default action of signal 11 (SIGSEGV)
>==11855==  Access not within mapped region at address 0x0
>==11855==    at 0x402C6C3: strcpy (in /usr/lib/valgrind/vgpreload_memcheck-x86-l

Valgrindも示した

>==11871== Use of uninitialised value of size 4
>==11871==    at 0x402C6C3: strcpy (in /usr/lib/valgrind/vgpreload_memcheck-x86-    linux.so)
>==11871==    by 0x8048DF8: main (in /media/sf_programs/project/a.out)

ただし、名前ポインタを NULL に初期化すると、このエラーは発生しません。その後、サイズの無効な書き込みのみが発生します。

サイズの無効な書き込みの投稿を見ました。それらの中で、ポインタが範囲外にアクセスされるとセグフォルトが発生します。しかし、ここでどこが範囲外になるのかわかりません。

役立つ情報はありますか?文字列入力を受信して​​クライアントから保存すると、プログラムがクラッシュするようです。

4

1 に答える 1