Existe uma maneira de detectar violações do ODR de função em linha?

Então, eu tenho esse código em 2 unidades de tradução separadas:

// a.cpp
#include <stdio.h>
inline int func() { return 5; }
int proxy();
int main() { printf("%d", func() + proxy()); }

// b.cpp
inline int func() { return 6; }
int proxy() { return func(); }

Quando compilado normalmente, o resultado é10. Quando compilado com -O3 (inlining on), recebo11.

Fiz claramente uma violação do ODR porfunc().

Ele apareceu quando comecei a mesclar fontes de DLLs diferentes em menos DLLs.

Eu tentei:

GCC 5.1-Wodr (o que exige-flto)vinculador de ouro com-detect-odr-violationsconfiguraçãoASAN_OPTIONS=detect_odr_violation=1 antes de executar um binário instrumentado com o desinfetante de endereço.

Asan supostamente pode pegar outras violações de ODR (vars globais com tipos diferentes ou algo assim ...)

Este é um problema C ++ realmente desagradável e eu souespantado não há ferramentas confiáveis para detectá-lo.

Talvez eu tenha usado mal uma das ferramentas que tentei? Ou existe uma ferramenta diferente para isso?

EDITAR:

O problema permanece despercebido, mesmo quando eu faço as 2 implementações defunc() drasticamente diferentes para que não sejam compilados com a mesma quantidade de instruções.

Isso também afeta os métodos de classe definidos dentro do corpo da classe - eles estão implicitamente alinhados.

// a.cpp
struct A { int data; A() : data(5){} };

// b.cpp
struct A { int data; A() : data(6){} };

Código legado com muitas cópias / colagens + pequenas modificações depois disso é uma alegria.

questionAnswers(2)

yourAnswerToTheQuestion