アカウント名:
パスワード:
リンクの解説読みましたけど、問題は
strncat(passwd, "$", 1);をstrlcat(passwd, "$", 1);に、変更したことのようですから、正確には「strlcatの罠」じゃないですかね?
strcat→strncatの時点ではバグってないわけで。
まあ仰ることも間違いではないのですが、C言語界の背景というかstrncatのsize指定が「意外性最小原則にそぐわない」仕様だということで数々のバグの発生源となっており、散々非難されてきた、という今までの経緯があるのです。
で、srtncat使用者はそこを注意して使用してたけど、後からそれをstrlcatに置き換えた人はそんな罠があったと知らず、何も考えずそのまま関数だけ置き換えてしまったと。
ある意味、strncatというのは関数自体がバッドノウハウ的な存在なのですね。まさにバッドノウハウ的対応が、たとえその場は良くても将来に問題を引き起こすという好例となってしまったということでしょう。
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
海軍に入るくらいなら海賊になった方がいい -- Steven Paul Jobs
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: (スコア:1, おもしろおかしい)
蛇足の部分でミスった。
passwd_end = passwd + strlen(passwd);
*passwd_end = '$'; passwd_end[1] = 0;
と書かないと意味が通じないか。
Re: (スコア:0)
> *passwd_end = '$'; passwd_end[1] = 0;
char 型の配列に『数値の』0を代入ですか?
『キャラクター値である文字列終端記号』である事を示すために '\0' の方がよくありませんか?
#同様にポインタとして NULL と書くべきところを 0 と書いているのも大量に見るな。
Re:strncatの罠? (スコア:0)
# それができないくせにコードに手を入れようとするから、こういうトラブルが生まれるってことも理解してます?