を有効:このコードは、排他的または2のを実行することになっている奇妙な行動は、私はこのコードの小さなスニペット(これは私が持っている問題の最小限の実施例である)を持つ
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void xorBuffer(unsigned char* dst, unsigned char* src, int len)
{
while (len != 0)
{
*dst ^= *src;
dst++;
src++;
len--;
}
}
int main()
{
unsigned char* a = malloc(32);
unsigned char* b = malloc(32);
int t;
memset(a, 0xAA, 32);
memset(b, 0xBB, 32);
xorBuffer(a, b, 32);
printf("result = ");
for (t = 0; t < 32; t++) printf("%.2x", a[t]);
printf("\n");
return 0;
}
を32 (概念的には、a = a^b
を実行する必要があります)。 0xAA^0xBB = 0x11以降、 "11"は32回印刷されるはずです。
私はこの問題をMinGW-GCC(Windows)でコンパイルすると完全にデバッグモード(最適化なし)で動作しますが、-O3から始まる最適化が有効になっているときにxorBufferループの途中でSIGILLでクラッシュします。また、私が問題のループにprintfを置くと、それは再び完全に動作します。私はスタックの破損を疑うが、私はここで間違っているのか分からない。
最適化を有効にしてGDBを使ってデバッグしようとすると、すべての変数に対して「GDBが最適化されている」と表示されるため、失われてしまいます(もちろん、変数を出力しようとすると突然動作します)。
ここで何が起こっているのか誰かが知っていますか?私はこの問題に関してあまりにも長い住居を過ごしてきました。私の推測では、基本的なCポインタの知識が欠落していますが、私にとってはコードが正しいように見えます。それはバッファのインクリメントから来るかもしれませんが、私が知る限り、sizeof(unsigned char) == 1
なので、バイトごとに1つずつ進むべきです。
コードは私のLinuxマシン上のGCCでの最適化を行っても機能します。
ここには何がありますか?ありがとう! -O2で
:プログラム全体の要求、アセンブリ出力として
-03付:clicky
私は(と実行しているGCC 4.6.2でこの動作を確認MinGWの)私のコメントから
「O2」の使用はどうですか? 'O3'はかなり危険です。 SIGILLは不正な命令によって発生したシグナルを意味します。コンパイラのバグのように見えます。または私は何かが欠けている。 –
これはgcc 4.4.3で完璧に動作します。もし誰も気づかなければ、gccによって生成されたアセンブリコードを 'O3'と' O2'(どちらも正常に動作すればそうでなければ、最適化の低レベル)で表示しようとするかもしれません。 –
@KirilKirovこのバグもともと高性能ライブラリで発見されたので、O2に行くのは本当に最適な解決策ではありません。もちろん、コンパイラのバグであれば修正が出るまでO2に落とします。最適化を行わず-O3で生成したアセンブリを投稿します。 – Thomas