アカウント名:
パスワード:
よく日付が埋め込まれているDNSゾーンファイルのSerial値は、同じ32ビットですが符号なしなので倍いけるようです。2147483647案件を見るたびに、なんで符号入れておくんだろう?と思うんです。
そして大小比較に減算を使ってバグるまでがセット。
データ有効範囲を考えれば符号いらない!と思っても途中演算やらの都合でunsignedがバグにつながる事ってけっこうありますよね※もちろんバグらない方法もあるけど安易にコードを書くと(ry while (cnt-- >= 0) { // 処理 }
そのパターンだとそもそも無限ループになるか一回も実行されないかのどっちかでは。
C/C++の場合、もしループの中で副作用(volatile変数へのアクセスとか)がなかったら未定義動作になる。コンパイラーは、プログラムの実行はいつか終了するものと決めつけてコード生成していい。まあそうでなくては停止問題を解く羽目になりかねないから選択の余地はない
> 副作用(volatile変数へのアクセスとか)
「副作用」じゃなくて「観察可能な振る舞い」だった(どちらも規格用語で意味が違う)
未定義なのはC++だけ。Cでは無限ループ書くのも、一定条件下でコンパイラが無限ループを消し飛ばすのも合法。
あ、Cだと制御式が定数式の無限ループは合法なのね。
> 一定条件下でコンパイラが無限ループを消し飛ばすのも合法。
これは
> may be assumed by the implementation to terminate.
のこと? 規格で"may be assumed"と書かれていたら、それは「仮定が満たされなかった場合動作は未定義である」という意味だよ。未定義なんだから無限ループを消し飛ばすのも合法ではあるが。
そこらへんの文言を入れた理由も書いてあるから、N1528を読め。それでもなおmay be assumed が書いてあるから未定義だと思うのなら、そう思った根拠付きでcommiteeに言ってやれ。
ポインタの大小比較でundefined behaviorを踏むのでその形のループは書くなとあれほど
if(error) return -1;
単純にたいていのげんごは『int version』とか『long version』とやると符号がつく。深く考えてないとやらかす。そんだけのはなし。大体マイナスにならない項目に符号なし整数を使えと言うのは正しいがたいていの場合あんま考えてない人は異常値をマイナスにしたがるので対策としては微妙。ちゃんといつまでつかえるコードか考えましょう。期限が切れる前に何とかしましょう。これが常に完璧にできれば問題ない。常にとか完璧とかは不可能なので考えない。
COBOL「やれやれ、これだから数値型が科学技術計算偏重の言語どもと来たら」
x86-64「BCD命令はもうサポートしてませんぜ。DAAもDASも廃止したからめちゃ遅ですぜ。」Power「まだまだいけまっせ!」
unsignedない言語もあるので…
マルウェアスキャンエンジンが使用するファイル名だからいいけど、誕生日が1999年以前の人の誕生日とかで普通にバグりそう
UNIXタイム使ってるシステムだと登録に年齢制限がついたりしますね。
Serialについて分かってないやつ多すぎ。ちゃんと、ラップすると書いてある。32bitのままで、未来永劫、十分。
SERIAL The unsigned 32 bit version number of the original copy of the zone. Zone transfers preserve this value. This value wraps and should be compared using sequence space
それは規格の話で実装の話じゃないよね。○○は××にしなければならないという規格に対し○○は××にならないが△△になるみたいな実装になってるソフトはいっぱいある。
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
私は悩みをリストアップし始めたが、そのあまりの長さにいやけがさし、何も考えないことにした。-- Robert C. Pike
符号、要ります? (スコア:0)
よく日付が埋め込まれているDNSゾーンファイルのSerial値は、同じ32ビットですが符号なしなので倍いけるようです。2147483647案件を見るたびに、なんで符号入れておくんだろう?と思うんです。
Re: (スコア:0)
そして大小比較に減算を使ってバグるまでがセット。
Re: (スコア:0)
データ有効範囲を考えれば符号いらない!と思っても途中演算やらの都合でunsignedがバグにつながる事ってけっこうありますよね
※もちろんバグらない方法もあるけど安易にコードを書くと(ry
while (cnt-- >= 0) {
// 処理
}
Re: (スコア:0)
そのパターンだとそもそも無限ループになるか一回も実行されないかのどっちかでは。
Re: (スコア:0)
C/C++の場合、もしループの中で副作用(volatile変数へのアクセスとか)がなかったら未定義動作になる。コンパイラーは、プログラムの実行はいつか終了するものと決めつけてコード生成していい。まあそうでなくては停止問題を解く羽目になりかねないから選択の余地はない
Re: (スコア:0)
> 副作用(volatile変数へのアクセスとか)
「副作用」じゃなくて「観察可能な振る舞い」だった(どちらも規格用語で意味が違う)
Re: (スコア:0)
未定義なのはC++だけ。
Cでは無限ループ書くのも、一定条件下でコンパイラが無限ループを消し飛ばすのも合法。
Re: (スコア:0)
あ、Cだと制御式が定数式の無限ループは合法なのね。
> 一定条件下でコンパイラが無限ループを消し飛ばすのも合法。
これは
> may be assumed by the implementation to terminate.
のこと? 規格で"may be assumed"と書かれていたら、それは「仮定が満たされなかった場合動作は未定義である」という意味だよ。未定義なんだから無限ループを消し飛ばすのも合法ではあるが。
Re:符号、要ります? (スコア:1)
そこらへんの文言を入れた理由も書いてあるから、N1528を読め。
それでもなおmay be assumed が書いてあるから未定義だと思うのなら、そう思った根拠付きでcommiteeに言ってやれ。
Re: (スコア:0)
ポインタの大小比較でundefined behaviorを踏むのでその形のループは書くなとあれほど
Re: (スコア:0)
if(error)
return -1;
入れてない。何も考えずにやると勝手に入るだけ。 (スコア:0)
単純にたいていのげんごは『int version』とか『long version』とやると符号がつく。深く考えてないとやらかす。そんだけのはなし。
大体マイナスにならない項目に符号なし整数を使えと言うのは正しいがたいていの場合あんま考えてない人は異常値をマイナスにしたがるので対策としては微妙。
ちゃんといつまでつかえるコードか考えましょう。期限が切れる前に何とかしましょう。これが常に完璧にできれば問題ない。常にとか完璧とかは不可能なので考えない。
Re: (スコア:0)
COBOL「やれやれ、これだから数値型が科学技術計算偏重の言語どもと来たら」
Re: (スコア:0)
x86-64「BCD命令はもうサポートしてませんぜ。DAAもDASも廃止したからめちゃ遅ですぜ。」
Power「まだまだいけまっせ!」
Re: (スコア:0)
unsignedない言語もあるので…
Re: (スコア:0)
マルウェアスキャンエンジンが使用するファイル名だからいいけど、誕生日が1999年以前の人の誕生日とかで普通にバグりそう
Re: (スコア:0)
UNIXタイム使ってるシステムだと登録に年齢制限がついたりしますね。
Re: (スコア:0)
Serialについて分かってないやつ多すぎ。
ちゃんと、ラップすると書いてある。32bitのままで、未来永劫、十分。
SERIAL The unsigned 32 bit version number of the original copy
of the zone. Zone transfers preserve this value. This
value wraps and should be compared using sequence space
Re: (スコア:0)
それは規格の話で実装の話じゃないよね。
○○は××にしなければならないという規格に対し○○は××にならないが△△になるみたいな実装になってるソフトはいっぱいある。