危険なパスワードチェックとか2008/06/05知り合いと話していて,こんなソースは危ねいよ,と言われたからメモ。パスワードをチェックする関数です。引数でもらった比較元のパスワードと,ユーザが入力したパスワードを比較して,結果を返す関数。ゼロクリアしています。完璧じゃん!けどこれ,最適化してコンパイルすると,ちょっとまずい。しない人もいるから,これはこれでまだマシな方なんでしょうけどね。こんな風にコンパイルしてみました。foo.c途中経過(アセンブリ)を見ると,こんな風になってるのが分かります。呼び出しがなくなってる!これじゃメモリはクリアされません。スタックにはユーザが入力したパスワードが残っているということです。メモリはクリアされていました。「危険なパスワードチェックとか」誤記の訂正とお詫び」をご参照ください。呼ばれているのが分かります。retじゃあ,最適化オプションを付けないでコンパイルすればいいか,というと,そういうわけじゃもちろんありませんよね。こんなことで最適化オプション云々が左右される筋合いはないし,第一,処理系によって何が最適化されるかは分かりません。コールしなかったわけですけれど,他の処理系でも同じ最適化ポリシーがあるとは限りません。いうわけで,こういうときは,最適化されてもゼロクリアされるように,自前でコーディングするのが,お作法なんだそうな。簡単に自作(※あまりいい実装じゃないけど)。アセンブリで書かれていると思うので,速度は落ちると思います。修飾子ってのは,コンパイラに勝手な解釈をさせないように指示する修飾子のことです。組み込みでは,チップの脚(I/O)の数を変数の幅と一致させているときがあるわけで,変数の幅は割と重要だったりします。したりする処理系もあったりする。修飾子は,そゆのするな!と指示するわけです。なんだか奥がふかいですね。置き換えても,結果は同じでした。マクロも多分同じだと思う......。こゆところのバグは,かなり気をつけないと分からないよなあ......。ここら辺の手当てがあるんだろうか......。