回答編集履歴
3
最大バッファ長の記述を入れた
test
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
strcat("XXXX.exe ", argv[0]) の "XXXX.exe" は、元々のargv[0]を参照したい意図と思われますが。文字リテラルではうまくいきません。「C言語的には」たとえば char old_argv[] = "XXXX.exe";(関数の外の場合はstaticを使う方がいい)などとすべきです。
|
1
|
+
strcat("XXXX.exe ", argv[0]) の "XXXX.exe" は、元々のargv[0]を参照したい意図と思われますが。文字リテラルではうまくいきません。「C言語的には」たとえば char old_argv[最大バッファ長] = "XXXX.exe";(関数の外の場合はstaticを使う方がいい)などとして、最大バッファ長を越えないようにすべきです。
|
2
2
|
|
3
3
|
|
4
4
|
|
2
バッファオーバーランについての記述を追加。
test
CHANGED
@@ -8,8 +8,8 @@
|
|
8
8
|
|
9
9
|
確かめてませんが、もしかしたら(++を使わず) strcat(argv[0],argv[1]) は動くかもしれません。
|
10
10
|
|
11
|
-
strcatの未定義動作になる可能性もありますが、一旦argv[1]のコピーを作ればC的には可能です。しかし、**それでもこれはやってはいけません**。
|
11
|
+
strcatの未定義動作になる可能性もありますが、一旦argv[1]のコピーを作ればC的には可能です。しかし、**それでもこれはやってはいけません**。バッファオーバーランが起こるでしょうが、環境によってはコマンドライン全体のバッファサイズが推定できる場合もあります。それでもそれ以外にも危険があります。
|
12
12
|
|
13
13
|
|
14
14
|
|
15
|
-
まず、argvは変更可能とC/C++の仕様にありますが、「書き換えたらどうなるか?」は環境依存です。argv[0]の後にargv[1]がある処理系も多いですから、argv[1]が破壊される可能性が高いでしょう。つまり、**環境を考えて「どんな副作用があり得るか」を詳細に把握していない場合は書き換えてはならない**、ということです。たとえばargv[1](可搬性をなくすのでできるだけ使うべきではありませんが)__progname という変数も書き換わるかもしれません。この変数は必ずしもargv[0]の先頭を参照しているとは限らないので、不思議なことが起こるかもしれません。
|
15
|
+
まず、argvは変更可能とC/C++の仕様にありますが、「書き換えたらどうなるか?」は環境依存です。argv[0]の後にargv[1]がある処理系も多いですから、argv[1]が破壊される可能性が高いでしょう。つまり、**環境を考えて「どんな副作用があり得るか」を詳細に把握していない場合は書き換えてはならない**、ということです。たとえばargv[1](可搬性をなくすのでできるだけ使うべきではありませんが)__progname という変数も書き換わるかもしれません。この変数は必ずしもargv[0]の先頭を参照しているとは限らない(basenameを参照しようとする)ので、不思議なことが起こるかもしれません。
|
1
もしかしたらできるかもしれない追加情報と、それでもうまくいかない理由等と追加しました。
test
CHANGED
@@ -6,4 +6,10 @@
|
|
6
6
|
|
7
7
|
|
8
8
|
|
9
|
-
ま
|
9
|
+
確かめてませんが、もしかしたら(++を使わず) strcat(argv[0],argv[1]) は動くかもしれません。
|
10
|
+
|
11
|
+
strcatの未定義動作になる可能性もありますが、一旦argv[1]のコピーを作ればC的には可能です。しかし、**それでもこれはやってはいけません**。
|
12
|
+
|
13
|
+
|
14
|
+
|
15
|
+
まず、argvは変更可能とC/C++の仕様にありますが、「書き換えたらどうなるか?」は環境依存です。argv[0]の後にargv[1]がある処理系も多いですから、argv[1]が破壊される可能性が高いでしょう。つまり、**環境を考えて「どんな副作用があり得るか」を詳細に把握していない場合は書き換えてはならない**、ということです。たとえばargv[1](可搬性をなくすのでできるだけ使うべきではありませんが)__progname という変数も書き換わるかもしれません。この変数は必ずしもargv[0]の先頭を参照しているとは限らないので、不思議なことが起こるかもしれません。
|