Avatar
Taketo Sano 9/4/2019 1:51 PM
C と Swift の連携で、Ubuntu でのみ再現するかなり嫌な感じのバグに苦しんでいます…😖 func rank() -> Int { let cA: UnsafeMutablePointer<spasm> = spasm_init(A) defer { spasm_csr_free(cA) } let rank = spasm_rank_hybrid(cA) return Int(rank) } spasm_ とついてるのが C のライブラリです。これを Ubuntu で実行すると spasm_csr_free(cA) の中で Segmentation Fault が発生します。 spasm_csr_free の中でポインタのアドレスを出力してみると、spasm_init で返されるポインタのアドレスから微妙に変わっています。であれば spasm_rank_hybrid の中で何者かがアドレスを書き換えてるのだろうと思いきや、この関数の return の直前でアドレスを出力してみても init で返されるものと同じになっているのです… C と Swift の連携によってアドレスが書き換わってるとしか思えない感じです…😖 しかも不気味なことに func rank() -> Int { let cA: UnsafeMutablePointer<spasm> = spasm_init(A) print(cA) // ← これを入れるだけ defer { spasm_csr_free(cA) } let rank = spasm_rank_hybrid(cA) return Int(rank) } こうすると Seg-Fault が発生しなくなります…😖 (edited)
1:55 PM
defer が悪さをしてるのかと思って func rank() -> Int { let cA: UnsafeMutablePointer<spasm> = spasm_init(A) let rank = spasm_rank_hybrid(cA) spasm_csr_free(cA) return Int(rank) } としてみましたが同じでした😣
1:59 PM
spasm_init: 0x7f3051b1c8f0 start of spasm_rank_hybrid: 0x7f3051b1c8f0 end of spasm_rank_hybrid: 0x7f3051b1c8f0 spasm_csr_free: 0x7f3051b1c800 こういう感じで、アドレスが f0 分ズレるという…
2:01 PM
Optional の分ズレてるとかかなぁ🙄
2:04 PM
f0 ズレるんじゃなくて & 00 されるようです😣