2016年02月23日

ファイルサイズを求めるのにfseek()とftell()を使ってはいけなかった件2

先日の「ファイルサイズを求めるのにfseek()とftell()を使ってはいけなかった件」ですが、昨日までで、最近公開した主要ソフトのうち半分は修正を終えました。

あと3本ほど、手を付けられなかったソフトがありますが、

  • 2/27(土)予定:マウスのお供
  • 2/28(日)予定:ListView to CSV
  • 2/29(月)予定:マウスふるふる

で対応していこうかと考えております。なんとか2月中にカタを付けられたらな、と。


続きを読む
posted by ayacy at 00:00 | Comment(0) | TrackBack(0) | フリーソフト

2016年02月22日

printfで__int64の変数を表示するための%***の記号が、どうしても覚えられない

最近作っているプログラムで、進捗状況をバイト数で表示しています。

lcglite_ss_s_cmd.jpg

このプログラムでは2GB以上のファイルを扱えるようにしているので、バイト数で表示しようとすると、32bitのintでは足りず、64bitのintを使う必要があります。

Visual C++ の __int64 というやつです。

__int64の変数を、printf() 関数を使って画面表示したい場合、%d ではない別の記号を使うことになるのですが、それがいつも覚えられず、ググっています。
もう何十回目だろう。そろそろ覚えてしまいたい。

最近は、(本業の)自らの社員番号とか、会社から貸与された携帯電話の番号とか、新しい自宅の固定電話の番号とか、全部覚えられない。ああ、モノを覚えるのがどんどん厳しくなってくるな。年齢を感じます。


ちなみに正解は、

  (signed) __int64 … %I64d
  unsigned __int64 … %I64u

でした。

delctrlc_c.png


posted by ayacy at 00:00 | Comment(0) | TrackBack(0) | プログラミング

2016年02月21日

ファイルサイズを求めるのにfseek()とftell()を使ってはいけなかった件

先日も追記しましたが、C言語でファイルサイズを求めるためにfseek() と ftell() を使う方法はダメなようです。


↓やってはいけないコーディング

fseek(fp, 0, SEEK_END);
long fsize = ftell(fp);
fseek(fp, 0, SEEK_SET);


詳細はJPCERTのページで。

要は、動作の保証されていない状態が生じてしまうので、今は上手く動いていたとしても、将来の環境であるとか、将来のバージョンの開発環境であるとか、別のOSに移植しようとしたときとかに、上手く動かなくなる可能性があるというわけですね。

当サイトで開発しているソフトの中の状況としては、「exeファイルが自分自身のMD5を計算し、改鋳や破損が発生していないかセルフチェックする」処理があります。使用箇所は多数。ちょっとヤバイ感じ。

幸い、現行のOS で使う限り、また、Visual Studio 2010 でビルドしている限りでは、実際問題は発生していません。
ただし、JPCERTのページにも書いているとおり、潜在的な脆弱性を作り込んでしまっている状況です。

というわけで、可能な範囲で改修を入れていきたいと考えています。

また同時に、比較的単純な改修で2GB以上のファイルの取り扱いが対応になる箇所にも、改修を入れていこうと思います。

posted by ayacy at 00:00 | Comment(0) | TrackBack(0) | プログラミング