Merge pull request #24032 from vrabaud:ubsan

Fix undefined behavior with wrong function pointers called.
This commit is contained in:
Alexander Smorkalov 2023-07-21 17:16:12 +03:00 committed by GitHub
commit d69c1d8652
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -46,44 +46,44 @@ mixChannels_( const T** src, const int* sdelta,
} }
static void mixChannels8u( const uchar** src, const int* sdelta, static void mixChannels8u( const void** src, const int* sdelta,
uchar** dst, const int* ddelta, void** dst, const int* ddelta,
int len, int npairs ) int len, int npairs )
{ {
mixChannels_(src, sdelta, dst, ddelta, len, npairs); mixChannels_((const uchar**)src, sdelta, (uchar**)dst, ddelta, len, npairs);
} }
static void mixChannels16u( const ushort** src, const int* sdelta, static void mixChannels16u( const void** src, const int* sdelta,
ushort** dst, const int* ddelta, void** dst, const int* ddelta,
int len, int npairs ) int len, int npairs )
{ {
mixChannels_(src, sdelta, dst, ddelta, len, npairs); mixChannels_((const ushort**)src, sdelta, (ushort**)dst, ddelta, len, npairs);
} }
static void mixChannels32s( const int** src, const int* sdelta, static void mixChannels32s( const void** src, const int* sdelta,
int** dst, const int* ddelta, void** dst, const int* ddelta,
int len, int npairs ) int len, int npairs )
{ {
mixChannels_(src, sdelta, dst, ddelta, len, npairs); mixChannels_((const int**)src, sdelta, (int**)dst, ddelta, len, npairs);
} }
static void mixChannels64s( const int64** src, const int* sdelta, static void mixChannels64s( const void** src, const int* sdelta,
int64** dst, const int* ddelta, void** dst, const int* ddelta,
int len, int npairs ) int len, int npairs )
{ {
mixChannels_(src, sdelta, dst, ddelta, len, npairs); mixChannels_((const int64**)src, sdelta, (int64**)dst, ddelta, len, npairs);
} }
typedef void (*MixChannelsFunc)( const uchar** src, const int* sdelta, typedef void (*MixChannelsFunc)( const void** src, const int* sdelta,
uchar** dst, const int* ddelta, int len, int npairs ); void** dst, const int* ddelta, int len, int npairs );
static MixChannelsFunc getMixchFunc(int depth) static MixChannelsFunc getMixchFunc(int depth)
{ {
static MixChannelsFunc mixchTab[] = static MixChannelsFunc mixchTab[] =
{ {
(MixChannelsFunc)mixChannels8u, (MixChannelsFunc)mixChannels8u, (MixChannelsFunc)mixChannels16u, mixChannels8u, mixChannels8u, mixChannels16u,
(MixChannelsFunc)mixChannels16u, (MixChannelsFunc)mixChannels32s, (MixChannelsFunc)mixChannels32s, mixChannels16u, mixChannels32s, mixChannels32s,
(MixChannelsFunc)mixChannels64s, 0 mixChannels64s, 0
}; };
return mixchTab[depth]; return mixchTab[depth];
@ -158,7 +158,7 @@ void cv::mixChannels( const Mat* src, size_t nsrcs, Mat* dst, size_t ndsts, cons
for( int t = 0; t < total; t += blocksize ) for( int t = 0; t < total; t += blocksize )
{ {
int bsz = std::min(total - t, blocksize); int bsz = std::min(total - t, blocksize);
func( srcs, sdelta, dsts, ddelta, bsz, (int)npairs ); func( (const void**)srcs, sdelta, (void **)dsts, ddelta, bsz, (int)npairs );
if( t + blocksize < total ) if( t + blocksize < total )
for( k = 0; k < npairs; k++ ) for( k = 0; k < npairs; k++ )