Geospace

TwitterGitHubRSS

macOS et scan-build

Publié le 20/08/2017

Flemme de lire

$ brew install llvm
$ ln -s /usr/local/opt/llvm/bin/scan-build /usr/local/bin/

Un peu plus d’explications

J’utilise beaucoup scan-build lorsque je code en C pour identifier des bugs. L’outil est très puissant et permet notamment de trouver des chemins d’exécution pouvant mener à des erreurs de segmentation ou à des fuites de mémoire.

Lorsque j’utilisais Archlinux, scan-build était fourni avec clang. Le binaire s’installait dans /usr/bin, un chemin plutôt répandu dans les $PATH. Sous macOS (10.12.6), ce n’est pas le cas. clang est livré avec le système mais pas scan-build. J’ai cru un instant que Brew proposait une formule pour clang offrant une version éventuellement plus récente et quelques outils annexes, comme scan-build. Mais ce n’est pas le cas, Brew ne fournit pas clang.

Brew ne fournit pas non plus scan-build. Aucune formule n’existe pour ce nom, la commande brew search scan-build ne renvoie rien et le site Search Brew renvoie des trucs bizarres. Google renvoie quelques formules maintenues par des contributeurs mais aucune de semble à jour.

Il est toujours possible de récupérer l’archive proposée sur le site du projet. Problème, les binaires fournis sont anciens. J’ai essayé de récupérer uniquement le binaire de scan-build pour le placer dans /usr/local/bin et ainsi le faire fonctionner avec une version plus récente de clang. Sans succès, les versions ne sont pas compatibles. De plus, on ne dépend plus d’un gestionnaire de paquet, ce qui ne me semble jamais être une très bonne idée.

J’ai donc recherché scan-build sur le repo GitHub Homebrew Core qui contient toutes les formules par défaut. La formule de LLVM ressort :

GitHub

J’ai regardé un peu les sources de la formule. Installer LLVM installe bien scan-build dans /usr/local/opt/llvm/bin/scan-build mais pour des raisons de compatibilité avec la libc++ (j’suis pas bien sur d’avoir compris pourquoi mais bon, c’est c’que dit Brew), les liens symboliques dans /usr/local/bin ne sont pas créés. On peut en créer un juste pour scan-build, je doute que cela cause un quelconque problème de compatibilité :

$ brew install llvm
$ ln -s /usr/local/opt/llvm/bin/scan-build /usr/local/bin/

Ainsi scan-build fonctionne, se trouve dans $PATH et est mis à jour par Brew. C’est assez dommage que ces informations ne se trouvent pas sur le site officielle de scan-build ou qu’une formule brew exclusive à scan-build n’existe pas. J’vais voir si y’a pas une pull request a faire quelque part. :p