C言語の見えないバグ、対処法でも語るスレ
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
NGNG質問は質問スレへどぞー
ttp://pc2.2ch.net/test/read.cgi/tech/1064234533/l50
0002デフォルトの名無しさん
NGNG0003デフォルトの名無しさん
NGNG0004デフォルトの名無しさん
NGNGあれ結局結論はどうなったんですか?
0005デフォルトの名無しさん
NGNG1年以上やってたのは知ってるが、結論は・・・
0006デフォルトの名無しさん
NGNG僕も途中で飽きて読むの止めちゃったんですよねぇ・・・
0007デフォルトの名無しさん
NGNG0008デフォルトの名無しさん
NGNGってのが納得出来ない人がいて、延々と同じ話題を繰り返していたような・・
あの頃はもう fj ほとんど読まなくなってたんだけどね
0009デフォルトの名無しさん
NGNGファイル入力の場合は入力ファイルをオープンするわけです。
そのあと検索ファイルを開いて文字列を検索し
その結果を出力ファイルを開いてファイルに出力。
で、その後最後にfclose()を行うわけだが
ここで一気に入力、検索、出力のファイルをクローズしてしまっていた為
標準入力の場合はオープンしてないファイルをクローズする命令になっていた。
実行結果としては
ファイル入力→出力…○
標準入力 →出力…×
となっていた。
その構造に気づかずに、標準入力とファイル出力は相性が悪いのかなぁ…
と勝手に思っていたDQNでした。
0010デフォルトの名無しさん
NGNGあげくのはてに、exitをreturnに変えて再利用したとき、
リークするからとかなんとか・・・
0011デフォルトの名無しさん
NGNG#if defined(_Debug)
#define DStr(S) puts(S)/*putsは他に置き換えできる。*/
#else
#define DStr(S)
#endif
VC使ってるけど、デバッグの時はありえない値をバカスカ入れて、ウオッチしてるよ。
ブレークポイントをしっかり設定してやばげなら中止する。
基本的に配列などは最初と最後と大体の中間だけ見てるけどこういうのはヤバイかな??
0012デフォルトの名無しさん
NGNGPurifyなどのメモリリークチェッカを使ったほうが、リークのチェックをしやすい。
0013デフォルトの名無しさん
NGNG初心者がよくそういうのを使うね。
DStr()をそういう小手先のマクロにするんじゃなくて、
ちゃんとデバグ用関数として作るほうがいいと思う
>>12
fj の件なら、メモリリークはアプリじゃなくて、システム(OSとか)で
起きるかもしれない、というのが論点だった。
たとえば、Windows アプリを強制終了すると、資源がリザーブ
されたままになっちゃうとか、そういう話。
0014デフォルトの名無しさん
NGNG> 入力方法を標準入力かファイル入力かif文で分けて
何のために、標準入力とファイル入力が同じファイル識別子が使えるようになっているのか...。
単につくりがしょぼいだけのことだろ。
0015デフォルトの名無しさん
NGNG>DStr()をそういう小手先のマクロにするんじゃなくて、
>ちゃんとデバグ用関数として作るほうがいいと思う
たとえばどんなの?
0016デフォルトの名無しさん
NGNGttp://www.pro.or.jp/~fuji/
Cプログラミング診断室にマクロうんぬんあったんで行ってみれば?
001713
NGNGどんな関数であるかはあまり重要でない。
マクロで作るというのは、デバグが終わったら消しちゃえ、ぐらいに
軽視していると思う。
と述べた上で、デバグ関数には次のような機能があるとよいかと。
・スイッチで出力のオンオフが出来る
・スイッチでレベルの変更が出来る(-vオプションとか)
・出力先を選択、ファイルならラップするとか
・時刻などの必須パラメタを埋め込む、出力形式を揃える、などなど
0018デフォルトの名無しさん
NGNG0019デフォルトの名無しさん
NGNGマクロ定数で存在が消えたら実行ファイルが小さくなるというのはメリットかもしれないけど
CPUリソースが豊富になった今ではそれほどの価値はないでしょ。
そりゃ、組み込みで本番ではテスト環境の容量半分で、とかなら別だけどさ
0020デフォルトの名無しさん
NGNGfclose()の話と続いたので気になったんだけど、
double free とかのトラブルは無いの?
0022デフォルトの名無しさん
NGNGプログラマがクリエートした資源を捨てるのはプログラマ責任でやるべき
だろう。allocしたならfreeするのは議論すべきまでもない気がするが・・・。
(プロセス内の事はプロセス内で片づけろ、という事)
>>テスト用の関数
ウチの会社では、Cで開発する場合、関数毎にダミーのmainを付けて、単体
テストを終えてから、mainを取り外して内部出荷していた。
さらに、関数内部には、入り口と全ての出口に、内部変数の表示マクロが
あり、異常ルートにも表示マクロがあった。これらは「プログラマの想定外
の値だったら、表示する」というマクロだった。
しかも最終出荷まで生きているマクロだった(つまり、試験期間中はずっと
生きている)。
このまま試験すると、バグがある時は大量の変数表示が出るわけだが、大量
と言っても実行ログはテキストファイルであり、たかが知れた量。
grepとかで異常を検出すれば良いだけの話。
最初、「いちいち関数毎にマクロ埋めるのめんどくせー」とか思っていたが、
大規模開発の時には、その恩恵にあずかったよ。
0023デフォルトの名無しさん
NGNGそういうのは普通にやるよね。
0024デフォルトの名無しさん
NGNG0025デフォルトの名無しさん
NGNG0026デフォルトの名無しさん
NGNG0027デフォルトの名無しさん
NGNG002826
NGNG○force
鬱氏・・・
0029デフォルトの名無しさん
NGNGsigned/unsigned = unsigned になるのは盲点だった・・・
0030デフォルトの名無しさん
NGNGsigned char
char
がそれぞれ別の型なのはC++だけだっけ?
0031デフォルトの名無しさん
NGNGどちらと正しいかは処理系定義。
C++ だと>>30のいうとおりにそれぞれ別の型だな。
0032デフォルトの名無しさん
NGNG#define ACT 1 として PORT=ACT; も PORT=~ACT; も どちらも BCLR PORT が出ず
BSET PORT が出た。仕方なくPORT=1^ACT; と書いて0を出させた。
0033デフォルトの名無しさん
NGNG0034デフォルトの名無しさん
NGNGアクションゲームとか作るんだよ!
デバッグコードが入ってるとPen133MHz対応が微妙になるんだよ!
0035デフォルトの名無しさん
NGNG> sizeof(配列名)とsizeof(&配列名[0])って両方とも要素のサイズじゃなくて
> 配列全体のサイズになんのな。以前ハマタ。
sizeof(&配列名[0])は知らなかった。
0036デフォルトの名無しさん
NGNGコンパイラが腐ってるだけじゃねーの?
003735
NGNG今試してみたらどうもそうらしい。
さっき試したときはこんなコード。(コンパイラはBCC)
char test[4];
printf("%d", sizeof &test[0]);
よくよく考えたらsizeof (char *)も4だった。OTL
今いろいろと要素数を変えてみても結果は4のまま。
やっぱりそこの506の使っていたコンパイラに問題ありのようだ。
0038デフォルトの名無しさん
NGNG戸惑う事が年に1度はある。
見えるバグだけど、書き忘れなだけに見えないバグとも言える。
0039デフォルトの名無しさん
NGNG0041デフォルトの名無しさん
NGNGキーワードに色がつくエディタ使いなよ。
って2ヶ月前の書き込みか orz
0042デフォルトの名無しさん
NGNG0043デフォルトの名無しさん
NGNG配列→ポインタの暗黙の変換もできなくなるので、
配列にregister指定するとその変数にはなんとsizeof以外、何もできなくなるそうな。
当たり前に思っていることがちょっと集まっただけで信じられないことが起こるもんだ。
0044デフォルトの名無しさん
NGNG環境による。
0045デフォルトの名無しさん
NGNGそうは言っても規格を厳密に解釈するとそうなるわけで。
0046デフォルトの名無しさん
05/02/15 04:12:210047デフォルトの名無しさん
05/02/15 10:09:080048デフォルトの名無しさん
05/02/15 12:20:24祈りなさい。
じゃなかった。
case/defaultの':'を書いたらすぐにbreak;を書く癖をつけてみるとか。
thruしたいロジックなんてめったに無いだろうからそれで充分。
switch () {...}の最後にbreak;がくるのが気に入らないならご愁傷様で。
0049デフォルトの名無しさん
05/02/16 15:47:460050デフォルトの名無しさん
05/02/16 21:02:070051デフォルトの名無しさん
05/02/17 12:19:50switch (foo) {
case 0: /* こことか */
case 1:
return; /* こことか */
default:
...; /* ここで */
} /* いちいち警告出たら鬱陶しい。 */
0052デフォルトの名無しさん
05/03/03 01:42:18static void *code[] = {&&L1,&&L2, &&L3, ... &&Ln};
void**pc = code;
goto *pc++;
L1:
goto *pc++;
L2:
goto *pc++;
L3:
goto *pc++;
Ln:
goto *pc++;
VCで使えるようになればなあ・・
0053デフォルトの名無しさん
05/03/19 17:31:200054デフォルトの名無しさん
05/03/19 18:33:24配列もしくはそれに準じるデータ構造において、末尾要素に値域外の値を格納しておき、
反復処理時に終了判定を簡潔にする方法
0055デフォルトの名無しさん
05/03/19 21:23:28今の時代goto使ってる輩なんてアホ丸出し
0056デフォルトの名無しさん
05/03/20 02:32:45時代に無関係にgoto使う人間は使うのだよ
0057デフォルトの名無しさん
2005/03/21(月) 12:54:47おれはこういうの作ってるけど。
f() { //適当な関数
mem_t mem = memalloc(); //適当に確保したメモリ
handle_t handle = protect_attach(mem, memfree); // メモリを保護対象にする
//この区間でエラーが起きてもOK
mem = protect_detach(handle); // メモリ保護を解除する
memfree(mem); //メモリを開放
}
error_recv() { //エラー復帰処理
protect_rewind(); // ここでメモリを全て開放する
}
handle = protect_block(); // ブロックを保護対象にする
protect_attach(memalloc(), memfree);
protect_attach(memalloc(), memfree);
:
protect_rewind_block(handle);
でブロック単位で一気に開放したり。
0058デフォルトの名無しさん
2005/03/21(月) 13:00:53異論がないところだろうが、それはそれとしても >>52 の
使い方は上を行く阿呆。
0059デフォルトの名無しさん
2005/03/21(月) 13:10:37VMの実装とかではおなじみな手法だけど。
0060デフォルトの名無しさん
2005/03/22(火) 20:17:46阿呆ばっかりなのか。
0061デフォルトの名無しさん
皇紀2665/04/01(金) 02:12:50どこかで見かけたマクロ。
#define Case break; case
#define Default break; default
俺は真似したくないが…
0062デフォルトの名無しさん
皇紀2665/04/01(金) 09:06:50ダメすぎマクロの典型だなぁ。
そのマクロを使うことで、その技術者はどんどんダメになっていくという…
0063デフォルトの名無しさん
NGNG結城浩とか、そのシンパが使いそうだな
0064デフォルトの名無しさん
2005/04/20(水) 13:51:53みたいなのを作って、
switch(caseVal) {
CASE_EXEC(1, func1());
CASE_EXEC(2, func2());
}
こんなのはどうだろう。
0065デフォルトの名無しさん
2005/04/20(水) 14:03:09どうだろうって、ダメダメに決まってるじゃないか。
0066デフォルトの名無しさん
2005/04/20(水) 18:59:52Windowsのメッセージクラッカがそんなことをやっている。
WindowsX.hのHANDLE_MSGマクロがそう。
メッセージごとに関数の引数を変えられるよう、さらにHANDLE_WM_〜ってマクロを呼ぶようになっているが。
0067デフォルトの名無しさん
2005/04/20(水) 21:03:19windowsx.h のマクロは SelectBitmap とか結構使ってるけど
メッセージクラッカは使ってないな。
どうもしっくりこなくて。
0068デフォルトの名無しさん
2005/04/20(水) 21:18:450069デフォルトの名無しさん
2005/04/21(木) 12:25:550070デフォルトの名無しさん
2005/04/22(金) 23:44:34大丈夫!
0071デフォルトの名無しさん
2005/12/17(土) 06:10:290072デフォルトの名無しさん
2005/12/17(土) 17:43:59これがプログラミングの正義だ。そうだな?
これまでにもハッカーは幾度となくprintfを改良し続け
ついにgccはコンパイル時にフォーマット引数を解析するまでに至った。
20世紀も末の事だ。
その日からだ。俺らは、街中で「lisp makes love'n'piece!」と叫んでも
なんら恥ずかしくは無くなった。
この成長は何によるものか?
愛があったからだ。
決してベラルーシの放射能混じりの、質の悪い "ベヴンズ・ブルー" のおかげでは /無い/。
# 新橋のイラン人め、妙なモノを売りつけやがって!告訴してやる!
そしたら、分かるだろ?
もうバッファがあふれるとかあふれないとか、そういう問題じゃない。な?
ゼロ除算は萌え。な?
バグは見えるもんじゃない。「魅せる」もんだって事だ。
0073デフォルトの名無しさん
2005/12/20(火) 03:24:22金が絡むと責任問題に発展するわ仕舞いにゃ人死にも出る
そのプログラム上でどれだけの金が動くか、
バグ1つにどれだけ金の重みが加わるか、
所詮それだけよ
0074デフォルトの名無しさん
2006/01/23(月) 16:03:43どっかでバッファオーバーフローしてるのを探すのは非常に大変。
入力するデータによってはバッファオーバーフローしてても正常な
出力が得られる場合もあって、これで見逃したりして非常に嫌だ。
漏れはこのせいで一日中デバッグにあたったことがある。
0075デフォルトの名無しさん
2006/01/23(月) 19:02:450076デフォルトの名無しさん
2006/05/27(土) 01:42:250077デフォルトの名無しさん
2006/06/07(水) 23:12:58ユーザーにもアミとか出して迷惑かけた。
0078デフォルトの名無しさん
2006/07/24(月) 20:59:54/ ::::::::::::::::\
. | ,,-‐‐ ‐ -、 .:::|
| 、_(・)_,: _(・)_, :::|
. | ::< .::|
\ / − ヽ ::/
/`ー‐--‐‐―´\
0079デフォルトの名無しさん
2006/08/22(火) 00:08:57とある関数内で、変数の名前を変えることにした。なお、その関数は10行もない。
だが、1箇所変数の名前を変え忘れていた。実は元の変数名はとあるグローバル変数にも使われていた。
そのためエラーにならずコンパイルできてしまい……。
書いてから思った、Cでなくても同じことやらかすことはできるなと。
以上チラシの裏。
0080デフォルトの名無しさん
2006/08/22(火) 02:20:26まして、グローバル変数には意図的に長い名前をつけるくらいで丁度いい。
0081デフォルトの名無しさん
2006/09/26(火) 09:16:360082縺ク縺ェ縺。繧�% ◆krMXIQvIwY
2006/09/26(火) 09:20:340083へなちょこ ◆krMXIQvIwY
2006/09/26(火) 09:27:440084へなちょこ ◆Rhvbchu7bg
2006/09/26(火) 12:04:380085へなちょこ ◆krMXIQvIwY
2006/09/26(火) 19:27:17>11
>>111
0086デフォルトの名無しさん
2006/09/27(水) 06:10:440087デフォルトの名無しさん
2006/10/12(木) 13:17:060088デフォルトの名無しさん
2006/10/13(金) 09:39:02実行出来ません。誰かどうしてか教えて
#include<stdio.h>
#include<stdlib.h>
void initialize(int i,int j,int L,int grid[][L]); //initializes all the grids to zero.
main()
{
int L,p;
int i,j;
int grid[L][L];
printf("linear size of the square lattice L:->");
scanf("%d",&L);
printf("occupation probability p:->");
scanf("%f",&p);
initialize(i,j,L,grid);
}
void initialize(int i,int j,int L,int grid[][L]){
for(i=0;i<L;i++){
for(j=0;j<L;j++){
grid[i][j]=0;
}
}
return;
}
0089デフォルトの名無しさん
2006/10/13(金) 10:30:230090デフォルトの名無しさん
2006/10/13(金) 10:55:28>コンパイル出来るけど
またまたご冗談を (AA略
0091デフォルトの名無しさん
2006/10/13(金) 20:20:230092デフォルトの名無しさん
2006/10/13(金) 23:45:42http://i-bbs.sijex.net/imageDisp.jsp?id=test&file=1160750139347o.jpg
この画像の黒い画面の一番右下のように表示されてしまいます
整数A:0
整数B:1
整数C:2
で0を出力させたいんだがわけのわかんない数字(ここでいうと整数Aは0の前の2、Bは1の前の2280676など)
が出てしまいます。しかもコノ場合0ではなく1が出力されてしまいます。
原因不明なのでどうか教えていただけないでしょうか?
#include <stdio.h>
int main (void){
int x,y,z;
int min; /*minは最小値*/
printf("3つの整数を入力してください。");
printf("整数A:%d");scanf("%d",&x);
printf("整数B:%d");scanf("%d",&y);
printf("整数C:%d");scanf("%d",&z);
min = z;
if (x < z) min = x;
if (y < z) min = y;
printf("最小値は%dです。\n",min);
return(0);
}
0093デフォルトの名無しさん
2006/10/13(金) 23:53:36最小値の求め方も間違ってる。
あと>>1読め。
#include <stdio.h>
int main (void){
int x,y,z;
int min; /*minは最小値*/
printf("3つの整数を入力してください。");
printf("整数A");scanf("%d",&x);
printf("整数B");scanf("%d",&y);
printf("整数C");scanf("%d",&z);
min = z;
if (x < min) min = x;
if (y < min) min = y;
printf("最小値は%dです。\n",min);
return(0);
}
0094デフォルトの名無しさん
2006/10/13(金) 23:59:49スレ違いごめんなさい。あとすぐ教えてくれて有難う御座います!
いつもprintfの使い方が違ったからバグってたのか・・・。
使い方もちょっとおかしかったですねorz
これからは注意深くいきていきます
まじ感謝です!
0095デフォルトの名無しさん
2006/10/14(土) 11:18:20リンク以前に(狭義の)コンパイルができない
■ このスレッドは過去ログ倉庫に格納されています