Related articles |
---|
Re: failure due to compiler? kanze@lts.sel.alcatel.de (1996-07-04) |
Re: failure due to compiler? gah@u.washington.edu (1996-07-19) |
Re: failure due to compiler? jgllgher@maths.tcd.ie (Dara Gallagher) (1996-07-20) |
Re: failure due to compiler? davidg@genmagic.com (1996-07-24) |
Re: failure due to compiler? jmccarty@sun1307.spd.dsccc.com (1996-07-26) |
'assert' peeves [was: failure due to compiler?] hagerman@ece.cmu.edu (1996-07-27) |
From: | hagerman@ece.cmu.edu (John Hagerman) |
Newsgroups: | comp.compilers |
Date: | 27 Jul 1996 21:42:11 -0400 |
Organization: | Carnegie Mellon University |
References: | 96-07-041 96-07-123 96-07-141 96-07-173 96-07-180 |
Keywords: | design, debug |
jmccarty@sun1307.spd.dsccc.com (Mike McCarty) writes:
> [re: double eval of assert predicate]
> Yes, that is a common flaw in <assert.h> implementations. DEC shipped
> such a defective <assert.h> until I complained. Here is one which
> I believe works. ...
I dislike the assert "feature" of printing the predicate. This causes
problems when the predicate has complex line structure (example below, using
Mike's assert). I no longer use vendor-provided asserts because this
mis-feature has given me so much trouble. The standard assert in "old" C
didn't have this mis-feature, and I don't understand why it is needed: if
you get an assertion failure as a user then printing the predicate isn't
going to help; if you get an assertion failure as a programmer then you will
be going to the code directly -- printing the predicate leads to bad assert
usage habits.
In the example below I have fixed a couple of typos in Mike's assert.
Compiling this with gcc 2.7.2 on AIX 4.1 and running gives:
foobar
assertion failed: t.c:17: foo("foo\ar\n", 0)Abort process (core dumped)
This is just one example; every "ANSI C" assert I've seen has had a
problem printing some complicated predicate, and since I don't think
the predicate should be printed I just avoid them all.
~ John
#include <stdio.h>
#define __ASSERT(x) ((void)(fputs("assertion failed: ",stderr),fputs(x,stderr),abort(),0))
#define __STR__(x) __VAL__(x)
#define __VAL__(x) #x
#define assert(x) ((x)?(void)0:__ASSERT(__FILE__ ":" __STR__(__LINE__) ": " #x))
int foo(char *a, int b)
{
fputs(a, stderr);
return b;
}
int main(void)
{
assert(foo("foo\
bar\n", 0));
}
--
Return to the
comp.compilers page.
Search the
comp.compilers archives again.