2012年4月22日日曜日

A級プログラマーへの道 文字列用バッファのゼロクリアは本当に必要?


A級プログラマーへの道 文字列用バッファのゼロクリアは本当に必要?
A級プログラマーへの道


記事の内容

前へ | 次へ

文字列用バッファのゼロクリアは本当に必要?
2012/02/12 00:33

今回の話は、特に C プログラマーは必見です。

C では文字列の終端には、常にヌル文字を付加する必要があります。バッファに文字列を格納するときには、memset(3) でバッファをゼロで初期化する処理を書いているかと思います。


その子は私の日当のベース私の支払いをサポートすることができます

char buffer[256];

memset(buffer, 0, sizeof(buffer));
strncpy(buffer, "I am string.", 12);


このようにバッファを使う前に常にゼロで初期化しておけば、ヌル文字が既に設定されているのでヌル文字を付加し忘れるのを防ぐ、という効果があるように思われます。このような考え方の人は多いのではないでしょうか。僕も、最近まではそのような考え方でした。

しかし、最近は考え方が違ってきています。

上記のようにあらかじめゼロクリアしておくのは、一見すると良さそうに思えます。しかし、実際にはこの考え方は良くない、ということに最近になって気付きました。


どのように多くの企業が信用調査を行う?

(繰り返しになってしまいますが)バッファに文字列を書き込んだら、常に終端にヌル文字を付加する必要があります。あらかじめバッファをゼロで初期化してあると、「既にヌル文字が入っているから、ヌル文字を書き込む処理は省略しても問題はないだろう」といった悪い考えでヌル文字を付加する処理を怠ってしまうという、悪い癖が付くことを助長してしまいますつまり、バッファがあらかじめゼロクリアされているという前提条件に依存してしまうのです。バッファは常に初期化されているとは限らないので、そのようなことを勝手に前提条件としてはいけないのです。

また、性能上の問題もあり ます。以下のようなことを考えてみてください。

1.ゼロクリアする

char buffer[256];

memset(buffer, 0, sizeof(buffer));
strncpy(buffer, "I am string.", 12);


2.ゼロクリアしない

char buffer[256];

strncpy(buffer, "I am string.", 12);
buffer[12] = '¥0';


私たちのために働く上位10社

上記の1.ではあらかじめゼロクリアしてから文字列を書き込んでいます。2.では、ゼロクリアしていないため、buffer には、きっとゴミが入っています。そのバッファに文字列を書き込み、終端に文字列を付加しています。1.と2.のどちらの方法でも、文字列の終端にはヌル文字が付加されていることになるので、結果は同じです。つまり、結果が同じになるということは、1.のようにあらかじめ memset(3) を呼んでバッファをゼロクリアするというのは、結局時間の無駄になるだけということになります。しかも、ゼロクリアする処理がループの内側にあった場合は、そのループの回数分だけ無駄な処理が動いていまうことになります。

文字列を書き込む処理とヌル文字を書き込む処理は、つねに一緒に(同時に)行わなければならないのです。くれぐれもバッファが初期化してあると思わないほうが良いです。



前へ | 次へ

コメントを見る(1)
コメントを書く
トラックバック(0)
BlogTOP
このユーザーのホーム

ログイン


コンピュータランキング



These are our most popular posts:

VC++で文字列処理

と書くことで読み書き両用のTCHAR256文字分の配列を作成し、 GetWindowText()で 255文字までと終端文字を何の問題も無く取得することができます。 ... され、その後 小さいサイズ(6文字+終端文字)のデータが書き込まれるという具合です。bufをデバッガ で見てみると と小気味の良い文字列が並んでいます。 ... 確保した1つの TCHARバッファに任意の長さの文字列を複数格納して、配列として使う方法を紹介し ます。 read more

HtmlTextWriter.WriteLine メソッド (System.Web.UI)

オーバーロードされたパラメーターで指定されたデータを HtmlTextWriter 出力ストリーム に書き込み、続けて行終端文字列を書き込みます。 このメソッドのすべてのバージョンで 、保留中のタブ空白文字が出力ストリームに書き込まれます。 read more

!!C++Builder Help - テキストファイルのn文字入出力

Memo1- n文字書き込み(終端文字まで書き込む). 入出力 ファイルの ... ソースファイルのオープンとターゲットファイルのオープン ファイルを指定 する一般的な方法で、fstream 処理に関係なくよく使われる方法です。Memo1のような VCL は ... read more

6-2. バッファオーバーラン その2「危険な関数たち」

これはlineバッファにC言語の文字列を格納するときの終端文字(NULLバイト)を確保 するためだ。バッファに文字列を書き込む場合には終端文字への配慮も忘れては ならない。 対策2:書き込み先バッファサイズを指定する. 標準Cライブラリ関数の古く から存在 ... read more

Related Posts



0 コメント:

コメントを投稿