C言語のことは<46>
■ このスレッドは過去ログ倉庫に格納されています
0001激しく未定義とする
NGNGむしろ質問する前にWEBで検索するのが常識だ。
GUIなどの標準Cではできない事の質問は使用している開発環境のスレへ行け。
ソース丸投げ、宿題、書籍 は専門の別スレがあるのでそこへ行け。
コンパイラを探しているなら >>2 を見よ。
上記を逸した場合の結果は激しく未定義とする。
C FAQ 日本語訳
http://www.catnet.ne.jp/kouno/c_faq/c_faq.html
Cプログラマ必読 ・プログラミング言語C(通称 K&R)
http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/
前スレ
http://pc3.2ch.net/test/read.cgi/tech/1038405432/
0153デフォルトの名無しさん
NGNG禿げ
0154デフォルトの名無しさん
NGNGエラーチェックとエラーハンドリングは別物ということを理解してるか ?
0155デフォルトの名無しさん
NGNGネタですか?
0156デフォルトの名無しさん
NGNG理解できてない奴、一匹目。
0157デフォルトの名無しさん
NGNG0158デフォルトの名無しさん
NGNGあさしゃんは夜にできないだろ…
0159デフォルトの名無しさん
NGNGいいえ、シャリです。
0160デフォルトの名無しさん
NGNG夜にする あさしゃん って...。
0161デフォルトの名無しさん
NGNG知ったかぶらないでちゃんと説明しろ。
0162デフォルトの名無しさん
NGNG教えを乞う者の態度とは思えんが・・・。
エラーハンドリングは、プログラムの仕様だ。
プログラムの実行時に発生する可能性がある異常値をあらかじめ想定して、捕捉し、
それに応じた復帰/終了処理をする。
アサーションは、プログラムが仕様/意図通りに動いているかどうかを確かめるものだ。
エラーハンドリング漏れや論理エラー等の、プログラムの実行時に許容できない異常値を
捕捉する。
仕様/意図通りに動いている事が確認できればそれはもう必要無いので、リリースビルド
には含めない。
エラーハンドリングは仕様書に現われる、アサーションは現われない。
0163154
NGNGエラーチェック: エラー状態かテストすること。
エラーハンドリング: エラー状態時にしかるべき処理を行うこと。
ASSERT() が行うのは、エラーハンドリングの方。
だから、>>151 がなに言ってるか俺にはさっぱりわからん。
0164デフォルトの名無しさん
NGNGassert()は「しかるべき処理」は行わないだろ。
少なくともユーザから見た場合。
0165デフォルトの名無しさん
NGNGそれで具体的にどういうものがエラーハンドリングになってどういうものがアサーションになるのだ?
0166名無しさん@XEmacs
NGNGなんでこの人はエラーチェックをエラーハンドリングに脳内変換してるの?
0167デフォルトの名無しさん
NGNGどのへんがそうなのか教えてくれないか?
0168デフォルトの名無しさん
NGNGASSERT() マクロにも仕様と言うものがあることを知らんのか ?
ちなみに、リリースビルドでも同じような動作をする VERIFY() マクロもあるぞ。
>>164
プログラマから見たときの話に決まってるだろ。
元々発生しないと思っているんだからさ。
0169デフォルトの名無しさん
NGNGアサーションは、仕様通りに動いていれば本来必要の無いチェックをする。
例えば、リンクリストの意図しないリンク切れとか。
もともとアサーションはまともなデバッガが無い時代のものだから、今使う事は
あまり無いはず。
エラーハンドリングは、例えばファイルが開けなかったとか、実行時に起こり得る
ものをトラップする。
0170デフォルトの名無しさん
NGNGは?
0171デフォルトの名無しさん
NGNGVERIFY() なんての C にあった?
0172165
NGNGコンポーネントやライブラリなどの関数・メソッド内での
引数のチェックにはアサーションを使ってはならない。
コンポーネントやライブラリなどの関数・メソッドを呼び出す前の
引数のチェックにはアサーションを使う。
0173デフォルトの名無しさん
NGNG配列境界のチェックなんてのもあるな。
0174デフォルトの名無しさん
NGNG> 引数のチェックにはアサーションを使う。
引数をチェックするという仕様がプログラムに求められているなら、その場合は
アサーションを使ってはならない。
0175名無しさん@XEmacs
NGNGエラーハンドリングは>>151が勝手に持ち出した話だろ?
0176名無しさん@XEmacs
NGNGもう少しよく読んだら?
0177デフォルトの名無しさん
NGNG規格書ぐらい読めよ。どう言う処置をするかが書いてあるよ。
>>171
> VERIFY() なんての C にあった?
ごめんよ、ANSI-C にはなさそう。VC++ の方言のようだ。
0178デフォルトの名無しさん
NGNG理由は ?
0179デフォルトの名無しさん
NGNG「えっとこの時点ではこの変数はこうなっているはずだよなぁ」って
確認するような感じに使うってことでいい?
引数のチェックに使うのはもってのほかなんだね。
0181デフォルトの名無しさん
NGNGもう少しくわしく書こうか?
関数・メソッドを呼び出す引数をチェックするという仕様がプログラムに
求められているなら、その場合はアサーションを使ってはならない。
>>179
正解。
0182デフォルトの名無しさん
NGNGそりゃブレークポイント。
(そう言えば、>>169 も、「もともとアサーションはまともなデバッガが無い時代のものだから」とかほざいてたな...。こんな香具師ばかりかよ...。)
一応意図は >>162 の...
> アサーションは、プログラムが仕様/意図通りに動いているかどうかを確かめるものだ。
> エラーハンドリング漏れや論理エラー等の、プログラムの実行時に許容できない異常値を捕捉する。
で合ってると思う。(ただしここだけね。)
0183デフォルトの名無しさん
NGNGそういう論理エラーはデバッグの段階で完全に取り除いとけ。
アサーションはそのためにある。
0184デフォルトの名無しさん
NGNG0185名無しさん@XEmacs
NGNG>コンポーネントやライブラリなどの関数・メソッド内での
>引数のチェックにはアサーションを使ってはならない。
当然これが守られてる場合の話だろ?
2重にチェックする気?
0186デフォルトの名無しさん
NGNG禿同。何のために、デバッグしてんだよ。
でも、実際にそう言う状況があるから、>>135 みたいな話が出てくるんだろ。
0187デフォルトの名無しさん
NGNGすまん、あなたがどんな主張を持っていて、どのレスをどう解釈してそう逝っているのか
わかんなくなってきたよ。
0188186
NGNGすまん、>>179 じゃねーや。
>>183
> 禿同。何のために、デバッグしてんだよ。
> でも、実際にそう言う状況があるから、>>135 みたいな話が出てくるんだろ。
だったよ。
0189デフォルトの名無しさん
NGNG理由は ?
(あー、ウザイ。ちゃんと理由も一緒に書けよ。)
0190デフォルトの名無しさん
NGNG0191名無しさん@XEmacs
NGNGライブラリ作る側の話でしょ?
ライブラリのユーザがライブラリ関数をおかしな引数で呼び出しても
暴走しないようにしとくのが普通じゃない?
>>187
>>172 とだいたい同じだと思う。
ライブラリ関数の中で、渡された引数をチェックするのにはassertは使わない。
ライブラリ関数に渡した引数がおかしな値になってないかを確認するのにはassertを使う。
0192デフォルトの名無しさん
NGNG論拠はこれ。
> 「もともとアサーションはまともなデバッガが無い時代のものだから」とか
> ほざいてたな...。こんな香具師ばかりかよ...。)
0193名無しさん@XEmacs
NGNGs/渡した/渡す/
てか実際はassertなんか使わないので>>192にも同意。
0194デフォルトの名無しさん
NGNGだから、呼ばれる側じゃなくて、呼ぶ側でちゃんとデバッグしておけって話だろう。
0195デフォルトの名無しさん
NGNGこれがどうかしたか ? デバッガとアサーションって用途が違うぞ。
0196デフォルトの名無しさん
NGNG0197デフォルトの名無しさん
NGNGだから呼ばれる側はアサーションを使わないでエラーにしろって。
動作が正しく行われるのをモニタリングするため使うのがアサーションで
呼ぶ側で追加でやる処理だろ。
0198デフォルトの名無しさん
NGNG0199デフォルトの名無しさん
NGNG最終製品で残ってたとき、-DNDEBUGしてあると
何がうれしいんだ?
0200名無しさん@XEmacs
NGNGアサーションに引かかったらデバグするでしょ普通。。。
0201デフォルトの名無しさん
NGNG0202デフォルトの名無しさん
NGNG「全部バグが取りきれた」という保証は永遠に得られないだろ?
0203デフォルトの名無しさん
NGNG「遅くなる」の間違いだろ。
0204デフォルトの名無しさん
NGNG> 195 は、アサーションはデバッグのためにするものだという事を知らないのか?
お前アフォだろ ?
アサーションはデバッグのためにする。
デバッガもデバッグのために使う。
だから、デバッガがあればアサーションは要らないって言うのか ?
お前のデバッガは、引数の範囲とかをちゃんと理解して要所要所で、エラーチェックしてくれんのか ?
そんなデバッガがあるなら、俺も使いたいもんだよ。
>>197
状況による。呼ばれた側がいくらエラーを返していても呼び出し側が見てなきゃ何にもならない。
また、呼び出しが非常にたくさんあるなら、呼ばれた側でチェックする方が簡単。
0205名無しさん@XEmacs
NGNGそらそうだ。実際に製品として出回ってるソフトにもバグ残ってるのは
いくらでもあるよ。Windows2000も出荷時に6000ものバグ抱えてたって言うしね。
0206デフォルトの名無しさん
NGNGアサーション入れてもデバッグの助けにならないというなら
入れないほうがいいじゃん。
0207デフォルトの名無しさん
NGNGそこはそれ、豊富な経験・勘と.... 「日程」が背中を押してくれるんですよ。(w
0208デフォルトの名無しさん
NGNG(Pascalだと、コンパイラオプションでon/offできるものが多かった)
の事だが、アサーションでもまあ同じ。
エラーハンドリングの話じゃないよ。
0209デフォルトの名無しさん
NGNG0210デフォルトの名無しさん
NGNGデバッグ用シンボルつけてあるし、
コアダンプを保存するようにしてある。
Netscapeだと、「クォリティフィードバック」と呼んでいるし、
他の製品でもまあよくあるよね。
昔のMS-Cだと、よく「Compiler Internal Error」ってのを見たな。
0211デフォルトの名無しさん
NGNG> 状況による。呼ばれた側がいくらエラーを返していても呼び出し側が見てなきゃ何にもならない。
当たり前だ。呼び出し側にバグがあるんだから呼び出し側のチェック体制を強化しろよ。アサーションでも入れて。
> また、呼び出しが非常にたくさんあるなら、呼ばれた側でチェックする方が簡単。
簡単だからそっちでやるとかそういう問題じゃないだろ。
簡単だからという理由だけなら手抜きと一緒だぞ。
0212デフォルトの名無しさん
NGNGもちろん、すべてのバグがアサーションで検知できるわけではないが、
もともと誰もそんなことを主張してはいない。
0213デフォルトの名無しさん
NGNG呼び出される側にアサーション入れるのでは駄目なの?
0214デフォルトの名無しさん
NGNGアサーションは普通、どこで捕捉したかが重要だから呼び出し側でやるべきだと思うが・・・
0215デフォルトの名無しさん
NGNG(゚Д゚)ハァ?
じゃ、205 はどういう意味なの?
0216名無しさん@XEmacs
NGNGあのね。ライブラリとかだと呼び出す側が
厨房プログラマーだったりするかもしれないでしょ?
ほんとに分かんないのかな?それともネタ?
0217デフォルトの名無しさん
NGNG> 簡単だからという理由だけなら手抜きと一緒だぞ。
同じことが出来るんだったら簡単な方を選ぶよ。どこが手抜だ ?
1000個所から呼ばれてたら、1000個所にいちいち ASSERT() かますわけね。
はっきり言ってバカみたいだよ。
0218デフォルトの名無しさん
NGNGコアダンプの結果見れば、どこから呼び出されたかは分かるだろ。
Winじゃpost-motem debugってできないの?
0219デフォルトの名無しさん
NGNGもし呼び出され側がプログラム全体の呼び出される条件をすべてテストしており
これからの将来それが変更されないのならいいかもしれんね。
0220デフォルトの名無しさん
NGNGfoo()の呼び出しをassert込みでマクロ定義すればよい。
0221デフォルトの名無しさん
NGNG同じことが出来るならね。だが同じことは出来ない。
0222デフォルトの名無しさん
NGNG「製品版でもアサーションは生かしておくべし」
に反対してるやつってまだいるの?
0223名無しさん@XEmacs
NGNG>>205は>>202に対するレス。
バグが残ってる可能性があるからといってassertを残しておいたってあまり意味ないってこと。
本当に最後まで見付からないようなバグはassertでは捉えられないんだから。
0224デフォルトの名無しさん
NGNG-DNDEBUGすると「アサーションは何も検査しなくなる」んだけど?
0225デフォルトの名無しさん
NGNG捉えられないとも限らないだろう。
「あまり」意味は無いかもしれないが、
取り除く意味はデバッグに関して言えば「全く」無いだろう。
0226デフォルトの名無しさん
NGNGああ、理解した。
0227デフォルトの名無しさん
NGNGそれがなぜassertをわざわざ取り除く理由になるんだ?
0228デフォルトの名無しさん
NGNGネタ ? 悪いけど、呼ばれた側でテストしてんのとどこが違う ? (ソース/オブジェクトとか言わないでね。)
それともマジで、ライブラリ中で引っかかっ時に、どこから呼ばれたか見方がわからんの ?
>>221
何ができないのか言ってみ。
0229名無しさん@XEmacs
NGNGいちいちチェックしてたら速度が落ちるでしょうが。
VC++とかでもdebug用とrelease用でコンパイルオプション変えれるでしょ?(。。。よね?)
デバッグのことだけ考えればいいんならこんな区別必要ないでしょうが。
0230デフォルトの名無しさん
NGNGassertに引っかかったとき表示される行番号が違う。
0231デフォルトの名無しさん
NGNGだから、そもそも「リリース用でコンパイルオプションを変えるのが間違い」
というのが>>138の主張なのだが。
0232デフォルトの名無しさん
NGNG速度が落ちるなんて、せいぜい数十%だろ。
ハードの進歩で言って3か月分くらいか?
0234デフォルトの名無しさん
NGNGどんな環境でもコアダンプが利用できると主張したいわけね。
0235デフォルトの名無しさん
NGNGぷぷっ、で、デバッグできないと...。
わかったわかった。お前は、一生そうしてな。
0236デフォルトの名無しさん
NGNG0237デフォルトの名無しさん
NGNG230じゃないけど、君の言うことがよく分からない。説明してくれる?
0238デフォルトの名無しさん
NGNG> どんな環境でもコアダンプが利用できると主張したいわけね。
まあ、できない環境もあるだろうね。
でもデバッガの環境下なら、呼び出し元ぐらいわからない ?
それもダメなら、しょうがないけどね。
0239デフォルトの名無しさん
NGNG出荷後でもアサーションに引っかかることはいくらでも
あると思うけど。
0240名無しさん@XEmacs
NGNGうーん私はそう思わない、としか言いようがないな。
>>232
同じ能力なら速度が早い方の製品を買うでしょ?
で、ライブラリ作る人間と使う人間は別(の可能性がある)ってのは
みんな分かってんのかなぁ?
0241デフォルトの名無しさん
NGNGDr. Watsonみたいのに頼るしかない?
0242デフォルトの名無しさん
NGNG>>238 にも書いたけど、普通のデバッグ環境なら、アサーションに引っかかった時に呼び出し元ぐらいはわかる仕組みはある。
デバッガの下にない時でも、Unix なら core, Windows ならデバッガのオンデマンド起動で呼び出し元がわかるはず。
組込みなんかのやや特殊な場合は、abort() とかでスタックダンプするとかが必要かもしれない。
と言うか、これぐらい理解してないとデバッグできないでしょ ?
0243デフォルトの名無しさん
NGNG135の主張をくつがえす充分な論拠をあなたは提供していないと
思います。アサーションを入れる場所にもよると思うけど、
私は数十%も速度が変わるとは思えない。せいぜい10%以下でしょう。
たとえ数十%速くなったとしても、アサーションが無い場合に
エラーであることさえ気づかず黙って誤動作するソフトにしてしまう
(そしてそのバグが永久に発見されない)ような品質の低下が、
その数十%に見合うとは思えない。
0244デフォルトの名無しさん
NGNGWin は、アサーションした時に「デバッグするか ?」と聞かれるから、「はい」と答えると VC++ が起動して、それでデバッグする。
(>>242 のオンデマンド起動)
0245デフォルトの名無しさん
NGNGアサーションの速度差なんて、体感できないと思う。
0246デフォルトの名無しさん
NGNGうーん。じゃあ客先環境にもVC++をインストールしといて、
「はい」と答えてもらうの?
0247デフォルトの名無しさん
NGNG概ね同意するが、
> (そしてそのバグが永久に発見されない)ような品質の低下
これには同意できない。あと、
> その数十%に見合うとは思えない。
ゲームアプリの場合は、0.1 % でも重要な事が多い。
0248デフォルトの名無しさん
NGNGそれは、難しい問題。
逆にアサーションがぼこぼこ出るようなソフトウェアが今後売れるとも思えない。
永久に発見されないバグは、問題無しと考えこともできるよ。
0249デフォルトの名無しさん
NGNGその時は、DrWatson を使えばよろし。
0250名無しさん@XEmacs
NGNG上にも書いたとおり、製品版のソフトにassertで捉えられるバグなんて
ほとんど残ってない(ようにしとかないといけない)わけで、それ以外の
バグの方が圧倒的に多いから、必ずしもassertを残しといたからって
安全性が上がるってものでもない。
当然速度との兼ね合いはトレードオフの話になるから、速度なんて
どーでもいい製品なら残しといてもいいと思うけどね。
0251デフォルトの名無しさん
NGNGネスケはぼこぼこ出るよね。(QFA)
他のアプリは、アサーションは出ないけど「一般保護例外」が出る(w
0252デフォルトの名無しさん
NGNGつーか、客先環境でアサーションが出ること自体が問題かと...。
■ このスレッドは過去ログ倉庫に格納されています