> なぜならレベル4の警告でときどき助けられるんですよ。
そこんところは御意。俺もときどき -W4 レベルでコンパイルしてみたりするよ。
でもねー、ウチで試験的にこの手のツールを導入してみたところ
「警告を消すだけ」に終始してしまう人も出た
(=本質的にバグっているという警告を無理やりキャスト類で消してしまう)
ため、使いどころが難しいと判断し、今の製品に対しては使っていないのでした
これを本末転倒という。
うまく使えばかなり強力な味方になるよね。
「使われてしまう」のではなく「使いこなす」といいね。
よだんのよだん
今月のバグ http://www.gimpel.com/html/bugs.htm は
「ウチの製品を使うとこういうバグが自動検出できるよ」という CM なのだが、
かなり勉強になるので答えを見ずに考えてみるとおもしろいよん
>はい。おっしゃるとおりです。
文章全然読み取れて無いよ!
汎整数昇格というのがあるのでコンパイラのバグかどうかはわかりませんが
たしかにちょっと気持ち悪いですね。
ちなみにVS2005で以下のC#コンソールアプリを書いたら+=のみ通りました。
byte a = 0x1;
byte b = 0x2;
a += b; //OK
b = a + b; //エラー(型'int'を'byte'に暗黙的に変換できません)
>重要な警告を見やすくするためにもキャストして消せる警告は
>消したい派なのです。
C++キャストにした方がキャストの意図がわかりやすくなりますよ(^^
> 結局はVC2003、VC2005では警告が出てVC2008では出ないのは
> ようするにバグと考えてよろしいんですよね。
バグとは限らないと思う。
何を警告とすべきかの意見が変わったのかも。
バージョンが上がるにつれて、警告が増えるのが流れだけど、
減ることもあるんじゃないかな。
マイクロソフトには是非大人になって、C4996を何とかしてほしいもんだ。
> 重要な警告を見やすくするためにもキャストして消せる警告は
> 消したい派なのです。
「キャストして消しても問題ない警告は」とすべきですね。
キャストして消してはいけない「重要な警告」もあります。
皆様。またの書き込みありがとうございます。
>(=本質的にバグっているという警告を無理やりキャスト類で消してしまう)
こうならないために最初書くソースはまったくキャストを付けずに書きます。
そして警告を出させて順番にキャストの意味を考えながらキャストして警告を
消すようにしているよ。無理やりキャストして消すようなことはしてないので
大丈夫だよ。安心してくれ。
>「使われてしまう」のではなく「使いこなす」といいね。
僕ちゃん的にはうまく使っていると思う。
あーさん。
> 文章全然読み取れて無いよ!
これどうゆう意味。
キャストは奥が深いということかい。
> C++キャストにした方がキャストの意図がわかりやすくなりますよ(^^
C++でもキャスト使いますがちょっと1行が長くなっちゃいますね。
キャストの意味を分かりやすくするために使うべきなんでしょうが…。
C言語のキャストが短いのでC++でも1行が長くなる場合は使ってたりする。
ちょっと統一性がないけど。混ぜてる。
> バグとは限らないと思う。
> 何を警告とすべきかの意見が変わったのかも。
なるほどね。
>「キャストして消しても問題ない警告は」とすべきですね。
> キャストして消してはいけない「重要な警告」もあります。
十分注意しているよ。
去年の12月30日なんかは多倍長実数演算を作っていたんだけど
警告レベルが3のままで(4に設定し忘れてて)減算、除算の動作が
おかしかったの。テストとして最初、円周率を1万桁まで計算。
そしてら9桁以降がずれてて。調べたら減算、除算で正しいキャストを
していなかったことが判明。
レベル4に設定し忘れていたのでロジックが間違っているのかと考え
いろいろとアルゴリズムの方を調べていた。結局のところ原因はキャスト
のし忘れでunsigned longの変数を配列にセットする際にunsigned shortに
キャストしていなかったようだ。
う~ん。
数時間もかかって悔しかった。
キャストのし忘れか~。
むやみにキャストして警告を消すのは良くないと注意していたけど
正しくキャストしないと動作に影響が出ることを去年久々に思い知ったよ。
みんなもレベル4にして警告メッセージに注意してね。
とりあえずVC2008をインストールするまでは我慢しようと思います。
他のコンパイラは使ったことがないので知らないが
きっと処理系(バージョン)の問題なのでしょうね。
お早うございま~す。
ちょっとMSDNでC4244を調べてみた。
http://msdn.microsoft.com/ja-jp/library/th7a07tz(VS.80).aspx
このページを見ると下から2つ目が今回の質問に該当しそうです。
// C4244_level4.cpp
// compile with: /W4
int aa;
unsigned short bb;
int main(){
int b = 0, c = 0;
short a = b + c; // C4244
bb += c; // C4244
bb = bb + c; // C4244
bb += (unsigned short)aa; // C4244
bb = bb + (unsigned short)aa; // OK
}
質問の結論としてはバグじゃないのね。
どうやらVCの仕様ですな。
とりあえずこれで納得です。