less than 1 minute read

ふつうのlinuxを読んでるシリーズ 3

printfの注意

char* str;
... // strの中身を、どっかで埋める

printf(str);

みたいな使い方をしてはいけない。特に、strの中身を外部から取ってくるようなときは。なんでかっていうと、strの途中に%dみたいな文字が混ざっていると、printfは、実引数strの「次」を見に行ってしまう。そこに何があるか分からないが、これはメモリアクセス違反で、非常に危険。なので、printfの最初の引数には、文字列のリテラル以外は入れてはいけない。

stdioとシステムコールを混ぜるな危険

システムコールは、直接ストリームの中を操作する。stdioは、入出力をバッファリングする。ので、両者を混ぜると、バッファの状態に不整合が生じてしまう。ということは、何がシステムコールで何がstdioのライブラリ関数なのかは覚える必要がある。めんどい。

今日は

疲れたからこれだけ・・だと残念なので、今後の課題をまとめておく。

まず、ストリーム関連APIの使い方をチートシート的にまとめたい。じゃないと覚えられない。

  • ライブラリ or システムコール
  • エラーになったときの挙動
  • 典型の使い方

あたりかなぁ・・あるいは、長いこと使ってれば自然に覚えるものなんじゃろか。

もしくは、個別の関数の使い方とは逆に、「XXしたいときの書き方」を書いといても良いのかもしれない。典型的なユースケースを洗い出す必要が出てくるだろう。それはそれで頭の整理になりそうだ。

タグ: ,

カテゴリー:

更新日時: