回答編集履歴

3

最大バッファ長の記述を入れた

2019/07/08 15:20

投稿

myoon
myoon

スコア100

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

バッファオーバーランについての記述を追加。

2019/07/08 15:20

投稿

myoon
myoon

スコア100

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

もしかしたらできるかもしれない追加情報と、それでもうまくいかない理由等と追加しました。

2019/07/08 15:18

投稿

myoon
myoon

スコア100

test CHANGED
@@ -6,4 +6,10 @@
6
6
 
7
7
 
8
8
 
9
- ず、argvは変更可能とC/C++の仕様にありますが、「書き換えたらどうなるか?」は環境依存です。argv[0]の後にargv[1]がある処理系も多いですから、argv[1]が破壊される可能性が高いでしょう。つまり、環境を考えて「どんな副作用があり得るか」を詳細に把握していない場合は書き換えてはならない、ということです。たとえばargv[1]が英数字でできている場合(可搬性をなくすのでできるだけ使うべきではありませんが)__progname という変数も書き換わるかもしれません。この変数必ずしもargv[0]の先頭を参照しているとは限らないので、不思議なことが起こるかもしれません。
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]の先頭を参照しているとは限らないので、不思議なことが起こるかもしれません。