More Related Content Similar to One definition rule - что это такое, и как с этим жить (20) More from Platonov Sergey (20) One definition rule - что это такое, и как с этим жить5. И ЦИЯ
5
enumeration
enum Foo {
e1,
e2,
eCount
};
const char* FooToString(Foo x);
int main() {
std::cout << FooToString(e2) << std::endl;
return 0;
}
enum Foo {
e1,
eCount
};
const char xxx [] = «can you see me?!!»
const char* msg [eCount] = {
«e1»
};
const char* canYouSeeMe = xxx;
const char* FooToString(Foo x) {return msg[x];}
6. И ЦИЯ
6
struct A : private boost::noncopyable {
A() : x(«0») {}
const std::string x;
int y;
};
void Modify(A& a);
int main() {
A a;
Modify(a);
std::cout << a.x << std::endl;
return 0;
}
struct A : private boost::noncopyable {
A();
int x;
const std::string y;
};
void Modify(A& a) {
a.x += 1;
}
7. И ЦИЯ
7
pragma pack
#pragma pack(push, 1)
struct C {
char c;
uint32_t x;
};
#pragma pack(pop)
void Modify(C* c, size_t pos);
int main() {
std::string x = «0»;
C c[8] = {0};
Modify(c, 6);
std::cout << x << std::endl;
return 0;
}
struct C {
char c;
uint32_t x;
};
void Modify(C* c, size_t pos) {
c[pos].x += 1;
}
8. И ЦИЯ
8
К
• , ,
• + Х assert, core dump, ,
• - « »
•Code review
• - ,
•gcc –Wodr, gold –detect-odr-violations
• +
• - , false positive
•Amalgamation (sqlite)
• +
• -
• -
10. И Е Ы
10
3.2 C++
• , , ,
• non-inline ODR-
used
• , ,
complete.
11. И Е Ы
11
3.2 C++
• non-inline
ODR-used.
• , , inline external
linkage, , . :
• К
• В , TU
14. И Е Ы
14
#pragma detect_mismatch
#pragma detect_mismatch(«my_name», «my_value1») /// cpp1.cpp
#pragma detect_mismatch(«my_name», «my_value2») /// cpp2.cpp
cpp2.obj : error LNK2038: mismatch detected for 'my_name': value ‘my_value ' doesn't match value ‘my_value '
in cpp1.obj
dumpbin /ALL cpp1.obj
Linker Directives
-----------------
/FAILIFMISMATCH:"my_name=my_value1"
/DEFAULTLIB:"MSVCRTD"
/DEFAULTLIB:"OLDNAMES"
25. ODR-CHECK
25
ASTNodeImporter
namespace m { /// 4. NamespaceDecl(NamedDecl, DeclContext)
namespace n { /// 3. NamespaceDecl (NamedDecl, DeclContext)
struct X { /// 2. CXXRecordDecl (..., TypeDecl, DeclContext)
struct Y { /// 1. CXXRecordDecl (..., TypeDecl, DeclContext)
int a; /// <- IMPORT
};
};
}
}
27. ODR-CHECK
27
И cmake
clang++ -DMY_SUPER_DEFINE –Wall –I/my/include –emit-ast source_file.cpp –o source_file.ast
clang++ -cc1 –emit-pch –o lib_file.ast -ast-merge source_file1.ast –ast-merge source_file2.ast
cmake ../src -DCMAKE_TOOLCHAIN_FILE=d:/tools/ClangOdrCheckToolchain.cmake –D...
make
29. ODR-CHECK
29
Sample output
In file included from d:pixelprojectsodr-checkodr-check-testsrcdatasrcm1.cpp:3:
d:pixelprojectsodr-checkodr-check-testsrcdatasrc/h1.h:11:8: warning: type 'struct m::X' has
incompatible definitions in different translation units
struct X
^
d:pixelprojectsodr-checkodr-check-testsrcdatasrc/h1.h:16:7: note: field 'z' has type 'int' here
int z;
^
d:pixelprojectsodr-checkodr-check-testsrcdatasrc/h1.h:11:8: note: no corresponding field here
struct X
^