トップページ⇒tech
180コメント60KB

__フリーソースコードのレベル__

■ このスレッドは過去ログ倉庫に格納されています
0001夏厨学生NGNG
CodeProjectとかPlanetSourceCodeとかでは沢山のソースを
公開されてますが、これらのレベルってどうなんでしょう?

業務レベルには程遠いんでしょうか?
また、業務レベルのソースとはどういうソースなんでしょうか。
0153デフォルトの名無しさんNGNG
逆に下手でもいいんだ、って勇気付けられた俺がいる!!
藻前ら、ありがとう!!!
0154デフォルトの名無しさんNGNG
>>152
ISO/IEC 9899:1999 の Initialization の項に、
assure あるいは guarantee といった単語は出てこない。
0155デフォルトの名無しさんNGNG
そこを調べりゃよかったのか。
構造体のinitializerが足りない場合は、
>the remainder of the aggregate shall be
>initialized implicitly the same as objects that have static storage duration.
ってことで、残りのメンバは0に初期化されるわけか。
memsetやZeroMemoryよりもやっぱこっちで十分だな。
0156デフォルトの名無しさんNGNG
>>115
> memset(&hoge, O, sizeof(hoge));
> ZeroMemory(&hoge, sizeof(hoge));

こんなコードを無意味にいれている C/C++ プログラムは、Javaよりも遅いです!
必要なところにだけ入れましょう! 念のためなんて入れていると極端に遅くなります(データの大きさが大きくなると)

0157デフォルトの名無しさんNGNG
そっか、Javaはnewするときにゼロクリアされてなかったのか
0158115NGNG
>>156

・まず、>>157も皮肉ってるが、ここを読め。
 http://www.y-adagio.com/public/standards/tr_javalang/4.doc.htm#10931

・大きくなると極端に遅くなる、というのはダウトだろう。
 P3 600Mzで、10MBのゼロクリアに0.05秒だったぞ。

・アクションゲーム作ってるわけじゃないので、楽できるところで
 わざわざクリア漏れのリスクは犯せない。

・速度向上のアプローチが間違ってる。小手先のテクニックじゃなくて、
 パフォーマンスの全体的なプロファイリングをした上でボトルネックを探すべき。

実際、暗号化や署名生成といった処理が処理時間の大半を占めてるわけだし。
ゼロクリアによる性能悪化は誤差の範囲。
0159デフォルトの名無しさんNGNG
>>158
あなたの方が現実を知らなすぎ(笑)
0160デフォルトの名無しさんNGNG
まぁポインタ扱う以上、ゼロクリアは無意味どころか、
ある意味最重要のような気がするがな。
てかバイトコードの変換を考えると、似たような処理をする場合
CがJAVAより遅くなるって難しくねぇか?(´Д`)
Cのおかしな仕様の殆どは実行効率を高めるための制約だし。


>>159
>>158に禿同な漏れも現実を知らんことになるな。
どのように現実を知らないか詳細希望。
フツーに興味がある。
0161160NGNG
初回起動時にバイトコードを
ネイティブコードに変換したモンを保存しておき、
次回から変換済みの方で実行する手法による
反論はいらん。んなことができん環境もあるからな。

0162デフォルトの名無しさんNGNG
>>156
> 念のためなんて入れていると極端に遅くなります(データの大きさが大きくなると)

その後その巨大な構造体のメンバを埋めていくのにはすさまじい時間がかかりそうだな。
ゼロクリアにかかる時間が誤差に見えてくるぜ。

>>161
ネイティブに変換したところでゼロクリアしてる事実が無くなるわけじゃないから問題ないだろ。
0163デフォルトの名無しさんNGNG
mallocの実装によっては、呼び出し時は単に仮想メモリページ群を予約しておくだけで、
実際にアクセスされたときになって初めて物理ページを割り当てるようなのがあるのかも。

漏れも(Winの)PAGE_GUARDの仕組み利用して、そういうの自前で作ったことある。
この場合、ゼロクリアすると、せっかくの親切設計が台無しになる。

まあ、そんな実装での話なぞ誰もしていないと思うが。w
0164デフォルトの名無しさんNGNG
>>163
それを利用して過去のアプリのデータの残骸を吸い出す攻撃があるので
最近はセキュア指向で、そういう場合もゼロクリアが基本。
0165デフォルトの名無しさんNGNG
>>164
へーそうなんだ、ググッてみます。サンクスコ。
0166デフォルトの名無しさんNGNG
>>119で話題振ったのに気づいてもらえなくて悲しかったんだが、w
セキュアな情報のクリアには、ZeroMemory()ではなくSecureZeroMemory()を使いましょう。

Use this function instead of ZeroMemory when you want to ensure that your
data will be overwritten promptly, as the compiler can optimize a call to
ZeroMemory by removing it entirely. A call to SecureZeroMemory will not be
optimized.

スレタイに沿ってオープンソースの世界を眺めてみると、例えばOpenSSLだと単に0で埋めるんではなく、
OPENSSL_cleanse()ちゅうのを用意して、中では結構複雑な処理してる。

This can be used to solve two issues: 1) the removal of calls to memset()
by highly optimizing compilers, and 2) cleansing with other values than 0,
since those can be read through on certain media, for example a swap space
on disk.
0167デフォルトの名無しさんNGNG
>>159マダー?
0168デフォルトの名無しさんNGNG
>>66もマダー?
0169デフォルトの名無しさんNGNG
良いニュースと悪いニュース
http://www.microsoft.com/japan/msdn/columns/secure/secure10102002.asp

今までメモリ内の機密データをクリアするなんて考えもしなかったし、
memsetがコンパイラの最適化によって消されるなんてことも思いつかなかったなぁ・・・

ネタ振りをしてくれた >>66 氏に多謝!!
0170デフォルトの名無しさんNGNG
最近あまり見ないけど、0.0 のビットパターンがオール 0 じゃない
マシンってのもあるよね。
0171デフォルトの名無しさんNGNG
>>169
コレに書いてあることは?
安全策でつかいおわった後の領域を memset クリアしても、
コンパイラの最適化によって、memsetクリアのコードは無効になるってこと?

しかもクリアするようにするには、なんか最適化はずすようにしないといかんの?
めんどいね。まあ、そのコード書かないからどうでもいいけど
0172デフォルトの名無しさんNGNG
アプリケーション内部はプログラマ自身が守るとして、
GUIの入力ウィジェットとかは、パスワードタイブの入力の場合
きちんと作業バッファをゼロクリアしてるのかな?
0173デフォルトの名無しさんNGNG
>>171
memsetでクリアした領域はそのあと使ってないから、
そんな所を触るのは無駄と判断してそのコードは生成しないと。

関数の呼出をはしょっちゃうのは、最適化しすぎな気もするけどねえ。
0174デフォルトの名無しさんNGNG
>>173
memsetみたいなプリミティブかつ標準提供な関数ぐらいだろうけどね・・。
MSのコンパイラは結構前から memsetとかは intrinsic,
埋め込み展開対象だから、そのへんが原因なのかな。

そういう意味では、std::fillなんかもまんまインライン展開だから最適化で消えるか。
0175デフォルトの名無しさんNGNG
藻前らSecureZeroMemory を使いなっつぁい!
0176デフォルトの名無しさんNGNG
なぁ、>>115で言ってるnew/deleteのオーバーロードってどうやるの?
newの中にヒープ関数とZeroMemory()書くだけ?
0177デフォルトの名無しさんNGNG
http://jt.mozilla.gr.jp/hacking/portable-cpp.html
見ると、VC++ だけ相手にしてりゃいい漏れがいかに楽なのか
(世のなかにクズなコンパイラがあふれてるか)がわかるよ。
0178デフォルトの名無しさんNGNG
0179デフォルトの名無しさんNGNG
おぺれーたーぬー
0180デフォルトの名無しさんNGNG
Cが移植性が高いと言われたのは、アセンブラと比べた場合
その頃のCに対する認識は高級アセンブラ

どうでもいいんだが…
■ このスレッドは過去ログ倉庫に格納されています