teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

3

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

2019/07/08 15:20

投稿

myoon
myoon

スコア100

answer 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
  ただし、どちらにしても、これは元々のargv[0]と同じにはなりませんから、ps aux などで確かめても反映されません。
4
4
 

2

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

2019/07/08 15:20

投稿

myoon
myoon

スコア100

answer CHANGED
@@ -3,6 +3,6 @@
3
3
  ただし、どちらにしても、これは元々のargv[0]と同じにはなりませんから、ps aux などで確かめても反映されません。
4
4
 
5
5
  確かめてませんが、もしかしたら(++を使わず) strcat(argv[0],argv[1]) は動くかもしれません。
6
- strcatの未定義動作になる可能性もありますが、一旦argv[1]のコピーを作ればC的には可能です。しかし、**それでもこれはやってはいけません**。
6
+ strcatの未定義動作になる可能性もありますが、一旦argv[1]のコピーを作ればC的には可能です。しかし、**それでもこれはやってはいけません**。バッファオーバーランが起こるでしょうが、環境によってはコマンドライン全体のバッファサイズが推定できる場合もあります。それでもそれ以外にも危険があります。
7
7
 
8
- まず、argvは変更可能とC/C++の仕様にありますが、「書き換えたらどうなるか?」は環境依存です。argv[0]の後にargv[1]がある処理系も多いですから、argv[1]が破壊される可能性が高いでしょう。つまり、**環境を考えて「どんな副作用があり得るか」を詳細に把握していない場合は書き換えてはならない**、ということです。たとえばargv[1](可搬性をなくすのでできるだけ使うべきではありませんが)__progname という変数も書き換わるかもしれません。この変数は必ずしもargv[0]の先頭を参照しているとは限らないので、不思議なことが起こるかもしれません。
8
+ まず、argvは変更可能とC/C++の仕様にありますが、「書き換えたらどうなるか?」は環境依存です。argv[0]の後にargv[1]がある処理系も多いですから、argv[1]が破壊される可能性が高いでしょう。つまり、**環境を考えて「どんな副作用があり得るか」を詳細に把握していない場合は書き換えてはならない**、ということです。たとえばargv[1](可搬性をなくすのでできるだけ使うべきではありませんが)__progname という変数も書き換わるかもしれません。この変数は必ずしもargv[0]の先頭を参照しているとは限らない(basenameを参照しようとする)ので、不思議なことが起こるかもしれません。

1

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

2019/07/08 15:18

投稿

myoon
myoon

スコア100

answer CHANGED
@@ -2,4 +2,7 @@
2
2
 
3
3
  ただし、どちらにしても、これは元々のargv[0]と同じにはなりませんから、ps aux などで確かめても反映されません。
4
4
 
5
- ず、argvは変更可能とC/C++の仕様にありますが、「書き換えたらどうなるか?」は環境依存です。argv[0]の後にargv[1]がある処理系多いですから、argv[1]が破壊される可能性が高いでょう。つまり、環境を考えて「どんな副作用があり得る」を詳細に把握ていない場合は書き換えてはならない、ということです。とえばargv[1]が英数字でできている場合可搬性なくすのでできるだけ使うべきではありませんが)__progname という変数も書き換るかもしれません。この変数は必しもargv[0]の先頭を参照していると限らないので、不思議なことが起こるかもしれません。
5
+ 確かめてせんが、もしかした++を使わず) strcat(argv[0],argv[1]) 動くかもしれません。
6
+ strcatの未定義動作になる可能性もありますが、一旦argv[1]のコピーを作ればC的には可能です。しかし、**それでもこれはやってはいけません**。
7
+
8
+ まず、argvは変更可能とC/C++の仕様にありますが、「書き換えたらどうなるか?」は環境依存です。argv[0]の後にargv[1]がある処理系も多いですから、argv[1]が破壊される可能性が高いでしょう。つまり、**環境を考えて「どんな副作用があり得るか」を詳細に把握していない場合は書き換えてはならない**、ということです。たとえばargv[1](可搬性をなくすのでできるだけ使うべきではありませんが)__progname という変数も書き換わるかもしれません。この変数は必ずしもargv[0]の先頭を参照しているとは限らないので、不思議なことが起こるかもしれません。