Tag: 断言

C Sysmalloc断言失败

我在运行C程序时收到以下sysmalloc错误。 malloc.c:3096: sYSMALLOc: Assertion `(old_top == (((mbinptr) (((char *) &((av)->bins[((1) – 1) * 2])) – __builtin_offsetof (struct malloc_chunk, fd)))) && old_size == 0) || ((unsigned long) (old_size) >= (unsigned long) ((((__builtin_offsetof (struct malloc_chunk, fd_nextsize)) +((2 * (sizeof(size_t))) – 1)) & ~((2 * (sizeof(size_t))) – 1))) && ((old_top)->size & 0x1) && ((unsigned long)old_end & pagemask) == […]

使用assert处理错误检查

我看了一遍,似乎有很多关于断言的混合观点。 例如,如果我是malloc的指针,并想确保它已正确分配,我会写: p = malloc(sizeof(int)); assert(p) 代替: p = malloc(sizeof(int)); if (p == NULL) { … send error message } 我知道断言它会终止程序,但出于测试目的 – 我想知道的是绝对最安全的方式: 测试像malloc正确完成的事情。 处理错误,如果某些东西不是正确的malloc 。

定义一个即使定义了NDEBUG也有效的断言

我想定义一个assert宏,它与标准的assert(3)调用相同,只是在定义NDEBUG时预处理器不会删除它。 这样的调用,让我们在这里称之为assert2 ,例如,如果你想在软件的发布版本中进行一些检查,那么它是有用的。 我怎样才能以合理的便携方式做到这一点? 我总是可以完全重新创建assert机制,如1 : #define assert2(cond) cond ? (void)0 : die_now(#cond, __FILE__, __LINE__) static die_now(char *cond_str, const char *file, int line) { // print a message to stderr here … abort(); // or maybe abort ? } …但我更倾向于使用与现有断言调用相同的机制。 特别是,内置的assert调用做了很好的事情,比如处理编译器和平台的所有各种奇怪的东西,用特殊的魔法注释断言条件,让编译器在调用后假设条件成立,相当打印函数名称,等等上。 在包含assert.h之前,我可以通过#undef NDEBUG获取内置assert – 但是我看不到如何将它重命名为assert2 。 我想我可以将系统头文件中assert的定义复制并粘贴到#define assert2行,但这是(a)可能违反某些许可或版权,(b)需要重复平台。 请不要开始辩论这种function是否有用,或者它是否是实现更高级别目标的合理方式。 我特别询问是否可以在不依赖于NDEBUG情况下以其他名称重用现有的assert调用。 1当然,将die_now声明为static函数并不理想,因为它将在每个使用as assert编译单元中复制die_now函数(或者更糟糕的是,甚至可能包括所有那些仅包含头部的那些),因此它应该真正定义在它自己的并发单元中脱节,但这是使用这个function的另一个复杂因素。

断言宏中的C / C ++完整文件路径

我想知道是否可以使用断言宏显示完整的文件路径? 我无法在编译命令中指定完整文件路径,还有办法吗? 我的调试环境是linux / g ++

“#define assert(exp)((void)0)”是做什么的?

我在阅读Windows Research Kernel(WRK) 1.2中的源代码时遇到了这个预处理器定义: #define assert(exp) ((void) 0) 这段代码有什么作用? 为什么定义?

神秘的malloc:sysmalloc:断言失败错误

我收到一个神秘的错误,我不明白为什么。 此代码在失败之前运行多次,并且始终在同一点失败。 这是我的代码: assert(size > 0); int* sorted = malloc(size * sizeof(int)); 这是我运行时遇到的错误: malloc.c:2369: sysmalloc: Assertion `(old_top == (((mbinptr) (((char *) &((av)->bins[((1) – 1) * 2])) – __builtin_offsetof (struct malloc_chunk, fd)))) && old_size == 0) || ((unsigned long) (old_size) >= (unsigned long)((((__builtin_offsetof (struct malloc_chunk, fd_nextsize))+((2 * (sizeof(size_t))) – 1)) & ~((2 * (sizeof(size_t))) – 1))) […]

如何使用C断言使代码更安全?

读misc。 与SDL开发相关的教程我发现了两个不同的例子,做同样的事情,但是以不同的方式。 从代码“安全性”和可维护性的角度来看,我想知道你认为哪两个是正确的。 在第一个例子中,程序员根本没有使用断言,但代码看起来还不错(至少在我看来): int main(){ SDL_Surface *screen; /** Initialize SDL */ if(SDL_Init(SDL_INIT_VIDEO)!=0){ fprintf(stderr,”Unable to initialize SDL: %s”,SDL_GetError()); } atexit(SDL_Quit); /** Sets video mode */ screen=SDL_SetVideoMode(640,480,16,SDL_HWSURFACE); if(screen==NULL){ fprintf(stderr,”Unable to set video mode: %s”,SDL_GetError()); } return (0); } 在第二个例子中,程序员[其他]正在使用不同的方法,例如(代码不完全是复制粘贴): int main(){ SDL_Surface* screen; /** Initialize SDL */ assert(SDL_Init(SDL_INIT_VIDEO)==0); atexit(SDL_Quit); /** Sets video mode */ screen=SDL_SetVideoMode(640,480,16,SDL_HWSURFACE); assert(screen!=NULL); […]

assert(0)是什么意思?

在我的一次考试中我有这样的问题,我仍然不太清楚如何回答它。 我知道断言是测试程序的方法,但是我不太清楚assert(0)正在检查什么。 这是一个棘手的问题吗? 它总会失败,但我不明白为什么。 什么检查? 任何解释都会很棒,谢谢。

我是否误解了assert()的用法?

我正在看一下assert()参考页面 ,当我阅读给定的例子时,我遇到了困难: /* assert example */ #include #include int main () { FILE * datafile; datafile=fopen (“file.dat”,”r”); assert (datafile); fclose (datafile); return 0; } 在此示例中,如果datafile比较等于0,则assert用于中止程序执行,这在前一次调用fopen不成功时发生。 我完全同意如果fopen()失败, assert()将中止执行。 但是我担心这个例子的正确性: 在我看来, assert()可以检测通常不会发生的情况 (比如将NULL指针传递给其文档声明禁止的函数)。 在此示例中,无法打开文件不是通常不会发生的事情 。 事实上,我可以看到为什么会失败的几十个原因。 该文件不存在,程序可以在没有所需权限的情况下运行,依此类推。 我宁愿做类似的事情: /* not longer an assert example */ #include #include int main () { FILE * datafile; datafile=fopen (“file.dat”,”r”); if […]

如何在C / C ++中将assert放入发布版本中

我只需要运行ship build,我需要在发布版本中断言某些条件以查看问题是否已修复。 我该怎么做?