diff options
author | Matthias Räncker <theonetruecamper@gmx.de> | 2018-09-19 09:47:27 +0200 |
---|---|---|
committer | Matthias Räncker <theonetruecamper@gmx.de> | 2018-09-20 11:51:26 +0200 |
commit | ad228021b3caa4924dd854c8f193d1219095c80f (patch) | |
tree | 49c1ea521321588fe5e6eb308681980fa3d5a57d /third_party/googletest/src | |
parent | 0aa83d61a18fbdd5921247e0401b0fbba443cf35 (diff) | |
download | libvpx-ad228021b3caa4924dd854c8f193d1219095c80f.tar libvpx-ad228021b3caa4924dd854c8f193d1219095c80f.tar.gz libvpx-ad228021b3caa4924dd854c8f193d1219095c80f.tar.bz2 libvpx-ad228021b3caa4924dd854c8f193d1219095c80f.zip |
fix UB when initializing parameterized tests
When running tests built with
-fsanitize=undefined and--disable-optimizations
the sanitizer will emit errors of the following general form:
runtime error: member call on address 0xxxxxxxxx which does not
point to an object of type 'WithParamInterface'
0xxxxxxxxx: note: object has invalid vptr
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ...
^~~~~~~~~~~~~~~~~~~~~~~
invalid vptr
This can be traced to calls to WithParamInterface<T>::GetParam before
the object argument has been initialized. Although GetParam only
accesses static data it is a non-static member function. This causes
that call to have undefined behaviour.
The patch makes GetParam a static member function.
upstream pull request:
https://github.com/google/googletest/pull/1830
The alternative - if the pull request is denied - would be to
modify all parameterized tests to have them derive from
::libvpx_test::CodecTestWith*Params as the first base class.
Signed-off-by: Matthias Räncker <theonetruecamper@gmx.de>
Change-Id: I8e91a4fba5438c9b3e93fa398f789115ab86b521
Diffstat (limited to 'third_party/googletest/src')
-rw-r--r-- | third_party/googletest/src/include/gtest/gtest.h | 7 |
1 files changed, 2 insertions, 5 deletions
diff --git a/third_party/googletest/src/include/gtest/gtest.h b/third_party/googletest/src/include/gtest/gtest.h index 26e787d99..456e4a849 100644 --- a/third_party/googletest/src/include/gtest/gtest.h +++ b/third_party/googletest/src/include/gtest/gtest.h @@ -1775,11 +1775,8 @@ class WithParamInterface { virtual ~WithParamInterface() {} // The current parameter value. Is also available in the test fixture's - // constructor. This member function is non-static, even though it only - // references static data, to reduce the opportunity for incorrect uses - // like writing 'WithParamInterface<bool>::GetParam()' for a test that - // uses a fixture whose parameter type is int. - const ParamType& GetParam() const { + // constructor. + static const ParamType& GetParam() { GTEST_CHECK_(parameter_ != NULL) << "GetParam() can only be called inside a value-parameterized test " << "-- did you intend to write TEST_P instead of TEST_F?"; |