From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Original-To: caml-list@sympa.inria.fr Delivered-To: caml-list@sympa.inria.fr Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id 150417FF9F for ; Tue, 8 Mar 2016 16:49:50 +0100 (CET) IronPort-PHdr: 9a23:rmwhZhKf/qHBrxHxRtmcpTZWNBhigK39O0sv0rFitYgULfvxwZ3uMQTl6Ol3ixeRBMOAu60C27ad7f2ocFdDyKjCmUhKSIZLWR4BhJdetC0bK+nBN3fGKuX3ZTcxBsVIWQwt1Xi6NU9IBJS2PAWK8TWM5DIfUi/yKRBybrysXNWC0ILni6vsptX6WEZhunmUWftKNhK4rAHc5IE9oLBJDeIP8CbPuWZCYO9MxGlldhq5lhf44dqsrtY4q3wD89pozcNLUL37cqIkVvQYSW1+ayFmrPHs4D7oRA6Lrl8dSXlexhFBBgyA6BDhQr/wtDH7v6xzwn/JE9fxSOUbXi+97qEjVhjuwA0dOjI06mXQlYQkg6VAvxOn4gI6yabLbYvTOPcoLfCVRs8TWWcUBpUZbCdGGI7pKtJXV+c= Authentication-Results: mail2-smtp-roc.national.inria.fr; spf=None smtp.pra=goswin-v-b@web.de; spf=Pass smtp.mailfrom=goswin-v-b@web.de; spf=None smtp.helo=postmaster@mout.web.de Received-SPF: None (mail2-smtp-roc.national.inria.fr: no sender authenticity information available from domain of goswin-v-b@web.de) identity=pra; client-ip=212.227.17.11; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="goswin-v-b@web.de"; x-sender="goswin-v-b@web.de"; x-conformance=sidf_compatible Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of goswin-v-b@web.de designates 212.227.17.11 as permitted sender) identity=mailfrom; client-ip=212.227.17.11; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="goswin-v-b@web.de"; x-sender="goswin-v-b@web.de"; x-conformance=sidf_compatible; x-record-type="v=spf1" Received-SPF: None (mail2-smtp-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@mout.web.de) identity=helo; client-ip=212.227.17.11; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="goswin-v-b@web.de"; x-sender="postmaster@mout.web.de"; x-conformance=sidf_compatible X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A0CWAQDH895WlgsR49RchAxtqEYEA4oiJ4dEgWkhhzE5EwEBAQEBAQEBEAEBAQEHDQkJIS+CLYJCE3s0BSghiCEBFQQKnx2ZbR+FCB6NM4ULgQ8Fh1uPT4VjiAGCOYZtCoVVjlYhAYJDEQiBSWmJfwEBAQ X-IPAS-Result: A0CWAQDH895WlgsR49RchAxtqEYEA4oiJ4dEgWkhhzE5EwEBAQEBAQEBEAEBAQEHDQkJIS+CLYJCE3s0BSghiCEBFQQKnx2ZbR+FCB6NM4ULgQ8Fh1uPT4VjiAGCOYZtCoVVjlYhAYJDEQiBSWmJfwEBAQ X-IronPort-AV: E=Sophos;i="5.22,556,1449529200"; d="scan'208";a="206626645" Received: from mout.web.de ([212.227.17.11]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 08 Mar 2016 16:49:49 +0100 Received: from frosties.localnet ([134.3.242.84]) by smtp.web.de (mrweb101) with ESMTPSA (Nemesis) id 0Lk8t4-1a1FFX07cw-00c72s for ; Tue, 08 Mar 2016 16:49:49 +0100 Received: from mrvn by frosties.localnet with local (Exim 4.84) (envelope-from ) id 1adJtM-0001au-Fv for caml-list@inria.fr; Tue, 08 Mar 2016 16:49:48 +0100 Date: Tue, 8 Mar 2016 16:49:48 +0100 From: Goswin von Brederlow To: OCaml List Message-ID: <20160308154948.GA5919@frosties> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.23 (2014-03-12) X-Provags-ID: V03:K0:ZiJnD/QJBOSXi3cw1zhHDoBEmHGBnEoeLNrNDtYNGWH4tPWo98G g/9vrCk9ue7pGLgiRA1/z5n/eDSQdQae39B5jCA9igrJ6XZvC2VKXRK1pAtSKcPb+kTZPO5 cNaiTIaj9OJyKky3Tnzj03xXFA4Y2w/ghesGAu6RDU69vzo3NkaTFJl99sU8kPknGqWJnhp ioO8yxoQivCuXqzGlJzpw== X-UI-Out-Filterresults: notjunk:1;V01:K0:HD/GeYjo3/I=:KBB70/r2hxM3fJA4BPjL5+ a4dP0DFI5/xCnMkL7kN2I1cwGXnGr3Oi53xrg41nQJCecScFYKwLlbKdXM/fS8K40w7xZKi5L Zwyp5of86WhQ5M64MYrUn3l9LgAUwX8MqonKuvujeUm4dzYzPeEs2PMFQBMpojdsLIjJc/QHa NpuyvmgSa4+JBy/irVu2snWPrJYwudMJ4i4rOZImNyeiwS3iWktbLVx9U3ZJyrW7G5Il5Rxrs oP7lJ1GcUvfOpKIoMeKoqgHz/nv7xUcAd+RtEeoeQYfMi3WK9mVp7Ef4pvipc0VmFuhNWEBZM hcv0F5PwN+wb0NgLgi7BTV73giFVHcuADvHWThiEiNoocgm0ht1kidSl70J6muoJytSnmD0Xh RckOIZgy1hkFsv6XdPo/YEAMto/ENPeYmKmD+K/GCFPkHR/zbKWu1ZKtwYHdU3IQSqs2DPXsB JbqChd5tg8HAKvCassHm1zycDxDgfW6YB8jzsiVMHBKsuxdG4OGRu/sAxq4BqtpptPHlpNJIE vgT9VspGCU5bQpXtALi2MCL+KFvtxnq9HFY6V4q81Od+E8pnVZpfM2NyyKkF7CVRh8kwIPfri qzL54w+PTkdD97G7+cNaZvgqc8TB5sF3jJTLGDfAMN21J+wBU4vk9AIc2omN4WVCQMTLW3IDw sSxt62AP+63TcDbDCnPhMzldtZMRB6ta8recliI0KCGFUeNfUgg8fQnIzRpbxkmx8hngYekJO cTcnvddTHuwt3oZbJQlhii2+06HSn2dsjnNpaVrznmKjUoJ1SEqM7kOF1UY= Subject: [Caml-list] memory corruption with Weak.t in Gc.finalise Hi, I found a memory corruption in Gc.finalise when sharing a Waek.t with C stubs. I made a small test case and it's gotten worse. The code now segfaults: https://github.com/mrvn/ocam-problems/tree/weak-finalise The problem I had was the address of the obj stored in the Weak.t changes (which might be the GC moving it?) and also the tag changes from 248 (Object_tag) to 168 (random constructor). With my smaller test case I further get: Program received signal SIGSEGV, Segmentation fault. 0x000000000043c9f8 in caml_format_exception () (gdb) bt #0 0x000000000043c9f8 in caml_format_exception () #1 0x000000000043cbc1 in caml_fatal_uncaught_exception () #2 0x000000000043b1a7 in caml_main () #3 0x000000000042c45d in main () Ideas what is going on there? MfG Goswin ------------------------------------------------------------------------ ==> Makefile <== all: test ./test test: main.cmx stubs.o ocamlopt -o $@ $+ %.cmx: %.ml ocamlopt -g -c -o $@ $< %.o: %.c gcc -O2 -W -Wall -g -c -o $@ $< clean: rm -f test *.o *.cmx *.cmi *~ ==> main.ml <== external setup : 'a Weak.t -> unit = "setup" external test : unit -> unit = "test" let cleanup obj = Printf.printf "cleanup\n%!"; test () class obj = object(self) val weak = Weak.create 1 initializer Weak.set weak 0 (Some self) initializer setup weak initializer Gc.finalise cleanup self end let () = Printf.printf "Creating object\n%!"; ignore (new obj); test () let () = Printf.printf "Garbage collection\n%!"; Gc.full_major () let () = Printf.printf "checking after GC\n%!"; test () ==> stubs.c <== #include #include #include value weak; void setup(value ml_weak) { CAMLparam1(ml_weak); printf("%s(0x%lx)\n", __PRETTY_FUNCTION__, ml_weak); weak = ml_weak; caml_register_generational_global_root(&weak); CAMLreturn0; } void test(void) { CAMLparam0(); CAMLlocal1(obj); printf("%s\n", __PRETTY_FUNCTION__); printf(" weak = 0x%lx\n", weak); if (weak != 0) { obj = Field(weak, 1); printf(" obj = 0x%lx\n", obj); if (obj != 0) { printf(" tag = %d\n", Tag_val(obj)); } } printf("%s done\n", __PRETTY_FUNCTION__); CAMLreturn0; }