Eu atualizei minha instalação local de peixes usando homebrew para 020fe5ccdfbbc147977ae11803816475e9fef763 e segfaults no lançamento, enquanto lia config.fish
.
Aqui está o que vejo ao executá-lo em lldb e ao executá-lo com um alto nível de depuração: https://gist.github.com/thomcc/4bda5472facccd4c93884df3e3e50044 (na verdade, agora inclui desmontagens de funções também).
Pelas desmontagens, parece que o compilador está descartando o teste de child
aqui: https://github.com/fish-shell/fish-shell/blob/master/src/tnode.h#L147 , já que está assumindo que uma referência nunca pode ser nullptr, já que é UB (note que ele reescreve a função um pouco para que pule para o final quando nodeptr
é nullptr, então ele conhece child
não pode ser nulo por esse motivo).
Pode haver outros problemas também, é claro, especialmente se outro código tiver o mesmo problema (por exemplo, assume que uma referência pode ser nullptr).
Infelizmente, esse tipo de problema é muito complicado de reproduzir e não consigo fazer com que aconteça em uma compilação fora da instalação do homebrew, embora todo o resto deva ser o mesmo (acho que é possível que tenha um caminho diferente e está encontrando um clang
? Não sei).
No entanto, é confiável para mim dentro do homebrew.
Sim, também posso reproduzir isso com as compilações do Homebrew no macOS 10.11. Curiosamente, tem a ver com o ambiente no estágio de construção do Homebrew, já que configurar a árvore fora do Homebrew e executar make
dentro de brew sh
produz um segfault.
Oh, uau - Homebrew silenciosamente reescreve as sinalizações passadas para o compilador, então _isso_ incrível. É por isso que você não pode obter símbolos de depuração, embora -g
pareça estar em CXXFLAGS
.
Posso reproduzir isso no macOS e no Linux com ./configure CXX=clang++ CXXFLAGS="-g -Os"
.
Boa análise! Deve ser corrigido por 5b3729842cacdf0566743e2327c99beed8f0cc6c. Obrigado!
Comentários muito úteis
Oh, uau - Homebrew silenciosamente reescreve as sinalizações passadas para o compilador, então _isso_ incrível. É por isso que você não pode obter símbolos de depuração, embora
-g
pareça estar emCXXFLAGS
.Posso reproduzir isso no macOS e no Linux com
./configure CXX=clang++ CXXFLAGS="-g -Os"
.