2012-04-25 18 views
2

私のコードには警告があり、避ける方法はわかりません。ここでは、コードスニペットが署名済み:gccの最適化 "バグ"

#include <arpa/inet.h> 
int main(void) { 
     uint16_t portnbr=0; 
     uint16_t n_portnbr = htons(portnbr); 
     return n_portnbr; 
} 

あるコンパイラ:

/usr/bin/g++ -Wconversion -Wall -O2 a.cpp 

出力:

a.cpp:4: warning: conversion to 'short unsigned int' from 'int' may alter its value 

警告を回避することが可能ですか? CFLAGSを変更するオプションがありません

私のコンパイラはgccのバージョン4.3.4 [GCC-4_3-分岐リビジョン152973](SUSE Linux)の

+3

gcc 4.1.2または4.7では警告が表示されません。少なくとも、行4( 'n_portnbr'の宣言)では使用しないでください。 'htons()'は 'short unsigned int'と思われる' uint16_t'を返し、その結果を 'uint16_t'オブジェクトに代入しています。 '#include 'はあなたに 'htons()'の適切な宣言を与えるべきです。 'return'ステートメント*は問題になる可能性がありますが、私はそのことについて警告を出すことはありません - 明らかにどちらもあなたには当てはまりません。 * exact *コードをコピー&ペーストしましたか? –

+1

あなたのシステムで 'htons()'はどのように宣言されていますか? –

+0

extern uint16_t htons(uint16_t __hostshort) – cateof

答えて

4

これはglibcのバグです。このbug reportを参照してください。

+2

良い発見、それ。 –

1

では、単にそれが警告のように聞こえるものだ、不足しているプロトタイプである可能性があります。

htons()関数を手動で宣言し、それが役立つかどうかを確認してください。その場合は、ヘッダーを調査する必要があります。

The Linux manual pagehtons()の請求:

POSIX.1-2001。

システムによっては、< arpa/inet.h>の代わりに< netinet/in.h>を含める必要があります。

UPDATE:コメントで指摘したように、それは機能の暗黙の宣言から「苦しむ」べきではありませんので、これはC++です。奇妙な。私はおそらくhtons()が何らかの理由で不思議な振る舞いをしているマクロである、あらかじめ処理されたコードを読むことをお勧めします。

+1

これは私の即時の反応でもありましたが、少なくとも見た目には、彼はC++としてコンパイルしています。 –

2

効率のために、htonsとその親類は、しばしばマクロによってオーバーロードされます。

uint16_t n_portnbr = (htons)(portnbr); 

この問題が解決するかどうかを確認するには、マクロではなく関数をトリガーするようにしてください。

ここに該当する場合、実際には間違っているのは残念です。その後、そのバージョンのマクロだけをオフにしてください。

+0

これは働いた。私の警告は削除されましたが、実行時にも確認する必要があります。 – cateof

+1

@cateof、実行時に何を確認する必要がありますか? –

関連する問題