Commit b93e7415 authored by Miguel Casas's avatar Miguel Casas Committed by Commit Bot

media PRESUBMIT: add warning for V4L2 initialized as aggregate

V4L2 structs are often composed of unions of other structs. When such a
struct is initialized as an aggregate with a braced-init-list, only the
first union member is actually initialized. If posterior union members
are larger, they are left partially initialized. This CL adds a
presubmit for users to avoid such ={} initialization.

Bug: b:153935975
Change-Id: If52bb7b670fe5914e864a6d840f6064cae8b7baf
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2300274
Commit-Queue: Miguel Casas <mcasas@chromium.org>
Reviewed-by: default avatarDale Curtis <dalecurtis@chromium.org>
Reviewed-by: default avatarAlexandre Courbot <acourbot@chromium.org>
Cr-Commit-Position: refs/heads/master@{#790835}
parent 5ab30647
...@@ -205,6 +205,29 @@ def _CheckNoLoggingOverrideInHeaders(input_api, output_api): ...@@ -205,6 +205,29 @@ def _CheckNoLoggingOverrideInHeaders(input_api, output_api):
files) ] files) ]
return [] return []
def _CheckForNoV4L2AggregateInitialization(input_api, output_api):
"""Check that struct v4l2_* are not initialized as aggregates with a
braced-init-list"""
problems = []
v4l2_aggregate_initializer_re = re.compile(r'(^|\W)struct.+v4l2_.+=.+{+}+;')
for f in input_api.AffectedSourceFiles(_FilterFile):
for line_number, line in f.ChangedContents():
if v4l2_aggregate_initializer_re.search(line):
problems.append('%s:%d' % (f, line_number))
if problems:
return [output_api.PresubmitPromptWarning(
'Avoid initializing V4L2 structures with braced-init-lists, i.e. as '
'aggregates. V4L2 structs often contain unions of various sized members: '
'when a union is initialized by aggregate initialization, only the first '
'non-static member is initialized, leaving other members unitialized if '
'they are larger. Use memset instead.',
problems)]
return []
def _CheckChange(input_api, output_api): def _CheckChange(input_api, output_api):
results = [] results = []
results.extend(_CheckForUseOfWrongClock(input_api, output_api)) results.extend(_CheckForUseOfWrongClock(input_api, output_api))
...@@ -212,6 +235,7 @@ def _CheckChange(input_api, output_api): ...@@ -212,6 +235,7 @@ def _CheckChange(input_api, output_api):
results.extend(_CheckForHistogramOffByOne(input_api, output_api)) results.extend(_CheckForHistogramOffByOne(input_api, output_api))
results.extend(_CheckForUseOfLazyInstance(input_api, output_api)) results.extend(_CheckForUseOfLazyInstance(input_api, output_api))
results.extend(_CheckNoLoggingOverrideInHeaders(input_api, output_api)) results.extend(_CheckNoLoggingOverrideInHeaders(input_api, output_api))
results.extend(_CheckForNoV4L2AggregateInitialization(input_api, output_api))
return results return results
......
...@@ -147,5 +147,28 @@ class HistogramOffByOneTest(unittest.TestCase): ...@@ -147,5 +147,28 @@ class HistogramOffByOneTest(unittest.TestCase):
' kFooMax + 2 /* The max */ );', ' kFooMax + 2 /* The max */ );',
1) 1)
class NoV4L2AggregateInitializationTest(unittest.TestCase):
def testValid(self):
self._testChange(['struct v4l2_format_ format;'], 0)
def testInvalid(self):
self._testChange(['struct v4l2_format format = {};'], 1)
self._testChange([' struct v4l2_format format = {};'], 1)
self._testChange([' struct std::vector<v4l2_format> format[] = {};'], 1)
self._testChange([' struct std::vector<v4l2_format> format[] = {{}};'], 1)
def _testChange(self, content, expected_warnings):
mock_input_api = MockInputApi()
mock_input_api.files.append(MockFile('test.cc', content))
results = PRESUBMIT._CheckForNoV4L2AggregateInitialization(mock_input_api,
MockOutputApi())
if expected_warnings:
self.assertEqual(1, len(results))
self.assertEqual(expected_warnings, len(results[0].items))
else:
self.assertEqual(0, len(results))
if __name__ == '__main__': if __name__ == '__main__':
unittest.main() unittest.main()
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment