请解释一下坠毁的原因。我有第三方代码,它意外地与EXC_BAD_ACCESS崩溃
static int overwrite_selector(struct srm_target *srm, MARFileRemoverProgressBlock progressBlock)
{
srm->buffer = (unsigned char *)alloca(srm->buffer_size);
if(overwrite_byte(srm, 1, 0xF6, progressBlock) < 0) return -1;
return 0;
}
static int overwrite_byte(struct srm_target *srm, const int pass, const int byte, MARFileRemoverProgressBlock progressBlock)
{
memset(srm->buffer, byte, srm->buffer_size);
return overwrite(srm, pass, progressBlock);
}崩溃发生在line (srm->缓冲区、字节、srm->buffer _size)上;因此,为srm->缓冲区分配内存似乎有问题。但是如果我把alloca替换为malloc,那么一切都没问题(没有崩溃)。
我在OSX10.9ARC上开发
我注意到了特定于Apple的比特:如果我在全局队列中运行代码,则会发生崩溃,但如果在主队列上运行,则一切正常。
发布于 2014-03-27 16:19:16
听起来像是堆栈溢出,alloca将从堆栈中分配。,所以如果您试图分配太多,这将导致堆栈溢出,而malloc将从堆中分配,而堆要大得多。不可能知道当您用alloca溢出堆栈时。
另外,请注意,由于alloca在堆栈上分配,返回函数的内存将无法工作,因为一旦退出函数,该内存将不再可用。因此,如果需要使用函数外部的内存,则需要使用malloc。
发布于 2014-03-27 16:26:39
在这里,您按功能分配内存,
static int overwrite_selector(struct srm_target *srm, MARFileRemoverProgressBlock progressBlock)
{
srm->buffer = (unsigned char *)alloca(srm->buffer_size);
if(overwrite_byte(srm, 1, 0xF6, progressBlock) < 0) return -1;
return 0;
}由于您使用alloca,当函数返回时,分配的内存将被释放。因为当您从其他函数中使用它时,它会导致程序崩溃。
在这里,您调用了分配内存的函数中的其他函数。所以原因似乎是堆积如山。从alloca中无法知道这种情况。由于alloca在堆栈溢出上的这种未定义行为,在这种情况下使用alloca是不好的。
发布于 2014-03-27 17:21:07
由于alloca试图在堆栈上分配字节,所以了解堆栈大小很重要。您可以使用如下代码检查堆栈大小的限制
#include <sys/resource.h>
void checkStackSize( void )
{
struct rlimit limits;
if ( getrlimit( RLIMIT_STACK, &limits ) == 0 )
printf( "soft_limit=%lld hard_limit=%lld\n", limits.rlim_cur, limits.rlim_max );
}当我在osx上测试时,软限制是8MB,硬限制是64 8MB。在iOS设备上,这两个限制都是1MB。
注意:以下内容来自alloca的手册页
alloca()依赖于机器和编译器;不鼓励使用它。 alloca()有点不安全,因为它不能确保返回的指针指向有效和可用的内存块。所作的分配可能超出堆栈的范围,甚至可能深入内存中的其他对象,而alloca()无法确定这样的错误。避免使用大的无界分配的alloca()。
https://stackoverflow.com/questions/22693328
复制相似问题