アカウント名:
パスワード:
リンクの解説読みましたけど、問題は
strncat(passwd, "$", 1);をstrlcat(passwd, "$", 1);に、変更したことのようですから、正確には「strlcatの罠」じゃないですかね?
strcat→strncatの時点ではバグってないわけで。
まあ仰ることも間違いではないのですが、C言語界の背景というかstrncatのsize指定が「意外性最小原則にそぐわない」仕様だということで数々のバグの発生源となっており、散々非難されてきた、という今までの経緯があるのです。
で、srtncat使用者はそこを注意して使用してたけど、後からそれをstrlcatに置き換えた人はそんな罠があったと知らず、何も考えずそのまま関数だけ置き換えてしまったと。
ある意味、strncatというのは関数自体がバッドノウハウ的な存在なのですね。まさにバッドノウハウ的対応が、たとえその場は良くても将来に問題を引き起こすという好例となってしまったということでしょう。
そして、そんな些細なミスを誘発するような再発明をするくらいならstrcat(passwd, "$");でいいじゃん、と言うことで、振り出しに戻る。
>そして、そんな些細なミスを誘発するような再発明をするくらいなら>strcat(passwd, "$");でいいじゃん、と言うことで、振り出しに戻る。
戻りませんよ。
プログラムに限らず、人間の行う論理表現では「明示的なある」を示せても「暗黙のない」は示せません(コメントなど含め、また「”ない”と書いて”ある”」まで含まれます)。
ここで、strcatでは「バッファのサイズ溢れとか危険だけどその意識は”ある”のか”ない”のか」を示すことができません。ですので、そこで人間が明示的に「(意識は)ある」を保証するためには、適切なコード(strcatからstrncatにす
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
Stay hungry, Stay foolish. -- 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: (スコア:1, すばらしい洞察)
そして、そんな些細なミスを誘発するような再発明をするくらいならstrcat(passwd, "$");でいいじゃん、と言うことで、振り出しに戻る。
Re: (スコア:0)
>そして、そんな些細なミスを誘発するような再発明をするくらいなら
>strcat(passwd, "$");でいいじゃん、と言うことで、振り出しに戻る。
戻りませんよ。
プログラムに限らず、人間の行う論理表現では
「明示的なある」を示せても「暗黙のない」は示せません
(コメントなど含め、また「”ない”と書いて”ある”」まで含まれます)。
ここで、strcatでは
「バッファのサイズ溢れとか危険だけどその意識は”ある”のか”ない”のか」
を示すことができません。
ですので、そこで人間が明示的に「(意識は)ある」を保証するためには、
適切なコード(strcatからstrncatにす
Re:strncatの罠? (スコア:0)
ところで、(#2008738)や(#2008747)のACとは別の方ですよね。それらのコメントではstrcat()でいいよという話ですが、話が全く変わってます。
そもそも、文字列定数を連結するのに、strcat()の代わりにstrncat()を使うのは、引数の計算・入力ミスよる危険性が加わるだけで良いことがありません。
また、strcat()を使っているからと言って、文字列長を意識していないと言うことはないと思います。それが意識されていないようでは、コード全体を信用できません。