2010-11-24 6 views
1

ローカル変数のアドレスを返すことによってgccが発行する特定の警告を抑制したいと思います。gccを抑制する4.2.1プラグマによる警告

#include <stdio.h> 
#pragma GCC diagnostic ignored "-Waddress" 
void *get_stack() { 
    unsigned long v; 
    return &v; 
} 

int main() 
{ 
    void *p = get_stack(); 
    printf("stack is %p\n",p); 
    return 0; 
} 

>gcc -fdiagnostics-show-option p.c 
p.c: In function ‘get_stack’: 
p.c:5: warning: function returns address of local variable 

プラットフォーム:この問題は、私はまだLinux上で試していないのMacOSX 10.5 Snow Leopardは、 に少なくとも存在します。

私は実際に問題を見ることができ、それらを修正するために強制的に行うことができるように、警告をエラー に変えて実行したいと思います。

この特定のコードはバグではなく、 (MSVCでも動作します)のスタックポインタを見つけるための "ポータブルな"手法です。スタックポインタは ルーチンガベージコレクションで使用するために必要とされる

【実際には、2つのスタックポインタを有する Itaniumでは動作しません(中断されたスレッドのスタック上のポインタを検索します)。

答えて

2

これは警告が私のために離れて行くように見える:

void *get_stack(void) { 
    void *v = &v; 
    return v; 
} 
+0

私はあまりにも:私はなぜだろうか?どうもありがとう! – Yttrill

+0

なぜなら、1を返すとき、コンパイラはスタック変数であることを知る方法を持っています。この場合、void * vはメモリ内の任意の場所を指すことができ、コンパイラはそれをチェックしません。 – shreyasva

0

docs注:-fdiagnostics-show-optionに表示されるオプションのみを制御できます。それは私のために表示されません。私は4.4.1を実行していますが、4.2.1でもそうは思いません。

file a bugを診断システムに組み込むことができます。

関連する問題