6

私はgccで以下をコンパイルしようとしています-pedantic-errors -pedantic -Wall -O2

#include <iostream>

void reset_uint32(uint32_t* pi)
{
    char* c = (char*)(pi);
    uint16_t* j = (uint16_t*)(c); // warning?
    j[0] = 0;
    j[1] = 0;
}

void foo()
{
    uint32_t i = 1234;
    reset_uint32(&i);
}

int main() {
   foo();
}

しかし、厳密なエイリアシングの警告は表示されません。私も有効にしようとしました

-fstrict-aliasing
-Wstrict-aliasing

しかし、まだ警告はありません。これはバグですか?

4

1 に答える 1

1

あなたの例を書き直して、厳密なエイリアス規則に違反することについての警告を生成しました。

void foo(int* pi) {
    short* j = (short*)pi;
    j[0] = j[1] = 0;
}

int main() {
    int i = 1234;

    foo(&i);

    short* j = (short*)&i;
    j[0] = j[1] = 0;
}

ただし、g++ 4.6 では、コードをコンパイルした場合にのみ警告が表示され-Wstrict-aliasing=2ます-Wstrict-aliasingmain()また、 ではなくでのキャストの警告のみを表示 しfoo()ます。しかし、コンパイラがこれらの2つのキャストをどのように/なぜ違うように見るのかわかりません。

于 2011-12-18T18:06:08.897 に答える