diff options
| author | Mark Lobodzinski <mark@lunarg.com> | 2017-06-28 10:54:55 -0600 |
|---|---|---|
| committer | Mark Lobodzinski <mark@lunarg.com> | 2017-07-03 14:00:45 -0600 |
| commit | 10fc831ef90f8a532971bfb9f9442e1820f5d98a (patch) | |
| tree | 9cc76b6d20b402446b92914663739b305b9f6aa0 /scripts/parameter_validation_generator.py | |
| parent | 406c5b9ff1700dde9bcc4ae355e7b3dd8db799d3 (diff) | |
| download | usermoji-10fc831ef90f8a532971bfb9f9442e1820f5d98a.tar.xz | |
layers: Wire in VUIDS for count/array implicit checks
Change-Id: I7957ffe9696f86d1a4cc402b612884e6bd2aa590
Diffstat (limited to 'scripts/parameter_validation_generator.py')
| -rw-r--r-- | scripts/parameter_validation_generator.py | 24 |
1 files changed, 16 insertions, 8 deletions
diff --git a/scripts/parameter_validation_generator.py b/scripts/parameter_validation_generator.py index 65e350c1..5268194d 100644 --- a/scripts/parameter_validation_generator.py +++ b/scripts/parameter_validation_generator.py @@ -724,6 +724,8 @@ class ParamCheckerOutputGenerator(OutputGenerator): # # Get VUID identifier from implicit VUID tag def GetVuid(self, vuid_string): + if '->' in vuid_string: + return "VALIDATION_ERROR_UNDEFINED" vuid_num = self.IdToHex(convertVUID(vuid_string)) if vuid_num in self.valid_vuids: vuid = "VALIDATION_ERROR_%s" % vuid_num @@ -798,24 +800,30 @@ class ParamCheckerOutputGenerator(OutputGenerator): return checkExpr # # Generate the pointer check string - def makePointerCheck(self, prefix, value, lenValue, valueRequired, lenValueRequired, lenPtrRequired, funcPrintName, lenPrintName, valuePrintName, postProcSpec): + def makePointerCheck(self, prefix, value, lenValue, valueRequired, lenValueRequired, lenPtrRequired, funcPrintName, lenPrintName, valuePrintName, postProcSpec, struct_type_name): checkExpr = [] if lenValue: + vuid_tag_name = struct_type_name if struct_type_name is not None else funcPrintName + count_required_vuid = self.GetVuid("VUID-%s-%s-arraylength" % (vuid_tag_name, lenValue.name)) + array_required_vuid = self.GetVuid("VUID-%s-%s-parameter" % (vuid_tag_name, value.name)) # This is an array with a pointer to a count value if lenValue.ispointer: # If count and array parameters are optional, there will be no validation if valueRequired == 'true' or lenPtrRequired == 'true' or lenValueRequired == 'true': # When the length parameter is a pointer, there is an extra Boolean parameter in the function call to indicate if it is required - checkExpr.append('skipCall |= validate_array(layer_data->report_data, "{}", {ppp}"{ldn}"{pps}, {ppp}"{dn}"{pps}, {pf}{ln}, {pf}{vn}, {}, {}, {});\n'.format( - funcPrintName, lenPtrRequired, lenValueRequired, valueRequired, ln=lenValue.name, ldn=lenPrintName, dn=valuePrintName, vn=value.name, pf=prefix, **postProcSpec)) + checkExpr.append('skipCall |= validate_array(layer_data->report_data, "{}", {ppp}"{ldn}"{pps}, {ppp}"{dn}"{pps}, {pf}{ln}, {pf}{vn}, {}, {}, {}, {}, {});\n'.format( + funcPrintName, lenPtrRequired, lenValueRequired, valueRequired, count_required_vuid, array_required_vuid, ln=lenValue.name, ldn=lenPrintName, dn=valuePrintName, vn=value.name, pf=prefix, **postProcSpec)) # This is an array with an integer count value else: # If count and array parameters are optional, there will be no validation if valueRequired == 'true' or lenValueRequired == 'true': - # Arrays of strings receive special processing - validationFuncName = 'validate_array' if value.type != 'char' else 'validate_string_array' - checkExpr.append('skipCall |= {}(layer_data->report_data, "{}", {ppp}"{ldn}"{pps}, {ppp}"{dn}"{pps}, {pf}{ln}, {pf}{vn}, {}, {});\n'.format( - validationFuncName, funcPrintName, lenValueRequired, valueRequired, ln=lenValue.name, ldn=lenPrintName, dn=valuePrintName, vn=value.name, pf=prefix, **postProcSpec)) + if value.type != 'char': + checkExpr.append('skipCall |= validate_array(layer_data->report_data, "{}", {ppp}"{ldn}"{pps}, {ppp}"{dn}"{pps}, {pf}{ln}, {pf}{vn}, {}, {}, {}, {});\n'.format( + funcPrintName, lenValueRequired, valueRequired, count_required_vuid, array_required_vuid, ln=lenValue.name, ldn=lenPrintName, dn=valuePrintName, vn=value.name, pf=prefix, **postProcSpec)) + else: + # Arrays of strings receive special processing + checkExpr.append('skipCall |= validate_string_array(layer_data->report_data, "{}", {ppp}"{ldn}"{pps}, {ppp}"{dn}"{pps}, {pf}{ln}, {pf}{vn}, {}, {}, {}, {});\n'.format( + funcPrintName, lenValueRequired, valueRequired, count_required_vuid, array_required_vuid, ln=lenValue.name, ldn=lenPrintName, dn=valuePrintName, vn=value.name, pf=prefix, **postProcSpec)) if checkExpr: if lenValue and ('->' in lenValue.name): # Add checks to ensure the validation call does not dereference a NULL pointer to obtain the count @@ -994,7 +1002,7 @@ class ParamCheckerOutputGenerator(OutputGenerator): if not structTypeName in ['VkDeviceCreateInfo', 'VkInstanceCreateInfo']: usedLines += self.makeStructNextCheck(valuePrefix, value, funcName, valueDisplayName, postProcSpec, structTypeName) else: - usedLines += self.makePointerCheck(valuePrefix, value, lenParam, req, cvReq, cpReq, funcName, lenDisplayName, valueDisplayName, postProcSpec) + usedLines += self.makePointerCheck(valuePrefix, value, lenParam, req, cvReq, cpReq, funcName, lenDisplayName, valueDisplayName, postProcSpec, structTypeName) # # If this is a pointer to a struct (input), see if it contains members that need to be checked if value.type in self.validatedStructs and value.isconst: |
