Merge changes from topic "b117561179"
* changes:
More verbose error for safe_union invalid access.
safe_union: return error on bad reads
diff --git a/CompoundType.cpp b/CompoundType.cpp
index dd0ea26..6f75d7c 100644
--- a/CompoundType.cpp
+++ b/CompoundType.cpp
@@ -210,9 +210,14 @@
return false;
}
-void CompoundType::emitSafeUnionUnknownDiscriminatorError(Formatter& out,
- const std::string& value) const {
- out << "::android::hardware::details::logAlwaysFatal((\n";
+void CompoundType::emitSafeUnionUnknownDiscriminatorError(Formatter& out, const std::string& value,
+ bool fatal) const {
+ if (fatal) {
+ out << "::android::hardware::details::logAlwaysFatal(";
+ } else {
+ out << "ALOGE(\"%s\", ";
+ }
+ out << "(\n";
out.indent(2, [&] {
out << "\"Unknown union discriminator (value: \" +\n"
<< "std::to_string(" << getUnionDiscriminatorType()->getCppTypeCast(value)
@@ -294,7 +299,14 @@
}
out << "default: ";
- out.block([&] { emitSafeUnionUnknownDiscriminatorError(out, "_hidl_d_primitive"); })
+ out.block([&] {
+ emitSafeUnionUnknownDiscriminatorError(out, "_hidl_d_primitive",
+ !isReader /*fatal*/);
+ if (isReader) {
+ out << "_hidl_err = BAD_VALUE;\n";
+ handleError(out, mode);
+ }
+ })
.endl();
}).endl();
}).endl();
@@ -857,7 +869,10 @@
if (mStyle == STYLE_SAFE_UNION) {
out << "default: ";
- out.block([&] { emitSafeUnionUnknownDiscriminatorError(out, "o.getDiscriminator()"); })
+ out.block([&] {
+ emitSafeUnionUnknownDiscriminatorError(out, "o.getDiscriminator()",
+ true /*fatal*/);
+ })
.endl();
out.unindent();
@@ -905,7 +920,8 @@
if (mStyle == STYLE_SAFE_UNION) {
out << "default: ";
out.block([&] {
- emitSafeUnionUnknownDiscriminatorError(out, "lhs.getDiscriminator()");
+ emitSafeUnionUnknownDiscriminatorError(out, "lhs.getDiscriminator()",
+ true /*fatal*/);
})
.endl();
@@ -1023,7 +1039,12 @@
<< ")) ";
out.block([&] {
- out << "::android::hardware::details::logAlwaysFatal(\"Bad safe_union access.\");\n";
+ out << "LOG_ALWAYS_FATAL(\"Bad safe_union access: safe_union has discriminator %\" "
+ << "PRIu64 \" but discriminator %\" PRIu64 \" was accessed.\",\n";
+ out.indent(2, [&] {
+ out << "static_cast<uint64_t>(hidl_d), "
+ << "static_cast<uint64_t>(hidl_discriminator::" << fieldName << "));";
+ }).endl();
}).endl().endl();
out << "return hidl_u."
@@ -1092,8 +1113,10 @@
}
out << "default: ";
- out.block(
- [&] { emitSafeUnionUnknownDiscriminatorError(out, parameterName + ".hidl_d"); })
+ out.block([&] {
+ emitSafeUnionUnknownDiscriminatorError(out, parameterName + ".hidl_d",
+ true /*fatal*/);
+ })
.endl();
}).endl();
@@ -1215,7 +1238,9 @@
}
out << "default: ";
- out.block([&] { emitSafeUnionUnknownDiscriminatorError(out, "hidl_d"); }).endl();
+ out.block(
+ [&] { emitSafeUnionUnknownDiscriminatorError(out, "hidl_d", true /*fatal*/); })
+ .endl();
}).endl().endl();
}).endl().endl();
@@ -1297,9 +1322,16 @@
}
}
-static void emitJavaSafeUnionUnknownDiscriminatorError(Formatter& out) {
- out << "throw new Error(\"Unknown union discriminator "
- << "(value: \" + hidl_d + \").\");\n";
+static void emitJavaSafeUnionUnknownDiscriminatorError(Formatter& out, bool fatal) {
+ out << "throw new ";
+
+ if (fatal) {
+ out << "Error";
+ } else {
+ out << "IllegalStateException";
+ }
+
+ out << "(\"Unknown union discriminator (value: \" + hidl_d + \").\");\n";
}
void CompoundType::emitJavaTypeDeclarations(Formatter& out, bool atTopLevel) const {
@@ -1543,7 +1575,8 @@
if (mStyle == STYLE_SAFE_UNION) {
out << "default: ";
- out.block([&] { emitJavaSafeUnionUnknownDiscriminatorError(out); }).endl();
+ out.block([&] { emitJavaSafeUnionUnknownDiscriminatorError(out, true /*fatal*/); })
+ .endl();
out.unindent();
out << "}\n";
@@ -1589,7 +1622,8 @@
if (mStyle == STYLE_SAFE_UNION) {
out << "default: ";
- out.block([&] { emitJavaSafeUnionUnknownDiscriminatorError(out); }).endl();
+ out.block([&] { emitJavaSafeUnionUnknownDiscriminatorError(out, false /*fatal*/); })
+ .endl();
out.unindent();
out << "}\n";
@@ -1682,7 +1716,8 @@
if (mStyle == STYLE_SAFE_UNION) {
out << "default: ";
- out.block([&] { emitJavaSafeUnionUnknownDiscriminatorError(out); }).endl();
+ out.block([&] { emitJavaSafeUnionUnknownDiscriminatorError(out, false /*fatal*/); })
+ .endl();
out.unindent();
out << "}\n";
@@ -1722,7 +1757,8 @@
if (mStyle == STYLE_SAFE_UNION) {
out << "default: ";
- out.block([&] { emitJavaSafeUnionUnknownDiscriminatorError(out); }).endl();
+ out.block([&] { emitJavaSafeUnionUnknownDiscriminatorError(out, true /*fatal*/); })
+ .endl();
out.unindent();
out << "}\n";
@@ -1811,7 +1847,8 @@
if (mStyle == STYLE_SAFE_UNION) {
out << "default: ";
- out.block([&] { emitJavaSafeUnionUnknownDiscriminatorError(out); }).endl();
+ out.block([&] { emitJavaSafeUnionUnknownDiscriminatorError(out, true /*fatal*/); })
+ .endl();
out.unindent();
out << "}\n";
diff --git a/CompoundType.h b/CompoundType.h
index 75b93db..e02090a 100644
--- a/CompoundType.h
+++ b/CompoundType.h
@@ -176,7 +176,8 @@
void emitSafeUnionTypeDeclarations(Formatter& out) const;
std::unique_ptr<ScalarType> getUnionDiscriminatorType() const;
- void emitSafeUnionUnknownDiscriminatorError(Formatter& out, const std::string& value) const;
+ void emitSafeUnionUnknownDiscriminatorError(Formatter& out, const std::string& value,
+ bool fatal) const;
void emitSafeUnionCopyAndAssignDefinition(Formatter& out,
const std::string& parameterName,
diff --git a/generateCpp.cpp b/generateCpp.cpp
index fb930c3..130a0b9 100644
--- a/generateCpp.cpp
+++ b/generateCpp.cpp
@@ -794,7 +794,7 @@
<< mPackage.string() << "::" << baseName
<< "\"\n\n";
- out << "#include <android/log.h>\n";
+ out << "#include <log/log.h>\n";
out << "#include <cutils/trace.h>\n";
out << "#include <hidl/HidlTransportSupport.h>\n\n";
out << "#include <hidl/Static.h>\n";