[ubsan] Fix complaint in NewArray when size == 0

While strictly speaking it is legal (though useless) to dynamically
create zero-length arrays with "new T[0]", UBSan does not like it,
so this CL avoids doing it. It fixes the error:

../../src/allocation.h:41:34: runtime error: constructor call on
address 0x... with insufficient space for an object of type 'unsigned char'

Bug: v8:3770
Change-Id: I5017767c59df0d8928f7493f92d2d04519083964
Reviewed-on: https://chromium-review.googlesource.com/c/1356902
Reviewed-by: Bill Budge <bbudge@chromium.org>
Commit-Queue: Jakob Kummerow <jkummerow@chromium.org>
Cr-Commit-Position: refs/heads/master@{#57984}
This commit is contained in:
Jakob Kummerow 2018-11-30 16:34:05 -08:00 committed by Commit Bot
parent 9d51166419
commit 421807599d
2 changed files with 5 additions and 1 deletions

View File

@ -15,6 +15,9 @@ void CallInterfaceDescriptorData::InitializePlatformSpecific(
register_param_count_ = register_parameter_count;
// UBSan doesn't like creating zero-length arrays.
if (register_parameter_count == 0) return;
// InterfaceDescriptor owns a copy of the registers array.
register_params_ = NewArray<Register>(register_parameter_count, no_reg);
for (int i = 0; i < register_parameter_count; i++) {

View File

@ -145,7 +145,8 @@ class V8_EXPORT_PRIVATE CallInterfaceDescriptorData {
private:
bool IsInitializedPlatformSpecific() const {
const bool initialized =
register_param_count_ >= 0 && register_params_ != nullptr;
(register_param_count_ == 0 && register_params_ == nullptr) ||
(register_param_count_ > 0 && register_params_ != nullptr);
// Platform-specific initialization happens before platform-independent.
return initialized;
}