1 名前:デフォルトの名無しさん mailto:sage [2017/10/10(火) 00:11:34.01 ID:nc/5PI4P0.net] 次スレを立てる時は本文の1行目に以下を追加して下さい !extend:on:vvvvv:1000:512 C++に関する質問やら話題やらはこちらへどうぞ。 ただし質問の前にはFAQに一通り目を通してください。 IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。 前スレ C++相談室 part131 mevius.2ch.net/test/read.cgi/tech/1501295308/ このスレもよろしくね。 【初心者歓迎】C/C++室 Ver.101【環境依存OK】 mevius.2ch.net/test/read.cgi/tech/1500329247/ ■長いソースを貼るときはここへ。■ codepad.org/ https://ideone.com/ [C++ FAQ] https://isocpp.org/wiki/faq/ www.bohyoh.com/CandCPP/FAQ/ (日本語) VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured
477 名前:デフォルトの名無しさん mailto:sage [2017/11/06(月) 12:13:38.44 ID:FJG0yfiKd.net] >>465 C++ならできるだろうけどCだとできる...?
478 名前:デフォルトの名無しさん mailto:sage [2017/11/06(月) 21:05:16.36 ID:7ntrKCQE0.net] >>471 https://ideone.com/ZfcWrq こういうイメージだな。 C久々に触ったわ。メモリ回りはおまじないが多いのでこわいよ〜。
479 名前:はちみつ餃子 mailto:sage [2017/11/06(月) 21:12:28.45 ID:MXn0CmOw0.net] >>472 どうしても記法を再現しようとするとそうなるだろうけど、 メモリを無駄にして割に合うのかっていうとだいぶん疑問ではあるよな。
480 名前:デフォルトの名無しさん mailto:sage [2017/11/06(月) 21:14:53.41 ID:7ntrKCQE0.net] >>473 まぁ、折衷案で関数群とデータで分けるとかね。 一応継承紛いなこともできなくないし。
481 名前:デフォルトの名無しさん mailto:sage [2017/11/06(月) 22:45:43.65 ID:r9+CDuOfM.net] >>471 glibを真似たらいいよ。
482 名前:デフォルトの名無しさん [2017/11/06(月) 22:51:39.40 ID:z+KG8ZZn0.net] 記法を似せたいだけならともかく、関数ポインタを使うところはC++でいうところのvirtual functionでそれをクラスのIFとするのはC++でもめったにやらんわな。
483 名前:デフォルトの名無しさん mailto:sage [2017/11/06(月) 23:44:50.11 ID:SClVOYaP0.net] COM(Component Object Model)はC++及びCでバイナリ互換のオブジェクトを作ることが出来る vtblの配置は言語仕様上は定められていないが、MSがCOM(OLE2)を実装するにあたって定めた配置にしている処理系が殆どだ
484 名前:デフォルトの名無しさん mailto:sage [2017/11/07(火) 02:44:04.83 ID:5kOZtFPy0.net] BisonでC語風の言語作ってるのですが、代入の構文が衝突してしまい困っています。 bison.yy: conflicts: 5 shift/reduce *の回数を記録、Identifier = expression という構文を作りたいのですが、いい方法ありませんか? *の検出はC語風のポインターを使うための処理です。 assignList : assign {$$=new StatementAssignList($1);} |assignList assign {$$=$1->add($2);} ; assign : Identifier '[' expression ']' "=" expression {$$=new StatementAssignVariable($1,$3,$6);} // 変数に代入:名前[式]=式; | Identifier "=" expression {$$=new StatementAssignVariable($1, 0,$3);} // 変数に代入:名前=式; | "*" {$$=new StatementAssignPtr();} ; class StatementAssignList : public Statement{ public: std::vector<Statement *>m_list; ~StatementAssignList(){for(auto &p
485 名前::m_list) delete p;} StatementAssignList(Statement*pStatement){m_list.push_back(pStatement);} StatementAssignList *add(Statement *pStatement){m_list.push_back(pStatement);return this;}; } 現在は、m_listで、StatementAssignPtr()の個数を調べてStatementAssignVariableの処理につなぐことを考えてます。 [] [ここ壊れてます]
486 名前:デフォルトの名無しさん mailto:sage [2017/11/07(火) 04:38:27.99 ID:PQkUnwQq0.net] >>478 expressionがどうなってるのか知らないけどその文法だと a=expr * a=expr * * みたいに書けてしまうけど良いのか? 「左辺に書けるもの」を分けて整理すべし C言語風ならC言語の文法を参考にしてもいいと思うけど
487 名前:デフォルトの名無しさん mailto:sage [2017/11/07(火) 05:07:39.94 ID:5kOZtFPy0.net] アドバイスありがとうございます。 expressionは、 =禁止していますので、a = expr*a=expr * * は出来ないようにしてます。 手動で*の数を記述してみたのですが、conflicts: 3 shift/reduce となって混乱してます。 こんな感じ。。StatementAssignVariable()の第一引数を *の数にして実験。 statement : Identifier "=" expression {$$=new StatementAssignVariable(0, 省略); } | "*" Identifier "=" expression { $$= new StatementAssignVariable(1, 省略); } | "*" "*" Identifier "=" expression { $$= new StatementAssignVariable(2, 省略); } ; gcc 3はbisonのソース有ったので見たのですが、難解でしたorz 構文の設計ムズカシイ conflicts: 3 shift/reduce無視しちゃっていいのかなぁ。。
488 名前:デフォルトの名無しさん [2017/11/07(火) 05:27:52.17 ID:2eQgtTM30.net] > コンパイル時にエラーは出ないし、プログラムも実行できるけど、プログラムの終了時にエラー スタック破壊の典型的な症状だな
489 名前:デフォルトの名無しさん mailto:sage [2017/11/07(火) 07:17:12.36 ID:PQkUnwQq0.net] >>480 いや、assignListはassignの1以上の繰り返しで、assignは identifier [ expression ] = expression identifier = expression * のどれでも良いのだからassignListは a=b * a=b * * a[b]=c * みたいにassignを自由な順番で書けてしまうよね? おそらくexpressionに2項の乗算が入ってるでしょ それでセミコロンで区切らない文法とか? a = b の次に*が来たときに乗算の右辺を待つ状態へshiftするか、それともa=bをreduceして次の代入文へ移るかが曖昧なのだと思う 常にshift(乗算優先)が望みなら無視してもいいけど、 a=b *c=d (代入二つ)とは書けなくなるかな
490 名前:デフォルトの名無しさん mailto:sage [2017/11/07(火) 09:38:50.61 ID:Nwc3R7kX0.net] >>481 あれから少し調べてみたけど、クラスを使わない、このプログラムでもエラーが出ることが分かりました またnumの値によっても変わるみたいで、このプログラムの場合はnumを3805まで減らすとエラーが出なくなります (昨日のプログラムの場合は、また別の値だったと思うけど) エラーが出るのはIDE上で動かした場合だけで、プログラム単体で動かした場合はエラーが出ないからIDEの不具合なのかな? マイクロソフトに報告するべき? #include <iostream> #include <conio.h> using namespace std; #define num 5000 int main() { int** ppa = new int*[num]; for (int i = 0; i < num; i++) ppa[i] = new int; for (int i = 0; i < num; i++) delete ppa[i]; delete []ppa; cout << "hit any key!" << endl; char ch = (char)_getch(); return 0; }
491 名前:デフォルトの名無しさん mailto:sage [2017/11/07(火) 09:48:51.30 ID:Nwc3R7kX0.net] >>483 すみません、再確認したらnumの数を減らせば出なくなるというのは間違いです ただ、出にくくなっているような気はするけど
492 名前:デフォルトの名無しさん mailto:sage [2017/11/07(火) 16:23:51.40 ID:5kOZtFPy0.net] >>482 再帰的下向きコンパイラ見たいな構造で、expressionに、乗算2つ入ってます。 %prec を排除して文法作ってましたが、曖昧な表現が衝突の原因っぽいですね。 文法修正してみます。ありがとうございました。 expression : term1 | expression "||" term1 {$$=省略;} ; term1 : term2 | term1 "&&" term2 {$$=省略;}; 省略 ... term7 : term8 | term7 '+' term8 {$$=省略;}; term7 '-' term8 {$$=省略;}; term8 : factor | term8 '*' factor {$$=省略;} | term8 '/' factor {$$=省略;} | term8 '%' factor {$$=省略;} factor: '-' factor {$$=省略} // -xxの時 NEGの処理 | '*' factor {$$=省略;} // *xxの時 ポインターの処理 | '(' expr '){ $$ = $2; } // () | func // 関数呼び出し | value // 変数 | number { $$ = $1; }// 数値 ;
493 名前:はちみつ餃子 mailto:sage [2017/11/07(火) 21:03:50.18 ID:t2a48+le0.net] >>477 C++ 用の宣言と C 用の宣言がマクロで分岐するようになってるのを読んだことが有るんだけど、 C++ で引数を参照で渡してるやつが C ではポインタになってて、 それってバイナリレベルでは互換性があるんだ〜と思ったことがある。
494 名前:デフォルトの名無しさん mailto:sage [2017/11/07(火) 21:13:18.56 ID:LIKWanez0.net] >>483 _getchあやしくね? cin.get(); に変えてみたら?
495 名前:デフォルトの名無しさん mailto:sage [2017/11/07(火) 21:59:05.61 ID:5kOZtFPy0.net] >>483 試しにvs2015とvs2017で動かしてみたんですが、正常に動きますよ?デストラクタ確認でちゃんと動作してるみたいです。 ch = (char)_getch(); ってとこは書き換えて、getchar(); にしましたが。。 #include <iostream> #include <conio.h> using namespace std; #define num 5000 void test1() { int ** ppa = new int *[num]; for (int i = 0; i < num; i++) { ppa[i] = new int; } for (int i = 0; i < num; i++) delete ppa[i]; delete[]ppa; cout << "hit any key!" << endl; } class MyInt { public:int n; MyInt(int i) :n(i) {}~MyInt() { printf("~MyInt %d\n", n); } }; void test2() { MyInt ** ppa = new MyInt *[num]; for (int i = 0; i < num; i++) { ppa[i] = new MyInt(i); } for (int i = 0; i < num; i++) delete ppa[i]; delete[]ppa; cout << "hit any key!" << endl; } int main(){ test1();test2(); //共に普通に動作確認済み getchar();return 0; }
496 名前:デフォルトの名無しさん mailto:sage [2017/11/07(火) 22:01:54.27 ID:aP9yM4om0.net] 結論。Newすんな。ベクタ使え。
497 名前:デフォルトの名無しさん mailto:sage [2017/11/08(水) 00:05:45.23 ID:b+QUYReX0.net] 伸び縮みしないんだったらunique_ptrで十分じゃん
498 名前:デフォルトの名無しさん mailto:sage [2017/11/08(水) 00:17:24.11 ID:NuL34q9d0.net] >>483 ウィルスバスターのdllでエラーならMSに言っても意味ないんじゃないか。 デバッガがアタッチされてるとウィルスバスターのdllがおかしなことして起きるってことじゃないの?
499 名前:デフォルトの名無しさん [2017/11/08(水) 06:08:53.08 ID:Qxc+LNev0.net] ウイルスバスターが干渉しているっぽいなら VirtualBoxでウイルスバスターのない仮想環境を作って その中で動かしてみればええやん
500 名前:デフォルトの名無しさん mailto:sage [2017/11/08(水) 06:30:19.02 ID:pFtekju40.net] セキュリティソフトを動かしていたら、多くのアプリは、正常に動かない 多くのアプリの説明書に、そう書いてある
501 名前:デフォルトの名無しさん mailto:sage [2017/11/08(水) 07:29:57.54 ID:/yzKqtBG0.net] >>487 cin.get(); とgetchar() もやってみたけど同じでした >>488 ウィルスバスターはインストールされているでしょうか? エラーを出すのがウィルスバスターなので、ウィルスバスターの入っている環境じゃないと出ないようです >>489 vector使ってみたけど同じでした。今までvectorってあまり使ったことなかったけど、これからはvectorを使うことにしよう int main() { vector< vector<int> > ppa; ppa.resize(5000); for (int i = 0; i < 5000; i++ ) ppa[i].resize(20); cout << "hit any key!" << endl; char ch = (char)_getch(); return 0; } >>490 実際のプログラムでは伸び縮みします >>491 そうですね、ウィルスバスター側の問題かもしれない。トレンドマイクロに問い合わせしてみようかな? >>492 ウィルスバスターを終了した状態ではエラーは出ないことは確認しています ただ、visual studioとウィルスバスターのどちら側に問題があるかは分からないけれども >>493 そうですね、でもウィルスバスターを止めるわけにもいかないので とりあえず、プログラムを最後まで実行させなければ問題ないので、IDEから強制終了することで対応しようと思います。 プログラム単体で実行したときはエラーは出ないので
502 名前:デフォルトの名無しさん mailto:sage [2017/11/08(水) 08:02:44.81 ID:pFtekju40.net] 多くのアプリの説明書に、 「セキュリティソフトを動かしていたら、正常に動きません」 って書いてあるけど、何でだろ?
503 名前:デフォルトの名無しさん mailto:sage [2017/11/08(水) 08:10:49.38 ID:MA4CFapNd.net] 多くのアプリがウィルスみたいなものだから
504 名前:デフォルトの名無しさん mailto:sage [2017/11/08(水) 09:33:37.02 ID:tfdQ3Vx70.net] セキュリティソフトは潜在バグを顕在化する事が往々にしてある
505 名前:デフォルトの名無しさん mailto:sage [2017/11/08(水) 10:25:00.80 ID:s/8N4dfn0.net] 事情は知らんが開発中はウィルスバスター止めるとか>>467 の方法で問題あるのか? IDEから強制終了とかクソ面倒くさいことやってられんだろ
506 名前:デフォルトの名無しさん mailto:sage [2017/11/08(水) 10:27:07.11 ID:pfXJjTar0.net] OSの設定に干渉するようなモノはウイルス判定されることがあり得るでしょ。 それが善意かどうかなんて判定のしようがない。
507 名前:デフォルトの名無しさん mailto:sage [2017/11/08(水) 10:29:43.39 ID:s/8N4dfn0.net] もしかしてウイルスを作ってるのか?
508 名前:デフォルトの名無しさん [2017/11/08(水) 12:29:57.54 ID:/2nLdTDi0.net] >>499 ウイルス判定したならただクラッシュさせて放置じゃなくてアンチウイルスソフトとしての仕事しろよ。 ただウイルスバスターがクソなだけだろ。
509 名前:はちみつ餃子 mailto:sage [2017/11/08(水) 13:26:26.66 ID:xvDlz0If0.net] ウイルスと判定したわけじゃなくて、判定するために干渉した結果としてそうなる場合がある。 コンソールアプリを起動しようとした場合に、一旦サンドボックス的なものの中で起動させてチェックして 直後にあらためて普通に起動するというのを見たことがある。 今回の場合、そのコンソールアプリを起動している VS の状況と噛み合わなくなっているのだと思う。 チェックのために何かしら介入しなきゃならないのはしょうがないのだが、 泥臭い、クソみてぇなことの塊なので、まじめに検証するのアホらしいぞ。
510 名前:488 mailto:sage [2017/11/08(水) 15:52:55.19 ID:8BP79/0I0.net] >>494 カスペルスキーの環境だと問題ないみたいですぜ。例外とかの設定もしてません。 バスターは入れてないです。
511 名前:デフォルトの名無しさん [2017/11/08(水) 16:01:14.63 ID:VRSOCYqCd.net] いまどきクライアントにはウィルス対策ソフトなんて入れないのが主流だと思ってたけど、 そうでもないのかな
512 名前:デフォルトの名無しさん mailto:sage [2017/11/08(水) 16:44:23.86 ID:XvbXwAqY0.net] 上の現象見ただけでも信用ならんと分かりそうなものだがなあ。
513 名前:デフォルトの名無しさん mailto:sage [2017/11/08(水) 18:24:45.85 ID:pfXJjTar0.net] Win10ならディフェンダーはいってるけど、前のOSとかなら入れるのか?
514 名前:デフォルトの名無しさん mailto:sage [2017/11/08(水) 19:40:45.83 ID:GPQLPiKHM.net] >>506 XPの時からディフェンダーだわ
515 名前:デフォルトの名無しさん mailto:sage [2017/11/08(水) 23:47:31.77 ID:NuL34q9d0.net] ノートンのプロセスが勝手にこっちのdllを読み込んあとおかしな状態でアンロードしてアクセス違反おこしてノートンのプロセスがクラッシュするってのはあった。 アンチデバッキングなのかユーザーモードデバッガではアタッチできないからカーネルデバッガやるしかなくて原因見つけるのに結構苦労した。
516 名前:デフォルトの名無しさん [2017/11/09(木) 00:57:17.32 ID:ej8qpLZc0.net] Virtual Studioは素人が購入することは考えにくい専門的なソフトだからウイルスバスターのターゲット外なんだよ。 つまりさっさとどっちか捨てろってこった
517 名前:デフォルトの名無しさん [2017/11/09(木) 02:17:02.22 ID:7vxmA4jM0.net] Visual Studioでアプリ作っててビルドしたてホヤホヤのプログラムをアヴィラ先生がウィルス認定しやがったのは過去に何度かあったわ
518 名前:デフォルトの名無しさん mailto:sage [2017/11/09(木) 07:51:39.95 ID:AsVSSCPV0.net] >>456 delete[] ppa; じゃないの
519 名前:デフォルトの名無しさん mailto:sage [2017/11/09(木) 08:51:49.76 ID:4HUgyouS0.net] >>498 >>467 の方法は、エラーの発生を無視しているだけで、実際にはエラーが発生している可能性があるので >>500 そんなスキルはないですw >>503 ウィルスバスター側が悪さしている可能性もあるんですかね せめてVisual Studioとウィルスバスターのどっちが悪いのかわかればいいんだけど >511 >>483 でdelete[] ppa;にしてみたけど、同じでした
520 名前:デフォルトの名無しさん mailto:sage [2017/11/09(木) 11:01:44.29 ID:Obd3aNBj0.net] ウィルスバスターはエラー検出ツールじゃないし無視でいいよ リソース関連のエラー検出したいならそれなりの検出ツール使うとか静的解析ツール使うとか
521 名前:デフォルトの名無しさん mailto:sage [2017/11/09(木) 12:14:59.98 ID:rcuqnank0.net] ウィルスバスターミナルとかトーシローかよw プログラムの仕組み知り尽くしていればまずウィルスなんかに引っ掛からないだろw
522 名前:デフォルトの名無しさん mailto:sage [2017/11/09(木) 12:33:16.70 ID:YfcqoN+X0.net] 教えてくれよ
523 名前:デフォルトの名無しさん mailto:sage [2017/11/09(木) 18:45:17.95 ID:+zZRkuiLd.net] 入力したコマンドを別関数に渡して結合してリターンして表示するってコードを作りたい mainの中のusrとpassは実体もあるから受け渡し含めて問題ないと思うのだけど、 mainのcRetとgetcommandのcommandってどう定義するべきなのだろうか? 動くのは動くのだけど二つとも実体どこー?ってなってます #include <stdio.h> #include <stdlib.h> GetCommand( const char* usr, const char* pass ){ char* command; /** コマンド作成 **/ sprintf( command, "-u %s:%s", usr, pass ); return command; } int main( int argc, char* argv[] ){ char* cRet; char usr[256] = {}; char pass[256] = {}; /** アカウント名の入力 **/ printf("usr Input : "); scanf("%s", usr ); /** パスワードの入力 **/ printf("pass Input : "); scanf("%s", pass ); cRet = GetCommand( usr, pass ); printf( "%s\n", cRet ); return 0; }
524 名前:片山博文MZ mailto:sage [2017/11/09(木) 18:49:41.22 ID:lJJATczwd.net] GetCommand関数のcommand変数をstaticなバッファーにするか、おとなしくstd::stringを使うか、GetCommandにバッファーへのポインターに渡すか。
525 名前:デフォルトの名無しさん mailto:sage [2017/11/09(木) 18:53:06.50 ID:+zZRkuiLd.net] >>517 このままのリターン形式だとstaticなバッファー作成しか方法ないってことですよね
526 名前:片山博文MZ mailto:sage [2017/11/09(木) 18:56:36.56 ID:lJJATczwd.net] >>518 いや、malloc や、newもあり得る。だれが解放するかは問題だが。
527 名前:片山博文MZ mailto:sage [2017/11/09(木) 19:22:58.90 ID:lJJATczwd.net] グローバル変数のバッファーを使うこともできる。
528 名前:デフォルトの名無しさん mailto:sage [2017/11/09(木) 20:43:21.98 ID:+zZRkuiLd.net] 考えてみるとバグの温床になりかねんね 単純に格納先の変数を用意して引数に渡すべきだとなった
529 名前:デフォルトの名無しさん mailto:sage [2017/11/09(木) 21:06:06.24 ID:HS5Oh82mM.net] >>521 C言語ならな C++なら>>517 の言う通りおとなしくstd::string使えよ
530 名前:デフォルトの名無しさん mailto:sage [2017/11/09(木) 21:22:58.42 ID:+zZRkuiLd.net] >>522 そやね プロシージャとファンクションの考え方からファンクションにしたいのに 戻り値じゃないってのも変だ string全然使ったことないけど使うことにする
531 名前:はちみつ餃子 mailto:sage [2017/11/09(木) 22:21:05.91 ID:LSUga0nM0.net] コマンドラインオプションで受渡した方がやりやすいような気もしないでもない。
532 名前:デフォルトの名無しさん [2017/11/10(金) 05:13:52.89 ID:7MRV7tWB0.net] こういう内容でstring使わないとか 超のつくマゾプレーだな
533 名前:デフォルトの名無しさん [2017/11/10(金) 06:24:08.16 ID:wxME+cIA0.net] ってかCの質問やんけ
534 名前:デフォルトの名無しさん mailto:sage [2017/11/10(金) 06:45:56.53 ID:AkYkb8w90.net] sprintfは領域確保しないでしょ。こういうのがCは危ない。
535 名前:デフォルトの名無しさん mailto:sage [2017/11/10(金) 07:58:16.79 ID:P63PhvFd0.net] >>513 たしかにウィルスバスターをエラー検出ツールとして使うのは、おかしいですね >>467 の方法でdevenv.exeが置いてあるIDEというフォルダと、自分のプログラムが置いてあるフォルダを ウィルスバスターの例外処理に入れたら、気持ちが悪いぐらいにまともに動くようになりました みなさん、ありがとうございました
536 名前:デフォルトの名無しさん [2017/11/11(土) 06:46:03.41 ID:PUzdOh0e0.net] >516 1.間違い1 char* command; /** コマンド作成 **/ sprintf( command, "-u %s:%s", usr, pass ); ここが間違いで、sprintfを使う時には、かならず char commad[256]; のように適当に多めにエリアを確保すること、256バイト確保しておけばメモリーをはみ出すことはまずない。 上の例ではcommandには何が入っているか不定だから、例えば0が入っていたら、メモリーの0番地に usr,passを書き込んでしまう。だから普通はsprintを行った後で暴走する。 2.間違い2 char commad[256]; このように変更するとGetCommandは正常に動作するが、このcommandはスタックに確保されたメモリー なのでGetCommandを終了すると、解放されて不定になる。したがってreturn command;はしては いけない。 3.正しいやりかた メモリエリアを確保して、それをGetCommnadに渡すのもありだが、引数が増えるので内部で確保してリターン したいのであれば、memory確保する関数を用意してそこに書き込む。確保したエリアは使い終わったら 自動的に開放できる仕組みにしておく。 char *command = getarea(256);
537 名前:デフォルトの名無しさん mailto:sage [2017/11/11(土) 06:58:56.29 ID:qx0Cuc+s0.net] 256バイト確保しておけばメモリーをはみ出すことはまずない。とかw 文字列連結してるだけなんだから全部std::stringでやればいいだけだよ
538 名前:デフォルトの名無しさん mailto:sage [2017/11/11(土) 07:10:37.49 ID:5AYGw8xA0.net] >>516 ていうかc言語初心者のところで聞けよ その池沼レベルのソースコードだとここでは晒しものの血祭りになるだけだぞ
539 名前:デフォルトの名無しさん [2017/11/11(土) 08:19:33.64 ID:PUzdOh0e0.net] >文字列連結してるだけなんだから全部std::stringでやればいいだけだよ さてもしかりに char commad[256000]; このくらい十分に確保できたらstringとどっちがあんぜんだろうか? 先ずはstringを使った方がいいと主張する理由を説明できないとな。 「やればいいだけだよ」って誰かがいってたから、という受け売りの信仰ではだめだな。
540 名前:デフォルトの名無しさん mailto:sage [2017/11/11(土) 08:23:18.59 ID:qQheN6bd0.net] >>532 それでもstd::stringのが安全 根本的に考え方が古すぎる
541 名前:デフォルトの名無しさん mailto:sage [2017/11/11(土) 08:40:17.35 ID:FtIHrpnF0.net] >>533 外部からの長さ無制限の文字列を受け付けるプログラムというのもセキュリティー上問題がある バッファオーバーフローで即exploitされることは無いが時間をかければクラッシュを引き起こせる というわけで長さ制限はどこかの時点で必須なのでassertionをOFFにしたsprintf_s()さいこー
542 名前:デフォルトの名無しさん mailto:sage [2017/11/11(土) 08:42:08.74 ID:qx0Cuc+s0.net] >>532 くだらなすぎて返す言葉もないです すみません
543 名前:デフォルトの名無しさん [2017/11/11(土) 08:46:05.02 ID:JauW0Lbxd.net] スタックオーバーフロー起こしそう
544 名前:デフォルトの名無しさん mailto:sage [2017/11/11(土) 08:58:22.67 ID:VdKe4lXM0.net] >>532 スタックが無駄。
545 名前:デフォルトの名無しさん mailto:sage [2017/11/11(土) 08:59:35.86 ID:FtIHrpnF0.net] ていうかstd::stringにお任せしておけばデータサイズの管理が不要とか池沼の考え 何文字でも受け付けるとかいうのはテストしようが無いからまともな仕様ではない よってまともな設計は不可能
546 名前:デフォルトの名無しさん mailto:sage [2017/11/11(土) 09:01:47.94 ID:VdKe4lXM0.net] 常識的な範囲で受け入れてくれればよい。 それを行うことで何をしたいのかが見えないなぁ。
547 名前:デフォルトの名無しさん mailto:sage [2017/11/11(土) 09:03:17.54 ID:FtIHrpnF0.net] 手前の常識がクライアントの常識と思い込むのは池沼のry
548 名前:デフォルトの名無しさん mailto:sage [2017/11/11(土) 09:06:15.75 ID:FtIHrpnF0.net] つか>>537 もかなり問題発言 スタックは関数を抜けたら開放されるのだから、 スタック領域を使い果たさないように設計された関数ならスタックをいくら使うかは関数の勝手 ここでも「スタックの消費は少ないほうが良い」という手前の常識が
549 名前:デフォルトの名無しさん mailto:sage [2017/11/11(土) 09:06:43.21 ID:VdKe4lXM0.net] じゃあ、君はメモリが確保できないことをどう説明するんだい? スタック大量に確保したら余計引っかかるぞ。
550 名前:デフォルトの名無しさん mailto:sage [2017/11/11(土) 09:10:47.99 ID:VdKe4lXM0.net] 本質は同じ。瞬間メモリ使用量の問題だからな。 少ない方がイイに決まって無いかい?
551 名前:デフォルトの名無しさん mailto:sage [2017/11/11(土) 09:17:19.24 ID:FtIHrpnF0.net] >>542 スレッド生成時にそのスレッドが使えるスタックは一般に割り当てが完了するから、 割り当てられた領域をオーバーしなければどう使っても良い もちろんフルに使ってもヒープの圧迫にはならない スタックが伸びれば伸びただけヒープ用メモリ領域を圧迫するとか ごく一部の超ロースペックな組み込み環境(スタックがただ1本だけ=スレッドが1個だけ)限定の話じゃないの; プログラムのメモリの使い方について一体どんな理解をしているのか;;
552 名前:デフォルトの名無しさん mailto:sage [2017/11/11(土) 09:22:37.81 ID:VdKe4lXM0.net] >>544 じゃあnewしても問題なく確保できるじゃないか。 クライアントが不足の文字数ブッコンで落ちるよりはいいと思うけどね。 あと、ほかがヒープ食っててスタック確保できないケースはないの? なんでもヒープにキックする人嫌い。
553 名前:デフォルトの名無しさん mailto:sage [2017/11/11(土) 09:23:01.72 ID:FtIHrpnF0.net] >>543 std::string経由でヒープ上にchar commad[256000];を確保する方が スタック上にchar commad[256000];を確保するより常に優れた設計であるという根拠は?
554 名前:デフォルトの名無しさん mailto:sage [2017/11/11(土) 09:25:34.33 ID:VdKe4lXM0.net] >>546 仕様が提示されてないから。250kbも使う保証がない。 なら、std::stringがchar command[256000]と確保するのは優れてるの? 折衷案なだけじゃない?
555 名前:デフォルトの名無しさん mailto:sage [2017/11/11(土) 09:26:29.15 ID:FtIHrpnF0.net] >>545 藻前は文字数ブッコンでエラーを返すことと文字数ブッコンで落ちることの意味の違いの重大さがわかっていない 漏れは終始エラーを返すことを目指した発言をしてゐる
556 名前:デフォルトの名無しさん mailto:sage [2017/11/11(土) 09:27:27.12 ID:VdKe4lXM0.net] >>548 あそー。 確保できなかたらSIZEは0になるから、ほとんどの処理は通らないようにエラー処理はできる。
557 名前:デフォルトの名無しさん mailto:sage [2017/11/11(土) 09:29:57.09 ID:VdKe4lXM0.net] c++には例外もアルヨ。
558 名前:デフォルトの名無しさん mailto:sage [2017/11/11(土) 09:40:15.26 ID:VdKe4lXM0.net] 化石か!
559 名前:デフォルトの名無しさん mailto:sage [2017/11/11(土) 09:42:44.46 ID:FtIHrpnF0.net] >>547 なんか文字数の上限仕様が提示されたらスタック上に取るほうが良いと言ってねえが?まあ一般にそれで良いのだけども >>549 メモリ不足チェックと文字数チェックを混同するのは池沼のry メモリ不足はさまざまな要因が重なった結果起きる現象なので 「入力Xを与えたらメモリ不足でクラッシュする」という仕様はありえない (入力とメモリ不足との関係は、一般に再現性のある形ではテスト仕様に組み込めない 一方、「文字数n未満の入力Xはエラーとする」という仕様ならアリで 再現性のあるテストケースも書けてバッファとしてとるべき配列サイズも計算できる(きちんと設計しているなら
560 名前:デフォルトの名無しさん mailto:sage [2017/11/11(土) 09:44:02.22 ID:FtIHrpnF0.net] >>552 訂正スマンorz 誤: 文字数n未満の入力Xはエラーとする 正: 文字数nを超過した入力Xはエラーとする
561 名前:デフォルトの名無しさん mailto:sage [2017/11/11(土) 09:46:24.25 ID:VdKe4lXM0.net] >>552 ロースペックじゃないコンピュータつかってるんだろ? 非常識な文字数入れられたらはじくなんて別に難しくないだろ。 スペックわかってるんだったらなおさら。
562 名前:デフォルトの名無しさん [2017/11/11(土) 09:47:59.39 ID:atpFEB620.net] スタックに充分な領域を確保したから大丈夫って頭おかしい設計だわ
563 名前:デフォルトの名無しさん mailto:sage [2017/11/11(土) 09:49:50.67 ID:FtIHrpnF0.net] >>554 文字数チェック不要と考えているかもしれない>>530 とかに言うべき
564 名前:デフォルトの名無しさん mailto:sage [2017/11/11(土) 09:54:01.12 ID:VdKe4lXM0.net] はいはい。もういいわ。 エラー処理真面目にやるんだったら、そういう方向で考えるけど。 ここではそんなに求められてない。一般感覚が無いとそれ何回もやるのか? 不適当で有名な5chでなにを演説してるのやら。
565 名前:デフォルトの名無しさん mailto:sage [2017/11/11(土) 09:58:28.19 ID:FtIHrpnF0.net] >>555 やみくもにスタック消費量最小を目指すのは、 自分の関数がどれぐらいスタック使うのかおよびスタック領域にどれぐらい余裕があるのか 見積もる手間を惜しんで手抜きしているだけな可能性が微レ存、 ていうか「スタックに充分な領域を確保した」というのが真なら(机上検証、レビュー、テストで担保できたなら 「大丈夫」という結論で何の問題も無いんじゃ…
566 名前:デフォルトの名無しさん mailto:sage [2017/11/11(土) 10:07:34.21 ID:WEOLmGSE0.net] >>544 スタック領域には当然上限があるが、常にその上限まで割り当てていたら無駄だろう。 LinuxもWindowsも必要に応じてページを割り当てる。
567 名前:デフォルトの名無しさん mailto:sage [2017/11/11(土) 10:17:10.01 ID:FtIHrpnF0.net] >>559 スタック領域を使い切るのが美徳とは言っていないわけでありまして、 なおかつページングの発生頻度は、メモリ消費箇所がスタックかヒープかの違いよりは 領域へのアクセス頻度の問題ではなかろうかと、
568 名前:デフォルトの名無しさん mailto:sage [2017/11/11(土) 10:35:02.95 ID:WEOLmGSE0.net] パフォーマンスの話じゃなくて、これが一般には正しくないって言ってるの。 >スレッド生成時にそのスレッドが使えるスタックは一般に割り当てが完了するから、 >割り当てられた領域をオーバーしなければどう使っても良い >もちろんフルに使ってもヒープの圧迫にはならない
569 名前:デフォルトの名無しさん [2017/11/11(土) 10:53:30.83 ID:opm7+oFX0.net] んでchar commad[256000];をどうやってリターンするんだ?
570 名前:デフォルトの名無しさん mailto:sage [2017/11/11(土) 11:07:32.64 ID:WYLE0xS1M.net] 普通ならstd::string使う char使いたい人は使えばいい おしまい
571 名前:デフォルトの名無しさん mailto:sage [2017/11/11(土) 11:11:42.29 ID:d7ebwqzc0.net] 256000という数字にセンスを感じるなあ
572 名前:デフォルトの名無しさん mailto:sage [2017/11/11(土) 11:50:48.17 ID:yWjpohs20.net] > char commad[256000]; しかも0が非ascii
573 名前:デフォルトの名無しさん [2017/11/11(土) 13:26:05.59 ID:cTWJmMx00.net] >>529 いや、commandを何バイト確保しておこうが snprintf() の方を使った方が良い。 https://linuxjm.osdn.jp/html/LDP_man-pages/man3/sprintf.3.html gcc で asprintf() 使ってもいいなら command は char * でも行ける(その代わり後でfree())。 https://linuxjm.osdn.jp/html/LDP_man-pages/man3/asprintf.3.html
574 名前:デフォルトの名無しさん mailto:sage [2017/11/11(土) 14:07:40.16 ID:x64hpPPQ0.net] scanf("%s"にツッコミなし!
575 名前:デフォルトの名無しさん mailto:sage [2017/11/11(土) 14:52:43.33 ID:cTWJmMx00.net] >>567 あまりに低レベルで目に入らんかったw
576 名前:デフォルトの名無しさん [2017/11/11(土) 17:48:20.77 ID:PUzdOh0e0.net] >んでchar commad[256000];をどうやってリターンするんだ? だからそれはstringでも同じだな。stringを使えばいいという発想では駄目ということだ。 メモリを確保する必要がある。 しかも、サブルーチンを抜けた後で、何処かでそれを解放する機構が必要だ。サブルーチンを抜けた 後だと自動で解放しない限りは解放する方法はない。つまり肝心なのは自動でメモリ解放機能が ついていることだ。それがついてないstringクラスなんてこの場合は全く使い道がないってことだ。 だからstringって馬鹿の一つ覚えを言うやつは間違いってことだね。
577 名前:デフォルトの名無しさん mailto:sage [2017/11/11(土) 18:01:59.33 ID:qx0Cuc+s0.net] 頭おかしい