cmp函数qsort中未初始化的值

Uninitialised value in cmp function qsort

本文关键字:初始化 函数 qsort cmp      更新时间:2023-10-16

我想知道这段代码出了什么问题:

int myCompare( const void * v1, const void * v2 ){
   const int * f1 = static_cast<const int *>(v1);
   const int * f2 = static_cast<const int *>(v2);
   if( f1[ 0 ] < f2[ 0 ] ) return -1;
   if( f1[ 0 ] > f2[ 0 ] ) return +1;
   return 0;
}

这是qsort的比较器函数,它工作得很好,但是当我用valgrind对它进行分析时,我在这个字符串中有这个消息条件跳转或移动取决于未初始化的值

 if( f1[ 0 ] < f2[ 0 ] ) return -1;
 if( f1[ 0 ] > f2[ 0 ] ) return +1;

qsort从这里调用

valgrind输出

==25053== Conditional jump or move depends on uninitialised value(s)
==25053==    at 0x66474CB: msort_with_tmp.part.0 (msort.c:83)
==25053==    by 0x6647221: msort_with_tmp.part.0 (msort.c:45)
==25053==    by 0x6647221: msort_with_tmp.part.0 (msort.c:45)
==25053==    by 0x664777B: qsort_r (msort.c:45)
==25053==    by 0x40D002: owOpenCLSolver::_runSort(owConfigProrerty*)(owOpenCLSolver.cpp:473)
==25053==    by 0x4114DB: owPhysicsFluidSimulator::simulationStep(bool) (owPhysicsFluidSimulator.cpp:186)
==25053==    by 0x412FBC: run(int, char**, bool) (owWorldSimulation.cpp:919)
==25053==    by 0x4058D4: main (main.cpp:95)
==25053==  Uninitialised value was created by a client request
==25053==    at 0xA6AF9F8: ??? (in /usr/lib/libamdocl64.so)
==25053==    by 0xA69BF40: ??? (in /usr/lib/libamdocl64.so)
==25053==    by 0xA3DCB0F: ??? (in /usr/lib/libamdocl64.so)
==25053==    by 0xA42DECA: ??? (in /usr/lib/libamdocl64.so)
==25053==    by 0xA37E03F: ??? (in /usr/lib/libamdocl64.so)
==25053==    by 0xA3558D0: ??? (in /usr/lib/libamdocl64.so)enter code here
==25053==    by 0xA35A1C1: ??? (in /usr/lib/libamdocl64.so)
==25053==    by 0xA35A2EC: ??? (in /usr/lib/libamdocl64.so)
==25053==    by 0xA32972D: ??? (in /usr/lib/libamdocl64.so)
==25053==    by 0xA2D095E: ??? (in /usr/lib/libamdocl64.so)
==25053==    by 0xA337AEB: ??? (in /usr/lib/libamdocl64.so)
==25053==    by 0x6BDD181: start_thread (pthread_create.c:312)

实际上,在owOpenCLSolver类中,我正在使用这个排序函数,我没有一个地方缓冲区_particleIndex(将排序的缓冲区)显式初始化,但初始化是在函数copy_buffer_from_device中进行的,该函数将数据从OpenCL设备复制到主机程序缓冲区中。所以可能是问题是在valgrind不认为_particleIndex不是init当函数使用它。

Valgrind跟踪内存读取和写入,我认为这里它告诉你,函数碰巧被调用时至少有一个指向内存的指针,该指针在调用时从未被写入过。