lkml.org 
[lkml]   [1999]   [Jun]   [23]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
Date
From
SubjectRe: [PATCH] *(int*)0 = 0 & variations
Riley Williams wrote:
>
> Perhaps the following patch will help. It defines a kassert() macro
> that reports the location where an assertion fails via printk with the
> KERN_DEBUG reporting level, and should apply cleanly against ANY Linux
> kernel release.
>
> To enable it, define DEBUG before including it; to disable it, don't.
>
> All that's required is for the relevant unit authors to add the
> relevant calls to their units.
>
> ===8<=== CUT ===>8===
> --- linux/include/linux/kassert.h~ Thu Jan 1 01:00:00 1970
> +++ linux/include/linux/kassert.h Wed Jun 23 14:37:54 1999
> @@ -0,0 +1,16 @@
> +/*
> + * Include definitions for kernel assertion checking
> + */
> +
> +#ifndef __KASSERT_H__
> +#define __KASSERT_H__
> +
> +#ifdef DEBUG
> +#define kassert(cond) if (!(cond)) \
> + printk(KERN_DEBUG "ASSERTION FAILURE: %s line %u: %s\n", \
> + __FILE__, __LINE__, "cond")
> +#else
> +#define kassert(cond)
> +#endif
> +
> +#endif
> ===8<=== CUT ===>8===

Sorry, Riley. This has the classic if-then problem. Try this
standalone version:

#ifdef DEBUG
#define kassert(cond) if (!(cond)) \
printf("ASSERTION FAILURE: %s line %u: %s\n", \
__FILE__, __LINE__, "cond")
#else
#define kassert(cond)
#endif

main()
{
if (0)
kassert(0);
else
printf("yes\n");
}


compiled with -DDEBUG it says nothing. Without DEBUG it says "yes".

The canonical fix: do { stuff } while (0)

#define kassert(cond) do { if (!(cond)) \
printf("ASSERTION FAILURE: %s line %u: %s\n", \
__FILE__, __LINE__, "cond"); while (0)

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.rutgers.edu
Please read the FAQ at http://www.tux.org/lkml/

\
 
 \ /
  Last update: 2005-03-22 13:52    [W:0.086 / U:1.976 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site