我有一个功能
int foo() {
...
char* real_path_buffer = (char*)malloc(sizeof(char)*PATH_MAX);
realpath("a/certain/path/that/doesnt/exist", real_path_buffer);
...
}
realpath
在 Android 仿生中调用
char* realpath(const __restrict char*, __restrict char*){
char path1[PATH_MAX], path2[PATH_MAX], path3[PATH_MAX];
...
path1 = something_valid; //recall, this is a library function
...
memcpy(path2, path1, a_valid_size);
...
}
并且当从类似生产的场景中传递某个不存在的路径时realpath
,我在以任何方式访问时都会遇到段path2
错误(当我只是尝试打印它以及打印它时会发生这种情况memcpy
)。
我已经验证了当段错误发生时程序没有内存不足(通过调用 malloc 并验证它的返回不是NULL
),但你可以确信这个调用发生在一个相当大的堆栈上。
我还验证了在不太密集的代码路径中,realpath
可以准确返回NULL
而不会出现段错误。
有谁知道为什么会这样?