C言語なら俺に聞け 162 at TECH
[2ch|▼Menu]
260:デフォルトの名無しさん
23/12/12 21:01:30.67 bMo3JLCK0.net
>>259
やってみれば?

261:デフォルトの名無しさん
23/12/12 21:15:07.81 6C/zc+S/0.net
明示的に初期化処理を書くのが吉

262:デフォルトの名無しさん (ワッチョイ d701-Qbcu)
23/12/12 21:58:30.38 bMo3JLCK0.net
>>259
>動的ロード(dlopen)を使用した場合はdlcloseして再度dlopenした場合は初期化されますか?
Linuxの場合には初期化されたけど環境依存かも?
$ cat hoge.c hage.c
#include <stdio.h>
static int a = 100;
void increament_a () {++ a;}
void print_a () {printf ("%d\n", a);}
#include <dlfcn.h>
typedef void (*Func) ();
int main () {
void *handle;
Func func;
handle = dlopen ("libhoge.so", RTLD_LAZY);
func = (Func)dlsym (handle, "print_a");
(*func) ();
func = (Func)dlsym (handle, "increament_a");
(*func) ();
func = (Func)dlsym (handle, "print_a");
(*func) ();
dlclose (handle);
handle = dlopen ("libhoge.so", RTLD_LAZY);
func = (Func)dlsym (handle, "print_a");
(*func) ();
return 0;
}
$ gcc -shared -fPIC -o libhoge.so hoge.c
$ gcc -o hage hage.c
$ LD_LIBRARY_PATH=.; ./hage
100
101
100

263:デフォルトの名無しさん (ワッチョイ 9f07-h0RM)
23/12/12 22:04:40.47 3wiw5swR0.net
>>261
ですよねぇ
数十万のレガシーコードで、リセットするにはプロセスのキルが前提なんだけど、移植対象のシステムはプロセスをキルできないので、なんとかリセットする方法はないかと…

264:デフォルトの名無しさん (ワッチョイ 17f1-tASO)
23/12/12 22:10:06.55 6C/zc+S/0.net
初期値代入くらい書くだろ普通
処理系によっちゃ不定な値から始まったりするのを防ぐ為にさ

265:デフォルトの名無しさん (ワッチョイ 9f07-h0RM)
23/12/12 22:18:02.98 3wiw5swR0.net
>>262
検証ありがとう
自分の環境でも試してみます

266:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 5705-ZkkM)
23/12/12 22:18:21.71 Kje9ktjN0.net
>>259
RTLD_NODELETE フラグで再初期化を止められる(というよりアンロードを妨げるのだけど)ので逆に言えば特に指定しなければ再初期化はされるのが通常動作という解釈でいいと思う。

>>263
わかってるだろうけどレガシーコードをそうやって延命させるとますますワヤになるでよ。

267:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 5705-ZkkM)
23/12/12 22:39:58.31 Kje9ktjN0.net
>>264
言語仕様的にはグローバル変数 (記憶域期間が static) が不定になったりはしないことになっている (初期化子がなければゼロで初期化する) のでまともな開発環境があるところではそんな心配はしないよ。
心配が必要になるほど不確かな処理系しかない (または初期化処理も自分でかかなきゃいけないような低レイヤ) 分野もあるのは知ってるけどそれが普通ってことはない。

268:デフォルトの名無しさん (ワッチョイ 9f79-1KRD)
23/12/12 23:05:45.63 I4UWTUvH0.net
>>267
言語仕様ではなく2度目のdlopenの初期化の話なんだからドキュメント化されてないなら何の保証もないでしょ

269:はちみつ餃子
23/12/12 23:55:24.16 skpldDGw0.net
>>268
そういう意味で言ってたのならわかる。
「どうして元から代入する処理を入れてなかった?それが普通だろ?」というニュアンスで受け取ってたから元は dlopen しなおしで対処する想定ではなかったからそういうことを心配してなかった (する必要がなかった) という反応になった。

270:デフォルトの名無しさん (ワッチョイ 37f2-YdMO)
23/12/15 08:29:58.25 a4YsmFKj0.net
板の名前変わった?

271:デフォルトの名無しさん
23/12/17 18:23:47.21 kc2HrTf20.net
ポインタ変数にアドレスを代入するのはシャローコピーと言えると思いますか?
char s[] = "abc";
char *p = s; // shallow copy

272:デフォルトの名無しさん
23/12/17 18:40:34.16 i7ihHaq10.net
果たしてコピーと呼んで良い操作ナノか

273:デフォルトの名無しさん (ワッチョイ 1e5f-DkQ9)
23/12/17 19:27:43.64 mH/O4qym0.net
>>271
言えません

274:デフォルトの名無しさん (ワッチョイ e34d-e8vO)
23/12/17 19:32:39.54 MfQY7qyQ0.net
>>273


275:デフォルトの名無しさん
23/12/17 22:10:52.33 UmzU+/ux0.net
シャローコピーはディープコピーと並べて語るときに区別するための用語であって、
代入は普通に代入と呼ぶのが、コミュニケーションにおいて適切だ、
と、自分が聞かれた場合なら答えるし、レビュー依頼された場合なら指摘します

276:デフォルトの名無しさん
23/12/18 00:59:34.37 Mvyif4Hn0.net
>>275
シャローコピーと言えると思いますか?

277:デフォルトの名無しさん
23/12/18 00:59:46.13 Mvyif4Hn0.net
指摘する前に答えろよ無能

278:デフォルトの名無しさん (ワッチョイ 63c9-/1Gs)
23/12/18 02:31:45.63 BtLCMjh/0.net
シャローコピーでしょ
2つのポインタが同じ内容になってる訳だから
ちなみに、変数定義時の代入文はバインド(束縛する)と言った方が適切だな

279:デフォルトの名無しさん
23/12/18 09:17:00.35 qIC94rZG0.net
>>276
言えません

280:デフォルトの名無しさん
23/12/18 09:38:52.52 RUscEa1Z0.net
シャローコピーの要件からすると
ポインタ変数にアドレスを代入するだけでは成立せずに
リファレンス可能なオブジェクトを指してるポインタでないとまずい気がする
char *p = (char *)0x000; /* アドレスを代入してるぞ */


最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

146日前に更新/86 KB
担当:undef