cmp函数qsort中未初始化的值
Uninitialised value in cmp function qsort
我想知道这段代码出了什么问题:
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跟踪内存读取和写入,我认为这里它告诉你,函数碰巧被调用时至少有一个指向内存的指针,该指针在调用时从未被写入过。
相关文章:
- 正在初始化函数指针的constexpr数组
- 我应该在C++中使用构造函数还是初始化函数
- 使用 extern const 初始化函数
- 初始化函数中的静态变量,而不是在文件开始时
- 如何初始化函数中指针数组的大小
- 正在初始化初始化函数中的静态类成员
- call_once初始化函数
- SWIG + CMAKE:缺少初始化函数
- 如何创建在 c++ 中只读取一次的初始化函数
- 类内的强制初始化函数
- 使用元编程在编译时初始化函数数组
- 数组初始化函数:将数组作为指针传递:C++
- 从nodejs模块初始化函数报告失败
- 导入错误:动态模块未定义初始化函数
- 大括号初始化函数指针数组:从 'void (*(*)())()' 到 'void (*)()' 的转换无效
- 奇怪的行为,用 int 初始化函数指针
- 使用 init_seg 调用初始化函数
- 正在初始化函数内部的std::数组
- 初始化函数内部的指针.它是如何工作的
- JNI初始化函数以及缓存类和字段