アカウント名:
パスワード:
リンクの解説読みましたけど、問題は
strncat(passwd, "$", 1);をstrlcat(passwd, "$", 1);に、変更したことのようですから、正確には「strlcatの罠」じゃないですかね?
strcat→strncatの時点ではバグってないわけで。
まあ仰ることも間違いではないのですが、C言語界の背景というかstrncatのsize指定が「意外性最小原則にそぐわない」仕様だということで数々のバグの発生源となっており、散々非難されてきた、という今までの経緯があるのです。
で、srtncat使用者はそこを注意して使用してたけど、後からそれをstrlcatに置き換えた人はそんな罠があったと知らず、何も考えずそのまま関数だけ置き換えてしまったと。
ある意味、strncatというのは関数自体がバッドノウハウ的な存在なのですね。まさにバッドノウハウ的対応が、たとえその場は良くても将来に問題を引き起こすという好例となってしまったということでしょう。
>strncat の第三引き数は size じゃないぞー(型は size_t だったりするかもしれないが)。ああ、ごめんなさい。あまり気にしないで書いてしまいましたが第三引数が「連結する文字数」なので size でなく length OR count だとかいう意味のご指摘ですよね?
その辺にこだわる方もいらっしゃいますが私は型がsize_tなら何であれサイズと表しても間違いではないと思う派です。バッファサイズ、バイトサイズ、文字列サイズ。ということで。
C言語で size_t が出てくる時、いつもこのうちのどれなのかで悩むので静的型付け大好き人間としては buf_size_t とか length_t とか標準で作って欲しいと密かに思っています。
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
クラックを法規制強化で止められると思ってる奴は頭がおかしい -- あるアレゲ人
strncatの罠? (スコア:0)
リンクの解説読みましたけど、問題は
strncat(passwd, "$", 1);
を
strlcat(passwd, "$", 1);
に、変更したことのようですから、正確には「strlcatの罠」じゃないですかね?
strcat→strncatの時点ではバグってないわけで。
Re: (スコア:5, 興味深い)
まあ仰ることも間違いではないのですが、C言語界の背景というか
strncatのsize指定が「意外性最小原則にそぐわない」仕様だということで
数々のバグの発生源となっており、散々非難されてきた、という今までの経緯があるのです。
で、srtncat使用者はそこを注意して使用してたけど、後からそれをstrlcatに置き換えた人は
そんな罠があったと知らず、何も考えずそのまま関数だけ置き換えてしまったと。
ある意味、strncatというのは関数自体がバッドノウハウ的な存在なのですね。
まさにバッドノウハウ的対応が、たとえその場は良くても将来に問題を引き起こすという好例となってしまったということでしょう。
Re: (スコア:1, すばらしい洞察)
第三引き数が size なのは strlcpy の方だぞ。
引き数の意味を間違えて「意外性」どうのこうのとか、知ったかぶりするのはやめて欲しい。
本人は悪意がないのかもしれないけど、まだぞろ誤解して、strcat() 使うなとか、
strncat() 使うなとか、頭の悪いコード規約作ろうとうするやつが多発するから。
今回のも罠でも何でもなくて strcat() で十分なのに、迷信に従って strncpy(), strlcpy() とかに書き換えた馬鹿がいるだけじゃないか。
# *passwd = '$'; passwd[1] = 0; <--- 本当にやりたっかったこと
Re:strncatの罠? (スコア:2)
>strncat の第三引き数は size じゃないぞー(型は size_t だったりするかもしれないが)。
ああ、ごめんなさい。あまり気にしないで書いてしまいましたが
第三引数が「連結する文字数」なので size でなく length OR count だとかいう意味のご指摘ですよね?
その辺にこだわる方もいらっしゃいますが私は型がsize_tなら何であれサイズと表しても
間違いではないと思う派です。
バッファサイズ、バイトサイズ、文字列サイズ。ということで。
C言語で size_t が出てくる時、いつもこのうちのどれなのかで悩むので
静的型付け大好き人間としては buf_size_t とか length_t とか標準で作って欲しいと密かに思っています。