Pergunta

Não é muito difícil quebrar a compatibilidade binária de uma biblioteca DSO/compartilhada com uma interface C ++. Dito isto, existe uma ferramenta de análise estática, que pode ajudar a detectar essas quebras de ABI, se recebe dois conjuntos diferentes de arquivos de cabeçalho: os de um estado anterior do DSO e os do estado atual (e talvez também OSS)? Sugestões gratuitas e comerciais de produtos são bem -vindas.

Se também pudesse alertar sobre práticas ruins, por exemplo, funções embutidas e parâmetros de função padrão nas interfaces DSO, seria ótimo.

Foi útil?

Solução

Presumo que você esteja familiarizado com este tutorial: Problemas de compatibilidade binária com C ++, se não Leia-o!

Eu ouvi sobre esta ferramenta:http://ispras.linuxbase.org/index.php/abi_compliance_checker, no entanto, nunca testou ou usou um, então não tenha opinião.

Além disso, isso pode lhe interessar: Criando biblioteca com ABI compatível com versões anteriores que usa o Boost

Outras dicas

Cheques de conformidade ABI - Uma ferramenta para verificar a compatibilidade binária/de origem do nível da fonte de uma biblioteca compartilhada C/C ++ (DSO):

Uma ferramenta para verificar a compatibilidade binária e o nível da fonte de uma biblioteca C/C ++. A ferramenta verifica arquivos de cabeçalho e bibliotecas compartilhadas de versões antigas e novas e analisa alterações na API e ABI (ABI = API+Compiler ABI) que podem quebrar a compatibilidade binária e/ou de origem: alterações na pilha de chamadas, alterações da tabela V, símbolos removidos , renomeado campos, etc.

enter image description here

eu verifico - interface C OBI/API verificador:

Uma ferramenta para verificar as interfaces C estaticamente para alterações de API e ABI. Todas as alterações nas declarações de tipo que podem causar alterações no ABI devem ser detectadas, juntamente com a maioria das alterações da API. Icheck destina -se ao uso com bibliotecas, como um método de impedir a deriva da ABI.

shlib-compat - Verificador de compatibilidade da ABI para bibliotecas compartilhadas com versão de símbolo:

O Shlib-Compat usa símbolos de depuração anã para recriar e comparar definições de símbolos exportados, incluindo argumentos de função e tipos estruturais.

Também você pode estar interessado no Linux rastreador a montante e Linux Abi Tracker Serviços. Ambos são alimentados pela ferramenta ABI compliance-checker.

Eu me lembro no trabalho que eles usaram GCC XML Para testar compatibilidade binária. Basicamente, o que ele faz é gerar uma representação XML da árvore de objeto do compilador. A teoria diz que, se o XML é equivalente, eles foram mantidos com compatibilidade binária.

A única maneira segura de fazer isso é exportar sua biblioteca usando uma interface C. Uma biblioteca C ++ é compatível apenas com o compilador que você usa para compilá -lo.

Nosso C ++ Smart diferenciador A ferramenta compara dois arquivos de origem e relata diferenças em termos de estruturas de idiomas (identificadores, expressões, declarações, ...) e ações de edição plausíveis (inserir, excluir, mover, copiar, substituir-se, ...).

Ele não responde diretamente à pergunta da ABI, mas as informações que ela fornece podem ser bastante úteis. Um exemplo discutido em outra resposta é o tipo de mudança de retorno de estrutura {a, b} para estrutura {b, a}. SmartDifference relataria que uma foi movido. (Nota: uma ferramenta Diff regular relataria que a linha que contém a definição da estrutura foi alterada, para que você tenha as mesmas informações, mas a SmartDifference ignorará as alterações nos espaços em branco/layout e nos comentários também, produzindo menos ruído conceitual).

O que nenhuma dessas ferramentas relatará é a alteração da definição de um typedef, ela está em outro arquivo de cabeçalho. Mas, presumivelmente, um compararia todos os arquivos de cabeçalho envolvidos. Se você não quiser fazer isso manualmente, qualquer ferramenta em uso deve incluir essencialmente um analisador C ++ completo, resolvedor de nome e deve comparar as declarações de equivalência. Outro pôster sugeriu praticamente essa resposta: comparando a saída GCCXML para equivalência. Não tenho certeza de como isso é fácil na prática; Não pode ser apenas "os arquivos são os mesmos XML em ordem?".

ABI - A interface binária do aplicativo se resume à maneira como o compilador traduz o código -fonte nas instruções reconhecíveis pela máquina. A mesma linha de origem pode ser traduzida para diferentes fluxos de bytes, no programa final.

Um analisador estático executado sobre o código -fonte não poderá prever como o compilador o traduzirá. Essa decisão é tomada na codificação ou configurações do compilador. Portanto, não acredito que um analisador estático seja útil para você neste caso.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top