私は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 に初期化すると、このエラーは発生しません。その後、サイズの無効な書き込みのみが発生します。
サイズの無効な書き込みの投稿を見ました。それらの中で、ポインタが範囲外にアクセスされるとセグフォルトが発生します。しかし、ここでどこが範囲外になるのかわかりません。
役立つ情報はありますか?文字列入力を受信してクライアントから保存すると、プログラムがクラッシュするようです。