Merge pull request #21527 from vrabaud:3.4_msan

* Fix wrong MSAN errors.

Because Fortran is called in Lapack, MSAN does not think the memory
has been written even though it is the case.
MSAN does no support well cross-language memory analysis.

* Make a dedicated check.
This commit is contained in:
Vincent Rabaud 2022-01-28 16:35:47 +01:00 committed by GitHub
parent dc35633aa4
commit b5b52afd35
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -239,6 +239,21 @@ lapack_SVD(fptype* a, size_t a_step, fptype *w, fptype* u, size_t u_step, fptype
else if(typeid(fptype) == typeid(double))
OCV_LAPACK_FUNC(dgesdd)(mode, &m, &n, (double*)a, &lda, (double*)w, (double*)u, &ldu, (double*)vt, &ldv, (double*)buffer, &lwork, iworkBuf, info);
#if defined(__clang__) && defined(__has_feature)
#if __has_feature(memory_sanitizer)
// Make sure MSAN sees the memory as having been written.
// MSAN does not think it has been written because a different language was called.
__msan_unpoison(a, a_step * n);
__msan_unpoison(buffer, sizeof(fptype) * (lwork + 1));
if (u)
__msan_unpoison(u, u_step * m);
if (vt)
__msan_unpoison(vt, v_step * n);
if (w)
__msan_unpoison(w, sizeof(fptype) * std::min(m, n));
#endif // __has_feature(memory_sanitizer)
#endif // defined(__clang__) && defined(__has_feature)
if(!(flags & CV_HAL_SVD_NO_UV))
transpose_square_inplace(vt, ldv, n);