Valaを試し、生成されたCソースコードを調べた後、次のValaコードを思いつきました。
class Foo : GLib.Object {
public string baz;
}
class Main : GLib.Object {
public static Foo foo;
public static void bar(Foo f) {
foo = null;
f.baz = "Hi";
}
public static int main(string[] args) {
foo = new Foo();
bar(foo);
return 0;
}
}
生成されたCコードを調べると、Valaコンパイラーがfooの参照カウント(RC)増分をbarに渡すときに挿入しなかったことがわかりました。私が理解している限り、バーの最初の行はfooのRCを0にデクリメントします。これにより、fooが解放され、渡された変数fがダングリングポインターになり、バーの2行目でアクセスされます。 。ただし、プログラムは問題なく実行されるため、ここで何かが欠落しているのか、それともまったくの偶然によって機能するのかはわかりません。参照用に生成されたCコードは次のとおりです。
void main_bar (Foo* f) {
Foo* _tmp0_;
gchar* _tmp1_;
g_return_if_fail (f != NULL);
_g_object_unref0 (main_foo);
main_foo = NULL;
_tmp0_ = f;
_tmp1_ = g_strdup ("Hi");
_g_free0 (_tmp0_->baz);
_tmp0_->baz = _tmp1_;
}
gint main_main (gchar** args, int args_length1) {
gint result = 0;
Foo* _tmp0_;
Foo* _tmp1_;
_tmp0_ = foo_new ();
_g_object_unref0 (main_foo);
main_foo = _tmp0_;
_tmp1_ = main_foo;
main_bar (_tmp1_);
result = 0;
return result;
}