0

私は奇妙な問題に悩まされています。gyp プロジェクトを使用して作成された exe があり、common.gypi は 32 ビットと 64 ビットの両方の Linux 用の exe をビルドするためにサポートされています。ただし、64 ビット Linux 用にビルドし、コード内のある時点で memcpy を呼び出すと、コンテンツがゼロになります。-m32 フラグを使用して 32 ビット プラットフォーム用にビルドしても、この問題は発生しません。プロジェクトのヘッダー ファイルは 32 ビットと 64 ビットの両方のプラットフォームで共通であるため、ヘッダーに問題があるとは思えません。誰かがこの問題に取り組む方法をいくつか教えてもらえますか? バイナリは動的にリンクされ、GLIBC lgcc、lc、および lm を使用します。この分野のポインタは大歓迎です。必要な追加情報がありましたら、喜んで提供させていただきます。ありがとう。

更新: コード スニペットのビット: これは、コードの基本的なスニペットです。

dst->flags           = src->flags;
src->b = dst->b;
and few more assignments
memcpy(dst, src, size here is 152);
size of dst is 224 and size of src is 496. 

問題は、最初に dst にコピーされたフラグの値が、memcpy が呼び出された後にゼロになることです。32ビット用に構築された場合、同じロジックがうまく機能します。

4

1 に答える 1

2

memcpy(3)のドキュメントを注意深く読んでください。送信元と送信先の領域を重ねることはできません (そうしないと、未定義の動作になります)。コンパイル中にすべての警告とデバッグ情報を有効にすることを忘れないでください ( gcc -Wall -Wextra -g)

代わりにmemmove(3)を使用することをお勧めします。

このような問題をデバッグするには、デバッガーのwatchコマンドでウォッチポイントを設定しgdb、最近のGCC-fsanitize=addressではコンパイル フラグとして使用できます。またはvalgrindなど...

于 2014-10-29T09:40:00.770 に答える