我有一个使用第三方库的程序(没有提供源代码)。
假设我们有一个名为DP_AcquireFingerprint()
的函数。此函数调用将与第三方库连接,以从指纹扫描仪硬件读取指纹图像。
当我直接从main()
调用此函数时,它可以正常工作:
int main(int argc, char** argv) {
Matrix* mat;
DP_AcquireFingerprint(&mat); /* Works fine */
}
然而,这个函数在深埋函数调用时开始表现得很奇怪。例如:
void func1(Matrix** mat) {
DP_AcquireFingerprint(mat);
}
void func2(Matrix** mat) {
func1(mat);
}
void func3(Matrix** mat) {
func2(mat);
}
void func4(Matrix** mat) {
func3(mat);
}
int main(int argc, char** argv) {
Matrix* mat;
func4(&mat); /* Not working! */
}
特别是,库抱怨缓冲区没有足够的错误,而我很确定我已经在堆中分配了足够的内存来存储指纹图像(在此函数内)。
问题是,第一个和第二个代码段之间有什么区别?如果在不同的位置调用函数,是否有任何可能的行为?
答案 0 :(得分:2)
如果您的缓冲区分配不正确,那么代码的重组很可能会改变行为。缓冲区溢出是未定义的行为,因此可能因此重组而有所不同。我想你需要再次查看问题中没有的缓冲区分配代码。
答案 1 :(得分:0)
在编译源代码时启用调试器信息后是否尝试调试程序(在Linux上,这意味着编译并与gcc -g -Wall
链接,然后使用gdb
)?