From: Matthias Räncker Date: Wed, 19 Sep 2018 07:47:27 +0000 (+0200) Subject: fix UB when initializing parameterized tests X-Git-Tag: v1.8.0~312^2 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=ad228021b3caa4924dd854c8f193d1219095c80f;p=libvpx 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::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 Change-Id: I8e91a4fba5438c9b3e93fa398f789115ab86b521 --- diff --git a/third_party/googletest/README.libvpx b/third_party/googletest/README.libvpx index da6f77804..f4ca22bba 100644 --- a/third_party/googletest/README.libvpx +++ b/third_party/googletest/README.libvpx @@ -20,3 +20,7 @@ Local Modifications: LICENSE README.md src + +- Make WithParamInterface::GetParam static in order to avoid + initialization issues + https://github.com/google/googletest/pull/1830 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::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?";