From d026c88b3429e5d81a6736b4e759bf243400e81c Mon Sep 17 00:00:00 2001 From: Jayant Chowdhary Date: Wed, 24 Jan 2018 15:02:18 -0800 Subject: [PATCH] Do not dump records not visible outside a translation unit. Also use non-mangled name for C structs and enums as their unique id. We do this as attempt to protect against bugs similar to those mentioned in https://android-review.googlesource.com/c/platform/external/clang/+/599002 which might not have been discovered yet. Bug: 71486971 Test: Build android source tree for aosp_arm64_ab with -no-filter on header-abi-dumper. Test: tests/test.py Change-Id: I3e25425d9f3015cd7dece3bd5a27f88e050c1acb --- .../header-abi-dumper/src/abi_wrappers.cpp | 11 +++++++---- .../header-abi-dumper/src/ast_processing.cpp | 3 ++- vndk/tools/header-checker/tests/expected/example1.cpp | 6 +++--- vndk/tools/header-checker/tests/expected/example1.h | 6 +++--- .../tests/reference_dumps/arm/libc_and_cpp.so.lsdump | 4 ++-- .../arm/libc_and_cpp_with_unused_struct.so.lsdump | 4 ++-- .../arm/libgolden_cpp_add_global_variable.so.lsdump | 7 +++++++ .../reference_dumps/arm64/libc_and_cpp.so.lsdump | 4 ++-- .../arm64/libc_and_cpp_with_unused_struct.so.lsdump | 4 ++-- .../arm64/libgolden_cpp_add_global_variable.so.lsdump | 7 +++++++ .../tests/reference_dumps/mips/libc_and_cpp.so.lsdump | 4 ++-- .../mips/libc_and_cpp_with_unused_struct.so.lsdump | 4 ++-- .../mips/libgolden_cpp_add_global_variable.so.lsdump | 7 +++++++ .../reference_dumps/mips64/libc_and_cpp.so.lsdump | 4 ++-- .../mips64/libc_and_cpp_with_unused_struct.so.lsdump | 4 ++-- .../libgolden_cpp_add_global_variable.so.lsdump | 7 +++++++ .../tests/reference_dumps/x86/libc_and_cpp.so.lsdump | 4 ++-- .../x86/libc_and_cpp_with_unused_struct.so.lsdump | 4 ++-- .../x86/libgolden_cpp_add_global_variable.so.lsdump | 7 +++++++ .../reference_dumps/x86_64/libc_and_cpp.so.lsdump | 4 ++-- .../x86_64/libc_and_cpp_with_unused_struct.so.lsdump | 4 ++-- .../libgolden_cpp_add_global_variable.so.lsdump | 7 +++++++ 22 files changed, 81 insertions(+), 35 deletions(-) diff --git a/vndk/tools/header-checker/header-abi-dumper/src/abi_wrappers.cpp b/vndk/tools/header-checker/header-abi-dumper/src/abi_wrappers.cpp index 56792bb33..6ae0ada3f 100644 --- a/vndk/tools/header-checker/header-abi-dumper/src/abi_wrappers.cpp +++ b/vndk/tools/header-checker/header-abi-dumper/src/abi_wrappers.cpp @@ -205,10 +205,13 @@ std::string RecordDeclWrapper::GetMangledRTTI( std::string ABIWrapper::GetTypeUniqueId(const clang::TagDecl *tag_decl) { clang::QualType qual_type = tag_decl->getTypeForDecl()->getCanonicalTypeInternal(); - llvm::SmallString<256> uid; - llvm::raw_svector_ostream out(uid); - mangle_contextp_->mangleCXXRTTIName(qual_type, out); - return uid.str(); + if (!tag_decl->isExternCContext() && ast_contextp_->getLangOpts().CPlusPlus) { + llvm::SmallString<256> uid; + llvm::raw_svector_ostream out(uid); + mangle_contextp_->mangleCXXRTTIName(qual_type, out); + return uid.str(); + } + return QualTypeToString(qual_type); } // CreateBasicNamedAndTypedDecl creates a BasicNamedAndTypedDecl : that'll diff --git a/vndk/tools/header-checker/header-abi-dumper/src/ast_processing.cpp b/vndk/tools/header-checker/header-abi-dumper/src/ast_processing.cpp index 038f64b08..71bd19df2 100644 --- a/vndk/tools/header-checker/header-abi-dumper/src/ast_processing.cpp +++ b/vndk/tools/header-checker/header-abi-dumper/src/ast_processing.cpp @@ -51,7 +51,8 @@ bool HeaderASTVisitor::VisitRecordDecl(const clang::RecordDecl *decl) { if (!decl->isThisDeclarationADefinition() || decl->getTypeForDecl()->isDependentType() || decl->isAnonymousStructOrUnion() || - !decl->hasNameForLinkage()) { + !decl->hasNameForLinkage() || + !decl->isExternallyVisible()) { return true; } RecordDeclWrapper record_decl_wrapper( diff --git a/vndk/tools/header-checker/tests/expected/example1.cpp b/vndk/tools/header-checker/tests/expected/example1.cpp index ebc3f7549..b1770a2a3 100644 --- a/vndk/tools/header-checker/tests/expected/example1.cpp +++ b/vndk/tools/header-checker/tests/expected/example1.cpp @@ -211,7 +211,7 @@ record_types { is_anonymous: true record_kind: struct_kind tag_info { - unique_id: "_ZTSN5HelloUt1_Ut_E" + unique_id: "Hello::(anonymous)::(anonymous)" } } record_types { @@ -246,7 +246,7 @@ record_types { is_anonymous: true record_kind: struct_kind tag_info { - unique_id: "_ZTSN5HelloUt1_E" + unique_id: "Hello::(anonymous)" } } record_types { @@ -298,7 +298,7 @@ record_types { access: public_access record_kind: struct_kind tag_info { - unique_id: "_ZTS5Hello" + unique_id: "Hello" } } record_types { diff --git a/vndk/tools/header-checker/tests/expected/example1.h b/vndk/tools/header-checker/tests/expected/example1.h index ebc3f7549..b1770a2a3 100644 --- a/vndk/tools/header-checker/tests/expected/example1.h +++ b/vndk/tools/header-checker/tests/expected/example1.h @@ -211,7 +211,7 @@ record_types { is_anonymous: true record_kind: struct_kind tag_info { - unique_id: "_ZTSN5HelloUt1_Ut_E" + unique_id: "Hello::(anonymous)::(anonymous)" } } record_types { @@ -246,7 +246,7 @@ record_types { is_anonymous: true record_kind: struct_kind tag_info { - unique_id: "_ZTSN5HelloUt1_E" + unique_id: "Hello::(anonymous)" } } record_types { @@ -298,7 +298,7 @@ record_types { access: public_access record_kind: struct_kind tag_info { - unique_id: "_ZTS5Hello" + unique_id: "Hello" } } record_types { diff --git a/vndk/tools/header-checker/tests/reference_dumps/arm/libc_and_cpp.so.lsdump b/vndk/tools/header-checker/tests/reference_dumps/arm/libc_and_cpp.so.lsdump index 90514f7f8..0b2bc23ec 100644 --- a/vndk/tools/header-checker/tests/reference_dumps/arm/libc_and_cpp.so.lsdump +++ b/vndk/tools/header-checker/tests/reference_dumps/arm/libc_and_cpp.so.lsdump @@ -51,7 +51,7 @@ record_types { access: public_access record_kind: struct_kind tag_info { - unique_id: "_ZTS7Cstruct" + unique_id: "Cstruct" } } record_types { @@ -73,7 +73,7 @@ record_types { access: public_access record_kind: struct_kind tag_info { - unique_id: "_ZTS6Cinner" + unique_id: "Cinner" } } pointer_types { diff --git a/vndk/tools/header-checker/tests/reference_dumps/arm/libc_and_cpp_with_unused_struct.so.lsdump b/vndk/tools/header-checker/tests/reference_dumps/arm/libc_and_cpp_with_unused_struct.so.lsdump index 610c5c615..03a7bd98d 100644 --- a/vndk/tools/header-checker/tests/reference_dumps/arm/libc_and_cpp_with_unused_struct.so.lsdump +++ b/vndk/tools/header-checker/tests/reference_dumps/arm/libc_and_cpp_with_unused_struct.so.lsdump @@ -45,7 +45,7 @@ record_types { access: public_access record_kind: struct_kind tag_info { - unique_id: "_ZTS7Cstruct" + unique_id: "Cstruct" } } record_types { @@ -67,7 +67,7 @@ record_types { access: public_access record_kind: struct_kind tag_info { - unique_id: "_ZTS6Cinner" + unique_id: "Cinner" } } record_types { diff --git a/vndk/tools/header-checker/tests/reference_dumps/arm/libgolden_cpp_add_global_variable.so.lsdump b/vndk/tools/header-checker/tests/reference_dumps/arm/libgolden_cpp_add_global_variable.so.lsdump index e2e0214aa..e427156f9 100644 --- a/vndk/tools/header-checker/tests/reference_dumps/arm/libgolden_cpp_add_global_variable.so.lsdump +++ b/vndk/tools/header-checker/tests/reference_dumps/arm/libgolden_cpp_add_global_variable.so.lsdump @@ -401,6 +401,13 @@ functions { linker_set_key: "_ZN17HighVolumeSpeaker6ListenEv" access: public_access } +global_vars { + name: "HighVolumeSpeaker::global_unprotected_id" + source_file: "/development/vndk/tools/header-checker/tests/integration/cpp/gold/include/high_volume_speaker.h" + linker_set_key: "_ZN17HighVolumeSpeaker21global_unprotected_idE" + referenced_type: "type-2" + access: public_access +} elf_functions { name: "_Z26test_virtual_function_callP12SuperSpeaker" } diff --git a/vndk/tools/header-checker/tests/reference_dumps/arm64/libc_and_cpp.so.lsdump b/vndk/tools/header-checker/tests/reference_dumps/arm64/libc_and_cpp.so.lsdump index d72294e6e..d08357cbb 100644 --- a/vndk/tools/header-checker/tests/reference_dumps/arm64/libc_and_cpp.so.lsdump +++ b/vndk/tools/header-checker/tests/reference_dumps/arm64/libc_and_cpp.so.lsdump @@ -51,7 +51,7 @@ record_types { access: public_access record_kind: struct_kind tag_info { - unique_id: "_ZTS7Cstruct" + unique_id: "Cstruct" } } record_types { @@ -73,7 +73,7 @@ record_types { access: public_access record_kind: struct_kind tag_info { - unique_id: "_ZTS6Cinner" + unique_id: "Cinner" } } pointer_types { diff --git a/vndk/tools/header-checker/tests/reference_dumps/arm64/libc_and_cpp_with_unused_struct.so.lsdump b/vndk/tools/header-checker/tests/reference_dumps/arm64/libc_and_cpp_with_unused_struct.so.lsdump index 0e9e1da52..498122ac2 100644 --- a/vndk/tools/header-checker/tests/reference_dumps/arm64/libc_and_cpp_with_unused_struct.so.lsdump +++ b/vndk/tools/header-checker/tests/reference_dumps/arm64/libc_and_cpp_with_unused_struct.so.lsdump @@ -45,7 +45,7 @@ record_types { access: public_access record_kind: struct_kind tag_info { - unique_id: "_ZTS7Cstruct" + unique_id: "Cstruct" } } record_types { @@ -67,7 +67,7 @@ record_types { access: public_access record_kind: struct_kind tag_info { - unique_id: "_ZTS6Cinner" + unique_id: "Cinner" } } record_types { diff --git a/vndk/tools/header-checker/tests/reference_dumps/arm64/libgolden_cpp_add_global_variable.so.lsdump b/vndk/tools/header-checker/tests/reference_dumps/arm64/libgolden_cpp_add_global_variable.so.lsdump index e8367b575..4cf33736d 100644 --- a/vndk/tools/header-checker/tests/reference_dumps/arm64/libgolden_cpp_add_global_variable.so.lsdump +++ b/vndk/tools/header-checker/tests/reference_dumps/arm64/libgolden_cpp_add_global_variable.so.lsdump @@ -401,6 +401,13 @@ functions { linker_set_key: "_ZN17HighVolumeSpeaker6ListenEv" access: public_access } +global_vars { + name: "HighVolumeSpeaker::global_unprotected_id" + source_file: "/development/vndk/tools/header-checker/tests/integration/cpp/gold/include/high_volume_speaker.h" + linker_set_key: "_ZN17HighVolumeSpeaker21global_unprotected_idE" + referenced_type: "type-2" + access: public_access +} elf_functions { name: "_Z26test_virtual_function_callP12SuperSpeaker" } diff --git a/vndk/tools/header-checker/tests/reference_dumps/mips/libc_and_cpp.so.lsdump b/vndk/tools/header-checker/tests/reference_dumps/mips/libc_and_cpp.so.lsdump index 90514f7f8..0b2bc23ec 100644 --- a/vndk/tools/header-checker/tests/reference_dumps/mips/libc_and_cpp.so.lsdump +++ b/vndk/tools/header-checker/tests/reference_dumps/mips/libc_and_cpp.so.lsdump @@ -51,7 +51,7 @@ record_types { access: public_access record_kind: struct_kind tag_info { - unique_id: "_ZTS7Cstruct" + unique_id: "Cstruct" } } record_types { @@ -73,7 +73,7 @@ record_types { access: public_access record_kind: struct_kind tag_info { - unique_id: "_ZTS6Cinner" + unique_id: "Cinner" } } pointer_types { diff --git a/vndk/tools/header-checker/tests/reference_dumps/mips/libc_and_cpp_with_unused_struct.so.lsdump b/vndk/tools/header-checker/tests/reference_dumps/mips/libc_and_cpp_with_unused_struct.so.lsdump index 610c5c615..03a7bd98d 100644 --- a/vndk/tools/header-checker/tests/reference_dumps/mips/libc_and_cpp_with_unused_struct.so.lsdump +++ b/vndk/tools/header-checker/tests/reference_dumps/mips/libc_and_cpp_with_unused_struct.so.lsdump @@ -45,7 +45,7 @@ record_types { access: public_access record_kind: struct_kind tag_info { - unique_id: "_ZTS7Cstruct" + unique_id: "Cstruct" } } record_types { @@ -67,7 +67,7 @@ record_types { access: public_access record_kind: struct_kind tag_info { - unique_id: "_ZTS6Cinner" + unique_id: "Cinner" } } record_types { diff --git a/vndk/tools/header-checker/tests/reference_dumps/mips/libgolden_cpp_add_global_variable.so.lsdump b/vndk/tools/header-checker/tests/reference_dumps/mips/libgolden_cpp_add_global_variable.so.lsdump index e2e0214aa..e427156f9 100644 --- a/vndk/tools/header-checker/tests/reference_dumps/mips/libgolden_cpp_add_global_variable.so.lsdump +++ b/vndk/tools/header-checker/tests/reference_dumps/mips/libgolden_cpp_add_global_variable.so.lsdump @@ -401,6 +401,13 @@ functions { linker_set_key: "_ZN17HighVolumeSpeaker6ListenEv" access: public_access } +global_vars { + name: "HighVolumeSpeaker::global_unprotected_id" + source_file: "/development/vndk/tools/header-checker/tests/integration/cpp/gold/include/high_volume_speaker.h" + linker_set_key: "_ZN17HighVolumeSpeaker21global_unprotected_idE" + referenced_type: "type-2" + access: public_access +} elf_functions { name: "_Z26test_virtual_function_callP12SuperSpeaker" } diff --git a/vndk/tools/header-checker/tests/reference_dumps/mips64/libc_and_cpp.so.lsdump b/vndk/tools/header-checker/tests/reference_dumps/mips64/libc_and_cpp.so.lsdump index d72294e6e..d08357cbb 100644 --- a/vndk/tools/header-checker/tests/reference_dumps/mips64/libc_and_cpp.so.lsdump +++ b/vndk/tools/header-checker/tests/reference_dumps/mips64/libc_and_cpp.so.lsdump @@ -51,7 +51,7 @@ record_types { access: public_access record_kind: struct_kind tag_info { - unique_id: "_ZTS7Cstruct" + unique_id: "Cstruct" } } record_types { @@ -73,7 +73,7 @@ record_types { access: public_access record_kind: struct_kind tag_info { - unique_id: "_ZTS6Cinner" + unique_id: "Cinner" } } pointer_types { diff --git a/vndk/tools/header-checker/tests/reference_dumps/mips64/libc_and_cpp_with_unused_struct.so.lsdump b/vndk/tools/header-checker/tests/reference_dumps/mips64/libc_and_cpp_with_unused_struct.so.lsdump index 0e9e1da52..498122ac2 100644 --- a/vndk/tools/header-checker/tests/reference_dumps/mips64/libc_and_cpp_with_unused_struct.so.lsdump +++ b/vndk/tools/header-checker/tests/reference_dumps/mips64/libc_and_cpp_with_unused_struct.so.lsdump @@ -45,7 +45,7 @@ record_types { access: public_access record_kind: struct_kind tag_info { - unique_id: "_ZTS7Cstruct" + unique_id: "Cstruct" } } record_types { @@ -67,7 +67,7 @@ record_types { access: public_access record_kind: struct_kind tag_info { - unique_id: "_ZTS6Cinner" + unique_id: "Cinner" } } record_types { diff --git a/vndk/tools/header-checker/tests/reference_dumps/mips64/libgolden_cpp_add_global_variable.so.lsdump b/vndk/tools/header-checker/tests/reference_dumps/mips64/libgolden_cpp_add_global_variable.so.lsdump index e8367b575..4cf33736d 100644 --- a/vndk/tools/header-checker/tests/reference_dumps/mips64/libgolden_cpp_add_global_variable.so.lsdump +++ b/vndk/tools/header-checker/tests/reference_dumps/mips64/libgolden_cpp_add_global_variable.so.lsdump @@ -401,6 +401,13 @@ functions { linker_set_key: "_ZN17HighVolumeSpeaker6ListenEv" access: public_access } +global_vars { + name: "HighVolumeSpeaker::global_unprotected_id" + source_file: "/development/vndk/tools/header-checker/tests/integration/cpp/gold/include/high_volume_speaker.h" + linker_set_key: "_ZN17HighVolumeSpeaker21global_unprotected_idE" + referenced_type: "type-2" + access: public_access +} elf_functions { name: "_Z26test_virtual_function_callP12SuperSpeaker" } diff --git a/vndk/tools/header-checker/tests/reference_dumps/x86/libc_and_cpp.so.lsdump b/vndk/tools/header-checker/tests/reference_dumps/x86/libc_and_cpp.so.lsdump index 90514f7f8..0b2bc23ec 100644 --- a/vndk/tools/header-checker/tests/reference_dumps/x86/libc_and_cpp.so.lsdump +++ b/vndk/tools/header-checker/tests/reference_dumps/x86/libc_and_cpp.so.lsdump @@ -51,7 +51,7 @@ record_types { access: public_access record_kind: struct_kind tag_info { - unique_id: "_ZTS7Cstruct" + unique_id: "Cstruct" } } record_types { @@ -73,7 +73,7 @@ record_types { access: public_access record_kind: struct_kind tag_info { - unique_id: "_ZTS6Cinner" + unique_id: "Cinner" } } pointer_types { diff --git a/vndk/tools/header-checker/tests/reference_dumps/x86/libc_and_cpp_with_unused_struct.so.lsdump b/vndk/tools/header-checker/tests/reference_dumps/x86/libc_and_cpp_with_unused_struct.so.lsdump index 610c5c615..03a7bd98d 100644 --- a/vndk/tools/header-checker/tests/reference_dumps/x86/libc_and_cpp_with_unused_struct.so.lsdump +++ b/vndk/tools/header-checker/tests/reference_dumps/x86/libc_and_cpp_with_unused_struct.so.lsdump @@ -45,7 +45,7 @@ record_types { access: public_access record_kind: struct_kind tag_info { - unique_id: "_ZTS7Cstruct" + unique_id: "Cstruct" } } record_types { @@ -67,7 +67,7 @@ record_types { access: public_access record_kind: struct_kind tag_info { - unique_id: "_ZTS6Cinner" + unique_id: "Cinner" } } record_types { diff --git a/vndk/tools/header-checker/tests/reference_dumps/x86/libgolden_cpp_add_global_variable.so.lsdump b/vndk/tools/header-checker/tests/reference_dumps/x86/libgolden_cpp_add_global_variable.so.lsdump index e2e0214aa..e427156f9 100644 --- a/vndk/tools/header-checker/tests/reference_dumps/x86/libgolden_cpp_add_global_variable.so.lsdump +++ b/vndk/tools/header-checker/tests/reference_dumps/x86/libgolden_cpp_add_global_variable.so.lsdump @@ -401,6 +401,13 @@ functions { linker_set_key: "_ZN17HighVolumeSpeaker6ListenEv" access: public_access } +global_vars { + name: "HighVolumeSpeaker::global_unprotected_id" + source_file: "/development/vndk/tools/header-checker/tests/integration/cpp/gold/include/high_volume_speaker.h" + linker_set_key: "_ZN17HighVolumeSpeaker21global_unprotected_idE" + referenced_type: "type-2" + access: public_access +} elf_functions { name: "_Z26test_virtual_function_callP12SuperSpeaker" } diff --git a/vndk/tools/header-checker/tests/reference_dumps/x86_64/libc_and_cpp.so.lsdump b/vndk/tools/header-checker/tests/reference_dumps/x86_64/libc_and_cpp.so.lsdump index d72294e6e..d08357cbb 100644 --- a/vndk/tools/header-checker/tests/reference_dumps/x86_64/libc_and_cpp.so.lsdump +++ b/vndk/tools/header-checker/tests/reference_dumps/x86_64/libc_and_cpp.so.lsdump @@ -51,7 +51,7 @@ record_types { access: public_access record_kind: struct_kind tag_info { - unique_id: "_ZTS7Cstruct" + unique_id: "Cstruct" } } record_types { @@ -73,7 +73,7 @@ record_types { access: public_access record_kind: struct_kind tag_info { - unique_id: "_ZTS6Cinner" + unique_id: "Cinner" } } pointer_types { diff --git a/vndk/tools/header-checker/tests/reference_dumps/x86_64/libc_and_cpp_with_unused_struct.so.lsdump b/vndk/tools/header-checker/tests/reference_dumps/x86_64/libc_and_cpp_with_unused_struct.so.lsdump index 0e9e1da52..498122ac2 100644 --- a/vndk/tools/header-checker/tests/reference_dumps/x86_64/libc_and_cpp_with_unused_struct.so.lsdump +++ b/vndk/tools/header-checker/tests/reference_dumps/x86_64/libc_and_cpp_with_unused_struct.so.lsdump @@ -45,7 +45,7 @@ record_types { access: public_access record_kind: struct_kind tag_info { - unique_id: "_ZTS7Cstruct" + unique_id: "Cstruct" } } record_types { @@ -67,7 +67,7 @@ record_types { access: public_access record_kind: struct_kind tag_info { - unique_id: "_ZTS6Cinner" + unique_id: "Cinner" } } record_types { diff --git a/vndk/tools/header-checker/tests/reference_dumps/x86_64/libgolden_cpp_add_global_variable.so.lsdump b/vndk/tools/header-checker/tests/reference_dumps/x86_64/libgolden_cpp_add_global_variable.so.lsdump index e8367b575..4cf33736d 100644 --- a/vndk/tools/header-checker/tests/reference_dumps/x86_64/libgolden_cpp_add_global_variable.so.lsdump +++ b/vndk/tools/header-checker/tests/reference_dumps/x86_64/libgolden_cpp_add_global_variable.so.lsdump @@ -401,6 +401,13 @@ functions { linker_set_key: "_ZN17HighVolumeSpeaker6ListenEv" access: public_access } +global_vars { + name: "HighVolumeSpeaker::global_unprotected_id" + source_file: "/development/vndk/tools/header-checker/tests/integration/cpp/gold/include/high_volume_speaker.h" + linker_set_key: "_ZN17HighVolumeSpeaker21global_unprotected_idE" + referenced_type: "type-2" + access: public_access +} elf_functions { name: "_Z26test_virtual_function_callP12SuperSpeaker" }