Saya telah memperbarui instalasi lokal ikan saya menggunakan homebrew ke 020fe5ccdfbbc147977ae11803816475e9fef763, dan itu gagal saat diluncurkan, saat membaca config.fish
.
Inilah yang saya lihat ketika menjalankannya di lldb dan ketika menjalankannya dengan --debug-level tinggi: https://Gist.github.com/thomcc/4bda5472facccd4c93884df3e3e50044 (sebenarnya, sekarang termasuk fungsi pembongkaran juga).
Dari pembongkaran, sepertinya kompiler menjatuhkan tes untuk child
sini: https://github.com/fish-shell/fish-shell/blob/master/src/tnode.h#L147 , karena diasumsikan bahwa referensi tidak akan pernah menjadi nullptr, karena itulah UB (perhatikan bahwa ia menulis ulang fungsi sedikit sehingga melompat ke akhir ketika nodeptr
adalah nullptr, jadi ia tahu child
tidak bisa nol karena alasan itu).
Mungkin ada masalah lain juga, tentu saja, terutama jika kode lain memiliki masalah yang sama (misalnya menganggap referensi bisa nullptr).
Sayangnya, masalah semacam ini sangat sulit untuk direpro, dan saya tidak dapat benar-benar mewujudkannya pada build di luar pemasangan dari homebrew, meskipun yang lainnya harus sama (saya kira mungkin saja ia memiliki jalur yang berbeda dan menemukan clang
? Saya tidak tahu).
Ini dapat diandalkan untuk saya di dalam homebrew.
Ya, saya dapat mereproduksi ini dengan Homebrew build di macOS 10.11 juga. Menariknya ini ada hubungannya dengan lingkungan di tahap pembuatan Homebrew, karena mengonfigurasi pohon di luar Homebrew lalu menjalankan make
di dalam brew sh
menghasilkan segfault.
Oh, wow - Homebrew secara diam-diam menulis ulang flag yang diteruskan ke kompiler, jadi _itu_ luar biasa. Itu sebabnya Anda tidak bisa mendapatkan simbol debug meskipun -g
tampaknya berada di CXXFLAGS
.
Saya dapat mereproduksi ini di macOS dan Linux dengan ./configure CXX=clang++ CXXFLAGS="-g -Os"
.
Analisis yang bagus! Harus diperbaiki dengan 5b3729842cacdf0566743e2327c99beed8f0cc6c. Terima kasih!
Komentar yang paling membantu
Oh, wow - Homebrew secara diam-diam menulis ulang flag yang diteruskan ke kompiler, jadi _itu_ luar biasa. Itu sebabnya Anda tidak bisa mendapatkan simbol debug meskipun
-g
tampaknya berada diCXXFLAGS
.Saya dapat mereproduksi ini di macOS dan Linux dengan
./configure CXX=clang++ CXXFLAGS="-g -Os"
.