C++相談室 part132

■ このスレッドは過去ログ倉庫に格納されています
2017/10/10(火) 00:11:34.01ID:nc/5PI4P0
次スレを立てる時は本文の1行目に以下を追加して下さい
!extend:on:vvvvv:1000:512

C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。

前スレ
C++相談室 part131
http://mevius.2ch.net/test/read.cgi/tech/1501295308/

このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.101【環境依存OK】
http://mevius.2ch.net/test/read.cgi/tech/1500329247/

■長いソースを貼るときはここへ。■
 http://codepad.org/
 https://ideone.com/

[C++ FAQ]
https://isocpp.org/wiki/faq/
http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured
439デフォルトの名無しさん (ワッチョイ 4980-VYVV)
垢版 |
2017/11/05(日) 17:33:27.29ID:qHZ+DCMx0
>>438
コピー出来ないクラスはどうすんだよ。コンストラクタ内でのメンバーの代入はメンバーの構築とみなすという特殊ルールでも付けるのか?
2017/11/05(日) 17:35:00.88ID:3uuR82Hq0
>>438
>>409の構文にケチをつけたいだけなのはわかったよ
2017/11/05(日) 17:42:24.41ID:3uuR82Hq0
>>439
> コピー出来ないクラスはどうすんだよ。
const 云々言ってるなかで>>438みたいなレスする程度の理解力だから許してやれよ w

> コンストラクタ内でのメンバーの代入はメンバーの構築とみなすという特殊ルールでも付けるのか?
C#のreadonlyはそんな感じだな
2017/11/05(日) 17:44:56.54ID:edJGSUmw0
>>439
まあYESということもできる

クラスFooのメンバm_a (∈クラスT)は、Fooのコンストラクタ実行前に構築されているはずはないのだから
 m_a = (some クラスTのオブジェクト)
というのがコンストラクタ内に現れたら、むしろそれを代入と解釈するわけにはいかない
すわなち話がただちにコピコンの出番に絞られる
2017/11/05(日) 17:53:44.93ID:edJGSUmw0
>>441
ちょっ漏れもconst云々は>>405で言及済みなんだがガン無視カヨ
何でも俺の仕業かよ…

>>440
いや新たな構文の追加提案自体の罪を問いたい
>>405の通り、基底クラスとconstメンバの初期化については現行のメンバ初期化構文は必要悪なんであって、
それ自体は全否定まではしないが、
基底クラスとconstメンバの初期化以外の用途はコンストラクタ内でのメンバへの(一見)代入(に見える構文)で十分なのでわ!?
というのが漏れのスタンス
2017/11/05(日) 17:58:22.61ID:edJGSUmw0
まあ漏れの案の欠陥としては、
コンストラクタ内でthisを他の関数bar()(すでにコンパイル済みかもしれない)に渡して
barの中でthis->m_aに代入するのはどうなんじゃ、というのはあるが
(C#はこの点現行C++と同じ実行時コストを支払っているハズ…
 つまりデフォルトコンストラクタでFoo::m_aを構築した状態でコンストラクタに入る
2017/11/05(日) 17:59:06.73ID:3uuR82Hq0
>>443
> 基底クラスとconstメンバの初期化以外の用途はコンストラクタ内でのメンバへの(一見)代入(に見える構文)で十分なのでわ!?
お前がそう思うのは勝手だが、わざわざ用途毎に構文を分けるのは悪手だろ
って言うだけのこと
2017/11/05(日) 18:10:51.69ID:edJGSUmw0
スマン>>444の末尾2行は抹消
C#はオブジェクトを参照型でしか扱わないから、明示的にFoo::m_aに対して
どっかで明治t系にnew T()を書かねば何も起きないから、書かなかった場合の実行時コストも糞も無い
447デフォルトの名無しさん (ワッチョイ 417f-dVlt)
垢版 |
2017/11/05(日) 18:14:02.62ID:XS4+4qja0
↓structもあるとか言い出すアホ
2017/11/05(日) 18:31:44.21ID:edJGSUmw0
いやすまん>>442の方針にはまだ欠陥があったわ;
Foo::Foo() {
 m_a = 1; // (1)
 m_a = 2; // (2)
}
と書いた場合、(1)は>>442の方針でm_aの初期化とみなすことはできるが(2)をどう解釈すべきか曖昧になる
やっぱメンバの初期化はコンストラクタ本体実行前に1回だけ行われるようにする現行メンバ初期化構文の方がスマートじゃわ;;

というわけで完全に自己解決しますた!
449デフォルトの名無しさん (ワッチョイ 6e3e-cSXK)
垢版 |
2017/11/05(日) 18:57:45.52ID:rSDVGL6P0
しっかし「漏れ」って久々に聞いたぞ。
2017/11/05(日) 19:58:56.84ID:miuEyx390
黎明期からROMやっててUNIX板の騒動を解決した御仁もいるんだろ
2017/11/05(日) 21:08:22.04ID:g4RG1qZKM
>>361
<<を使ったフォーマットだと語順を簡単に変えられなくて翻訳対応しづらいという問題もある。
2017/11/06(月) 04:26:03.89ID:2+QNBq450
なんか、相談室じゃなく、テクニックを披露し合って
自慢ごっこスレになってるな。

初心者は入れないし、もし書いたら、さげすむばかりだし。
本当に自慢ごっこスレだな。

おまえらだって、最初はなんにも知らなかった・わからなかったのに。

ちょっとわかる様になったら、自慢ごっこだな。

本当にわかっている人は、簡単な言語で良いソフトを作っているよ。

テクニック自慢ごっこはやめれ。
2017/11/06(月) 05:16:27.05ID:gbsDrhzw0
テクニックでもなんでもない
「c++知らない人の考えた正しいc++論」なんか要らんってだけ
2017/11/06(月) 05:26:32.69ID:BSAOW8np0
煽れば答えを教えてくれると思ってるとでも思ってるのかねぇ。
まともな人はスルーするだけだし、テキトーに答える人がいてそれにかみつく人がいて荒れるいつもの流れ。
2017/11/06(月) 05:30:04.94ID:BSAOW8np0
>>454
思ってるとでも思ってる→とでも思ってる
orz
2017/11/06(月) 05:52:30.70ID:YMdKjlXe0
visual studio comunity 2015のc++で下記コンソールプログラムを実行すると
「0x73AD36A8 (tmmon.dll) で例外がスローされました (ConsoleApplication1.exe 内)
: 0xC0000005: 場所 0x0058F180 の読み取り中にアクセス違反が発生しました」
というエラーが出て停止するんだけど、原因が分かったら教えてください
ちなみに、コンパイル時にエラーは出ないし、プログラムも実行できるけど、プログラムの終了時にエラーが出ます
tmmon.dllというのはウィルスバスター関係のソフトらしいので、もしかしたらそちら側の不具合かもしれないけど

#include <iostream>
#include <conio.h>
using namespace std;

#define num 5000

class CLASS_A {
};

int main()
{
CLASS_A** ppa = new CLASS_A*[num];
for (int i = 0; i < num; i++)
ppa[i] = new CLASS_A;

for (int i = 0; i < num; i++)
delete ppa[i];
delete ppa;

cout << "hit any key!" << endl;
char ch = (char)_getch();
return 0;
}
2017/11/06(月) 05:59:29.00ID:7ntrKCQE0
ステップ実行してどこで落ちてるか検証するべし。
これくらいのコードならおえるでしょ。
2017/11/06(月) 06:01:06.59ID:662yk6z20
少なくともdelete ppa; はdelete[] ppa; じゃなくちゃダメだろ
2017/11/06(月) 06:06:20.61ID:pcHZ0AZV0
C++のクラスのコーディングをCで表現しようとするとどんなコードになる?
2017/11/06(月) 06:11:23.92ID:7ntrKCQE0
structで関数ポインタ持たせるとかあるけど。
変換規定はない。
2017/11/06(月) 06:31:31.92ID:YMdKjlXe0
>>457
エラーが出るのが
return 0;
の後なので、ステップ実行してもよく分かりませんでした

>>458
なるほど、忘れてました
でも付けてもエラーは出るみたいです

トレンドマイクロの方に問い合わせしてみたほうがいいですかね?
462デフォルトの名無しさん (ワッチョイ 4980-VYVV)
垢版 |
2017/11/06(月) 07:31:40.53ID:z+KG8ZZn0
>>453
ほんこれ。
例の人のどこに初心者だから教えてくれという要素があったというのか。
2017/11/06(月) 08:03:49.75ID:FJG0yfiKd
>>460
賢い
関数ポインタに関数のアドレスを突っ込むタイミングは構造体初期化のタイミングだろうか?
464デフォルトの名無しさん (ワッチョイ c29d-SaAB)
垢版 |
2017/11/06(月) 08:23:52.67ID:Z84gcoL/0
>>456
そのコンパイラのバグだろ。他の系でやってみたらいいと思う。問題ないはずだ。
自分の脳内コンパイラでもOKだ。
2017/11/06(月) 09:14:29.24ID:7ntrKCQE0
>>463
コンストラクタ関数を必ず持つようにするとかね。
Hoge h = constructHoge(...);
2017/11/06(月) 09:20:09.45ID:6kMDcvlvr
>>456
>(tmmon.dll) で例外がスローされました

よくあること
Windowsだったらスタートメニューからメンテナンスツール(普通の管理画面ではない)を起動して
モジュールの全アンロードすると起こらなくなる
2017/11/06(月) 09:48:56.37ID:YMdKjlXe0
>>464
エラーについて検索していたら、こちらのページにVisual studio 2017のdenev.exeと自作アプリの置いてあるフォルダを
ウィルスバスターの例外設定に追加して様子を見るようトレンドマイクロから回答されたという人がいたそうです。
私の場合は2015なので、とりあえず自作プログラムのフォルダを例外設定に追加したところエラーが出なくなりました。
なんか根本解決になっていないような気もするけど、とりあえずこれで様子を見てみます。

http://dxlib.o.oo7.jp/cgi/patiobbs/patio.cgi?mode=view&;no=4148

ちなみに今気づいたのですが、エラーが出るのはVisual studio 2015のIDE上から実行したときだけで、
プログラム単体で実行したときはエラーは出ないようです。

回答してくださったみなさん、ありがとうございました
2017/11/06(月) 09:51:12.88ID:YMdKjlXe0
>>466
ありがとうございます
>>467の方法でとりあえず解決しました
469デフォルトの名無しさん (ワッチョイ c29d-SaAB)
垢版 |
2017/11/06(月) 10:48:41.89ID:Z84gcoL/0
#include <boost/pool/pool_alloc.hpp>
サンプルをテスト使用としたらTIのCCSにはこのあたりのライブラリがないんだが、このライブラリって
古いのだろうな? 
boost::fast_pool_allocator<int> とかをテストしたいのだが、新しいライブラリはどれになるんだろうか?
2017/11/06(月) 12:11:13.49ID:FN/Llmne0
>>461
メモリリークだろ

メモリを解放せずに、アプリを終了してるとか?
2017/11/06(月) 12:13:38.44ID:FJG0yfiKd
>>465
C++ならできるだろうけどCだとできる...?
2017/11/06(月) 21:05:16.36ID:7ntrKCQE0
>>471
https://ideone.com/ZfcWrq
こういうイメージだな。
C久々に触ったわ。メモリ回りはおまじないが多いのでこわいよ〜。
2017/11/06(月) 21:12:28.45ID:MXn0CmOw0
>>472
どうしても記法を再現しようとするとそうなるだろうけど、
メモリを無駄にして割に合うのかっていうとだいぶん疑問ではあるよな。
2017/11/06(月) 21:14:53.41ID:7ntrKCQE0
>>473
まぁ、折衷案で関数群とデータで分けるとかね。
一応継承紛いなこともできなくないし。
2017/11/06(月) 22:45:43.65ID:r9+CDuOfM
>>471
glibを真似たらいいよ。
476デフォルトの名無しさん (ワッチョイ 4980-VYVV)
垢版 |
2017/11/06(月) 22:51:39.40ID:z+KG8ZZn0
記法を似せたいだけならともかく、関数ポインタを使うところはC++でいうところのvirtual functionでそれをクラスのIFとするのはC++でもめったにやらんわな。
2017/11/06(月) 23:44:50.11ID:SClVOYaP0
COM(Component Object Model)はC++及びCでバイナリ互換のオブジェクトを作ることが出来る
vtblの配置は言語仕様上は定められていないが、MSがCOM(OLE2)を実装するにあたって定めた配置にしている処理系が殆どだ
2017/11/07(火) 02:44:04.83ID:5kOZtFPy0
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: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の処理につなぐことを考えてます。
2017/11/07(火) 04:38:27.99ID:PQkUnwQq0
>>478
expressionがどうなってるのか知らないけどその文法だと
a=expr * a=expr * *
みたいに書けてしまうけど良いのか?
「左辺に書けるもの」を分けて整理すべし
C言語風ならC言語の文法を参考にしてもいいと思うけど
2017/11/07(火) 05:07:39.94ID:5kOZtFPy0
アドバイスありがとうございます。
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無視しちゃっていいのかなぁ。。
481デフォルトの名無しさん (ワッチョイ 4502-S32u)
垢版 |
2017/11/07(火) 05:27:52.17ID:2eQgtTM30
> コンパイル時にエラーは出ないし、プログラムも実行できるけど、プログラムの終了時にエラー

スタック破壊の典型的な症状だな
2017/11/07(火) 07:17:12.36ID:PQkUnwQq0
>>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 (代入二つ)とは書けなくなるかな
2017/11/07(火) 09:38:50.61ID:Nwc3R7kX0
>>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;
}
2017/11/07(火) 09:48:51.30ID:Nwc3R7kX0
>>483
すみません、再確認したらnumの数を減らせば出なくなるというのは間違いです
ただ、出にくくなっているような気はするけど
2017/11/07(火) 16:23:51.40ID:5kOZtFPy0
>>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; }// 数値
;
2017/11/07(火) 21:03:50.18ID:t2a48+le0
>>477
C++ 用の宣言と C 用の宣言がマクロで分岐するようになってるのを読んだことが有るんだけど、
C++ で引数を参照で渡してるやつが C ではポインタになってて、
それってバイナリレベルでは互換性があるんだ〜と思ったことがある。
2017/11/07(火) 21:13:18.56ID:LIKWanez0
>>483
_getchあやしくね?
cin.get(); に変えてみたら?
2017/11/07(火) 21:59:05.61ID:5kOZtFPy0
>>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;
}
2017/11/07(火) 22:01:54.27ID:aP9yM4om0
結論。Newすんな。ベクタ使え。
2017/11/08(水) 00:05:45.23ID:b+QUYReX0
伸び縮みしないんだったらunique_ptrで十分じゃん
2017/11/08(水) 00:17:24.11ID:NuL34q9d0
>>483
ウィルスバスターのdllでエラーならMSに言っても意味ないんじゃないか。
デバッガがアタッチされてるとウィルスバスターのdllがおかしなことして起きるってことじゃないの?
492デフォルトの名無しさん (ワッチョイ 4502-S32u)
垢版 |
2017/11/08(水) 06:08:53.08ID:Qxc+LNev0
ウイルスバスターが干渉しているっぽいなら
VirtualBoxでウイルスバスターのない仮想環境を作って
その中で動かしてみればええやん
2017/11/08(水) 06:30:19.02ID:pFtekju40
セキュリティソフトを動かしていたら、多くのアプリは、正常に動かない

多くのアプリの説明書に、そう書いてある
2017/11/08(水) 07:29:57.54ID:/yzKqtBG0
>>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から強制終了することで対応しようと思います。
プログラム単体で実行したときはエラーは出ないので
2017/11/08(水) 08:02:44.81ID:pFtekju40
多くのアプリの説明書に、
「セキュリティソフトを動かしていたら、正常に動きません」

って書いてあるけど、何でだろ?
2017/11/08(水) 08:10:49.38ID:MA4CFapNd
多くのアプリがウィルスみたいなものだから
2017/11/08(水) 09:33:37.02ID:tfdQ3Vx70
セキュリティソフトは潜在バグを顕在化する事が往々にしてある
2017/11/08(水) 10:25:00.80ID:s/8N4dfn0
事情は知らんが開発中はウィルスバスター止めるとか>>467の方法で問題あるのか?
IDEから強制終了とかクソ面倒くさいことやってられんだろ
2017/11/08(水) 10:27:07.11ID:pfXJjTar0
OSの設定に干渉するようなモノはウイルス判定されることがあり得るでしょ。
それが善意かどうかなんて判定のしようがない。
2017/11/08(水) 10:29:43.39ID:s/8N4dfn0
もしかしてウイルスを作ってるのか?
501デフォルトの名無しさん (ワッチョイ 4980-VYVV)
垢版 |
2017/11/08(水) 12:29:57.54ID:/2nLdTDi0
>>499
ウイルス判定したならただクラッシュさせて放置じゃなくてアンチウイルスソフトとしての仕事しろよ。
ただウイルスバスターがクソなだけだろ。
2017/11/08(水) 13:26:26.66ID:xvDlz0If0
ウイルスと判定したわけじゃなくて、判定するために干渉した結果としてそうなる場合がある。
コンソールアプリを起動しようとした場合に、一旦サンドボックス的なものの中で起動させてチェックして
直後にあらためて普通に起動するというのを見たことがある。
今回の場合、そのコンソールアプリを起動している VS の状況と噛み合わなくなっているのだと思う。

チェックのために何かしら介入しなきゃならないのはしょうがないのだが、
泥臭い、クソみてぇなことの塊なので、まじめに検証するのアホらしいぞ。
2017/11/08(水) 15:52:55.19ID:8BP79/0I0
>>494
カスペルスキーの環境だと問題ないみたいですぜ。例外とかの設定もしてません。
バスターは入れてないです。
504デフォルトの名無しさん (スプッッ Sd62-3K0w)
垢版 |
2017/11/08(水) 16:01:14.63ID:VRSOCYqCd
いまどきクライアントにはウィルス対策ソフトなんて入れないのが主流だと思ってたけど、
そうでもないのかな
2017/11/08(水) 16:44:23.86ID:XvbXwAqY0
上の現象見ただけでも信用ならんと分かりそうなものだがなあ。
2017/11/08(水) 18:24:45.85ID:pfXJjTar0
Win10ならディフェンダーはいってるけど、前のOSとかなら入れるのか?
2017/11/08(水) 19:40:45.83ID:GPQLPiKHM
>>506
XPの時からディフェンダーだわ
2017/11/08(水) 23:47:31.77ID:NuL34q9d0
ノートンのプロセスが勝手にこっちのdllを読み込んあとおかしな状態でアンロードしてアクセス違反おこしてノートンのプロセスがクラッシュするってのはあった。
アンチデバッキングなのかユーザーモードデバッガではアタッチできないからカーネルデバッガやるしかなくて原因見つけるのに結構苦労した。
509デフォルトの名無しさん (ワッチョイ 5f80-UJrp)
垢版 |
2017/11/09(木) 00:57:17.32ID:ej8qpLZc0
Virtual Studioは素人が購入することは考えにくい専門的なソフトだからウイルスバスターのターゲット外なんだよ。
つまりさっさとどっちか捨てろってこった
510デフォルトの名無しさん (ワッチョイ 5f78-XysI)
垢版 |
2017/11/09(木) 02:17:02.22ID:7vxmA4jM0
Visual Studioでアプリ作っててビルドしたてホヤホヤのプログラムをアヴィラ先生がウィルス認定しやがったのは過去に何度かあったわ
2017/11/09(木) 07:51:39.95ID:AsVSSCPV0
>>456
delete[] ppa;
じゃないの
2017/11/09(木) 08:51:49.76ID:4HUgyouS0
>>498
>>467の方法は、エラーの発生を無視しているだけで、実際にはエラーが発生している可能性があるので

>>500
そんなスキルはないですw

>>503
ウィルスバスター側が悪さしている可能性もあるんですかね
せめてVisual Studioとウィルスバスターのどっちが悪いのかわかればいいんだけど

>511
>>483でdelete[] ppa;にしてみたけど、同じでした
2017/11/09(木) 11:01:44.29ID:Obd3aNBj0
ウィルスバスターはエラー検出ツールじゃないし無視でいいよ
リソース関連のエラー検出したいならそれなりの検出ツール使うとか静的解析ツール使うとか
2017/11/09(木) 12:14:59.98ID:rcuqnank0
ウィルスバスターミナルとかトーシローかよw
プログラムの仕組み知り尽くしていればまずウィルスなんかに引っ掛からないだろw
2017/11/09(木) 12:33:16.70ID:YfcqoN+X0
教えてくれよ
2017/11/09(木) 18:45:17.95ID:+zZRkuiLd
入力したコマンドを別関数に渡して結合してリターンして表示するってコードを作りたい
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;
}
2017/11/09(木) 18:49:41.22ID:lJJATczwd
GetCommand関数のcommand変数をstaticなバッファーにするか、おとなしくstd::stringを使うか、GetCommandにバッファーへのポインターに渡すか。
2017/11/09(木) 18:53:06.50ID:+zZRkuiLd
>>517
このままのリターン形式だとstaticなバッファー作成しか方法ないってことですよね
2017/11/09(木) 18:56:36.56ID:lJJATczwd
>>518
いや、malloc や、newもあり得る。だれが解放するかは問題だが。
2017/11/09(木) 19:22:58.90ID:lJJATczwd
グローバル変数のバッファーを使うこともできる。
2017/11/09(木) 20:43:21.98ID:+zZRkuiLd
考えてみるとバグの温床になりかねんね
単純に格納先の変数を用意して引数に渡すべきだとなった
2017/11/09(木) 21:06:06.24ID:HS5Oh82mM
>>521
C言語ならな
C++なら>>517の言う通りおとなしくstd::string使えよ
2017/11/09(木) 21:22:58.42ID:+zZRkuiLd
>>522
そやね
プロシージャとファンクションの考え方からファンクションにしたいのに
戻り値じゃないってのも変だ
string全然使ったことないけど使うことにする
2017/11/09(木) 22:21:05.91ID:LSUga0nM0
コマンドラインオプションで受渡した方がやりやすいような気もしないでもない。
525デフォルトの名無しさん (ワッチョイ dfcb-2I0o)
垢版 |
2017/11/10(金) 05:13:52.89ID:7MRV7tWB0
こういう内容でstring使わないとか
超のつくマゾプレーだな
526デフォルトの名無しさん (ワッチョイ 5f78-XysI)
垢版 |
2017/11/10(金) 06:24:08.16ID:wxME+cIA0
ってかCの質問やんけ
2017/11/10(金) 06:45:56.53ID:AkYkb8w90
sprintfは領域確保しないでしょ。こういうのがCは危ない。
2017/11/10(金) 07:58:16.79ID:P63PhvFd0
>>513
たしかにウィルスバスターをエラー検出ツールとして使うのは、おかしいですね
>>467の方法でdevenv.exeが置いてあるIDEというフォルダと、自分のプログラムが置いてあるフォルダを
ウィルスバスターの例外処理に入れたら、気持ちが悪いぐらいにまともに動くようになりました

みなさん、ありがとうございました
529デフォルトの名無しさん (ワッチョイ 7f9d-vLjR)
垢版 |
2017/11/11(土) 06:46:03.41ID:PUzdOh0e0
>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);
2017/11/11(土) 06:58:56.29ID:qx0Cuc+s0
256バイト確保しておけばメモリーをはみ出すことはまずない。とかw
文字列連結してるだけなんだから全部std::stringでやればいいだけだよ
2017/11/11(土) 07:10:37.49ID:5AYGw8xA0
>>516
ていうかc言語初心者のところで聞けよ
その池沼レベルのソースコードだとここでは晒しものの血祭りになるだけだぞ
532デフォルトの名無しさん (ワッチョイ 7f9d-vLjR)
垢版 |
2017/11/11(土) 08:19:33.64ID:PUzdOh0e0
>文字列連結してるだけなんだから全部std::stringでやればいいだけだよ

さてもしかりに
char commad[256000]; このくらい十分に確保できたらstringとどっちがあんぜんだろうか?
先ずはstringを使った方がいいと主張する理由を説明できないとな。
「やればいいだけだよ」って誰かがいってたから、という受け売りの信仰ではだめだな。
2017/11/11(土) 08:23:18.59ID:qQheN6bd0
>>532
それでもstd::stringのが安全
根本的に考え方が古すぎる
2017/11/11(土) 08:40:17.35ID:FtIHrpnF0
>>533
外部からの長さ無制限の文字列を受け付けるプログラムというのもセキュリティー上問題がある
バッファオーバーフローで即exploitされることは無いが時間をかければクラッシュを引き起こせる
というわけで長さ制限はどこかの時点で必須なのでassertionをOFFにしたsprintf_s()さいこー
2017/11/11(土) 08:42:08.74ID:qx0Cuc+s0
>>532
くだらなすぎて返す言葉もないです
すみません
536デフォルトの名無しさん (スップ Sd1f-WrWp)
垢版 |
2017/11/11(土) 08:46:05.02ID:JauW0Lbxd
スタックオーバーフロー起こしそう
2017/11/11(土) 08:58:22.67ID:VdKe4lXM0
>>532
スタックが無駄。
2017/11/11(土) 08:59:35.86ID:FtIHrpnF0
ていうかstd::stringにお任せしておけばデータサイズの管理が不要とか池沼の考え
何文字でも受け付けるとかいうのはテストしようが無いからまともな仕様ではない
よってまともな設計は不可能
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況