正しいファイルの読み方

セキュアハッシュ系のバグ取りをしていたら以下ののようにファイル読み込み処理をミスっていた。
ハッシュが違うナァ。と思っていたらこんな間違いだったなんて。(/ω\)ハズカシーィ
はづかC〜。C言語だけに・・・。


//とりあえず、ミスったのは以下の実装

//この実装は非常に良くない。でかいファイルの場合完全に読み出せない。
BYTE buff[1024];
FILE *fp = fopen(なんとやら);
while(1){
size_t n = fread(buff,1,sizeof(buff),fp);
if(n <= 0){
if(ferror(fp)){
throw std::runtime_error("LoadFileToHash fread error");
}
break;
}
//なんかの処理。
}
//こっちの実装が正しい。
fp = fopen(なんとかかんとか);
for(;!feof(fp);)
{
if(ferror(fp) ){
throw std::runtime_error("ferror error");
}
size_t count = fread(t,1,sizeof(t),fp);
//ありえないエラーチェック
NOT_ASSERT(count > sizeof(t));

//なんかの処理。

}


freadについてのウンチク

freadは必ず指定した通りにファイルを読みこむわけではない。
必ず戻り値をチェックして何バイト読みこんだのかチェックするのが妥当。
偶に、

  • freadが指定通り読みこめなかったらエラー
  • freadが指定通り読みこめなかった場合を考慮していない

等のプログラムが存在するがそういうプログラミングは止めて欲しい。
と、思った。
セキュリティーホールにもつながりそうですしネ^^