ref: ad228021b3caa4924dd854c8f193d1219095c80f
parent: 0aa83d61a18fbdd5921247e0401b0fbba443cf35
author: Matthias Räncker <[email protected]>
date: Wed Sep 19 05:47:27 EDT 2018
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 <[email protected]> Change-Id: I8e91a4fba5438c9b3e93fa398f789115ab86b521
--- a/third_party/googletest/README.libvpx
+++ b/third_party/googletest/README.libvpx
@@ -20,3 +20,7 @@
LICENSE
README.md
src
+
+- Make WithParamInterface<T>::GetParam static in order to avoid
+ initialization issues
+ https://github.com/google/googletest/pull/1830
--- a/third_party/googletest/src/include/gtest/gtest.h
+++ b/third_party/googletest/src/include/gtest/gtest.h
@@ -1775,11 +1775,8 @@
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?";