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-violations
configuraçã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.