Gauche > Archives > 2014/05/14

2014/05/14 01:40:41 UTCshiro
#
あれ、そうですね。mallocするのはwnamevalだけでいいはずだな… なんか途中までsetenv風のAPIだと勘違いしてて、その痕跡が残ってる気がする。リークはご指摘のとおりです。
#
_wputenvが渡されたメモリをどうするかはmsdnのドキュメントにも書いてないので安全側に倒したのですが、「書いてない場合は内部でコピーするよ」みたいな既定動作があるのかなあ。
2014/05/14 02:02:05 UTCenami
#
http://msdn.microsoft.com/en-us/library/ms235321.aspx この putenv の項を見ると代替の _putenv は ISO C++ conformant とあるので,実はこっちだと仕様が違うのではと期待して探したのですが,みつからず….
2014/05/14 02:06:24 UTCenami
#
あと,_environ, _wenviron の項を見ると _putenv は中で _wputenv も呼んで両者の一貫性を保とうとしているようなので,そこまでしているなら中で自前でコピーくらいしてるんじゃないの,と期待するんですが確証が.
2014/05/14 02:08:13 UTCshiro
#
そーなんですよ。多分コピーしてるんだろなとは思うんですが、万が一してなかった場合、予期不能なタイミングでメモリが破壊されるバグになるのでそれは避けたいなと。
2014/05/14 02:20:48 UTCenami
#
_w?putenv_s なら中で組み立てるはずだからコピーしてませんかね?
2014/05/14 03:21:09 UTCshiro
#
なんかMinGWだと_wputenv_s使えなかったんですよ。深く追求してませんが。
2014/05/14 03:46:32 UTCenami
#
やっぱりそういう落とし穴があるんですね.
2014/05/14 04:56:06 UTC齊藤
#
msvcrt には _wputenv_s は有るので使えないことはないはずなんですが、 MinGW のヘッダファイルには含まれてないみたいですね。
2014/05/14 05:01:10 UTCshiro
#
configureでヘッダチェックして無かったら自前で宣言しちゃえばいいのかな。
2014/05/14 05:05:03 UTC齊藤
#
C ラインタイム関数とは別に SetEnvironmentVariable という API もあるみたいなんですけど、内容は CRT と共有されるのかなぁ?
2014/05/14 05:12:38 UTC齊藤
#
API と CRT は別物っぽいですね。 これハマりどころかも…。
2014/05/14 05:12:57 UTCshiro
#
ややこしい…
2014/05/14 05:20:52 UTC齊藤
#
あれ? だとすると sys-putenv (CRT 関数の _wputen) で書換えた環境変数は CreateProcess で作ったプロセスに引き継がれないのでは?
2014/05/14 05:26:23 UTCshiro
#
putenvしたいケースというのは、(1)環境変数で振る舞いを変えるライブラリ関数の動作を制御したい(2)子プロセスに渡す環境を変更したい、あたりだと思うけど、WinAPIとCRTが別ってことは、_[w]putenvしたら(1)でCRTに影響を与えるけど(2)はだめで、SetEnvironmentVariableしたら(2)はいいけど(1)のCRTには影響を与えない、ってこと?
2014/05/14 05:28:56 UTC齊藤
#
https://bugs.ruby-lang.org/issues/2552
#
・putenv()で設定したものは、getenv()でもGetEnvironmentVariable()でも取得できる
・SetEnvironmentVariable()で設定したものは、GetEnvironmentVariable()では取得できるがgetenv()では取得できない
#
putenv する分には問題ないみたいですね。
2014/05/14 05:32:10 UTCshiro
#
まはろ。putenv()がCRTとAPI両方に流してて、getenv()はCRTだけ見てる感じかな。localeに影響されるCRT関数がgetenv()使ってるとすればputenvしかないか。とすると渡すメモリのオーナシップの問題に戻ってくる。
2014/05/14 05:40:07 UTCshiro
#
まあ普通に考えれりゃ、putenvに渡すポインタに関する制限がついてない以上、CRT側でfreeできないんだから、callerがオーナシップ持ち続けるってのが妥当だよな。ただPOSIXのやつがbrokenな仕様になってるわけで、msvcrtならどうなのかってちゃんとドキュメントに明記しといて欲しいなり。
2014/05/14 05:41:48 UTC齊藤
#
Linux のドキュメントでもバージョンによって違うみたいな記述がありますね。
2014/05/14 05:48:39 UTC齊藤
#
ISO C++ 準拠とありました。
#
http://msdn.microsoft.com/ja-jp/library/ms235321.aspx
2014/05/14 05:55:05 UTCshiro
#
ISO C++の_putenvの仕様を見たいんだけどみつけられない。だがどうせMinGW限定なんだから自前で宣言して_wputenv_s使っちゃうってのがいいかも。
#
POSIX的にはsetenvがあるんだからputenvは静的なメモリを渡すのだけに使いなさいってことにしてる気がする。
#
う、MinGWはerrno_tもないのか。
2014/05/14 06:04:35 UTCshiro
#
ありゃ、_wputenv_sがリンクできん。やっぱだめなのか?
2014/05/14 06:05:59 UTC齊藤
#
何故かインポートライブラリには無い様子です
2014/05/14 06:11:57 UTC齊藤
#
scheme レベルでの動作は sys-putenv の中で setenv しても区別つかないような。
#
C++ の標準ではなくドラフトですが、 github に上がってるみたいです。 https://github.com/cplusplus/draft/tree/master/papers
2014/05/14 06:12:54 UTCshiro
#
はい、今ダウンロード中>ドラフト
2014/05/14 06:13:46 UTC齊藤
#
結局、 POSIX 通りってことっぽい?
2014/05/14 06:14:38 UTCshiro
#
schemeレベルでは気にする必要はない、というか、system.cの互換レイヤのAPIはScm_SetEnvになっててシステムにsetenvがあればそれを使うようになってます。でもMinGW/Windowsではsetenvないですよね?
#
んん、この仕様書には_putenvの仕様は入ってない?
2014/05/14 06:28:26 UTC齊藤
#
setenv 無かったとは気付きませんでした。
#
一応 libiberty.a の中に有るといえば有りますけど、ワイド文字非対応だし、 Windows では _putenv しか選択肢がないみたいですね。
2014/05/14 06:31:09 UTCshiro
#
wchar_t対応でないと困りんす。
2014/05/14 06:38:22 UTCshiro
#
ISO C++ standard libraryのドラフトとかはどこで見られるんだろう。githubのcplusplusに上がってるやつは言語のコアだけみたいだよね。多分別のWGでやってると思うんだけど、https://isocpp.org/std/the-standard から辿ってもオフィシャルな場所がわからない。
2014/05/14 06:45:06 UTCshiro
#
issuesのリストは見られるんだけどな http://www.open-std.org/jtc1/sc22/wg21/