2012-05-10 5 views
1
int test_malloc(void **ptr, size_t size) 
{ 
    (*ptr) = malloc(size); 
    return 0; 
} 

int test_app() 
{ 
    char *data = NULL; 
    int ret = 0; 
    ret = test_malloc((void **)&data, 100); 
} 

コンパイラ:他の人の中のgcc 4.1.2以下のコードでは、逆参照型のペーンドポインタが厳密なエイリアシングルールを破ることがあります&どのように修正するのですか?

、私はこれをチェックするいくつかのオプションをオンにしていると思うしている-O2 -Wall &を使用しています。私はこの1つのようにしてみてください

+0

重複している可能性があります[間接参照型パントされたポインタは厳密なエイリアシング規則を破ります](http://stackoverflow.com/questions/3246228/dereferencing-type-punned-pointer-will-break-strict-aliasing-rules) –

+0

また、 'test_app'のようなインタフェースも記述しないでください。 'int'を返すことになっています。あなたはそれを返さず、何も受け取っていない不特定多数の引数を受け取ることになります。 gccは戻り値についてあなたに言ったはずです。 –

答えて

3

正常に動作します。

あなたはこのようにそれを解決することができます:

int test_app() 
{ 
    char *data = NULL; 
    void *void_data = NULL; 
    int ret = 0; 
    ret = test_malloc(&void_data, 100); 
    data = (char*)void_data; 
} 

しかし、さらに良いが、このような問題を回避するためにtest_mallocリターンvoid*を作ることです。

+0

+1これのような醜いAPIであなたのコードがいかに醜いものでなければならないかを示すためです。 –

1

はあなたがタイプchar*の変数を持っている、とtest_mallocにあなたは厳格なエイリアシング規則を破るタイプvoid *の左辺値を介して、それを変更している

void * test_malloc(int size) 
{ 
    void *mem = malloc(size); 
    if (mem == NULL) 
    { 
     printf("ERROR: test_malloc %d\n", size); 
    } 
    return mem; 
} 

int test_app() 
{ 
    char *data; 
    int ret = 0; 
    data = test_malloc(100); 

    if(data != NULL) 
     free(data); 
} 
2

Cで実行しようとしていることはできません。無効なコードです。 void *を汎用ポインタを返すには、唯一の方法は戻り値です。これは、void *が任意のポインタ型に変換され、任意のポインタ型がvoid *に変換されますが、void **以外のポインタ型へのポインタに変換されず、void **に変換されません。

+0

そして、私は忘れます:標準では、 'char *'と 'void *'は同じオブジェクト表現を保障していますか?表現が異なると仮定すると、変換が許可され、厳密なエイリアシング違反のためにオプティマイザによってゴミ箱に入れられなくても、 'test_malloc'で書かれた' void * 'を再解析してから'char *'は間違ったアドレスを与えます。 –

+0

実際には、 'void *'は本質的に余分な自動変換を持つが、逆参照や算術を伴わない 'char * 'のコピーとして指定されているので、同じ表現をする必要があると私は信じています。確かに確かめるためにチェックしたいかもしれません。私はそれにもアクセスするにはまだエイリアス違反だと思う。 –

+0

はい、私はエイリアシング違反がすでにショーストッパーであることに同意します。私はその動機を積み重ねようとしていました。 GCCは実際にはAFAIKのいろいろなオブジェクトポインタ型に対して異なる表現を実際に使っているわけではありませんが、標準では独自のアーキテクチャが可能です。 'char *'ではなく 'int *'ならば、歴史的な例があるかもしれません。 –

関連する問題