[CF-Devel] Bug in stealing code

crossfire-devel at archives.real-time.com crossfire-devel at archives.real-time.com
Fri Jun 11 02:20:23 CDT 2004


Andreas Kirschbaum wrote:

>
     
     
     >
     
     
     >
     
      OK, will declare it as a macro in define.h.
     
     >
     
     
     >
     
      The reason for using a function is that I generally tend to avoid
     
     >
     
      macros: when calling a macro, you have to worry about side effects
     
     >
     
      (due to possible multiple evaluations of parameters) and also do
     
     >
     
      not get type-checking by the compiler.
     
     
  I agree in principal.  However, in this particular case, it is pretty clear 
there won't be any side effects (we aren't doing assignments).


>
     
     
     >
     
      Java exhibits this limited usefulness that you have to explicitly
     
     >
     
      enable assertions (at runtime). The behavior of C assertions is
     
     >
     
      exactly the opposite: the C standard says (in section 7.2):
     
     >
     
     
     >
     
      |If NDEBUG is defined as a macro name at the point in the source
     
     >
     
      |file where <assert.h> is included, the assert macro is defined
     
     >
     
      |simply as
     
     >
     
      |
     
     >
     
      |#define assert(ignore) ((void)0)
     
     >
     
     
     >
     
      That is, assert() does nothing *only if* NDEBUG ("no debug") is
     
     >
     
      defined. Otherwise (i.e. if you do not explicitly disable the
     
     >
     
      assertions by defining NDEBUG), the assertions are active.
     
     
  Yeah, I see that - nice use of double negatives to make it more confusing.


>>
     
     And if it is a critical error, to the extend that trying to
     
     >>
     
     continue will just cause it to core dump in the next line or
     
     >>
     
     two, might as well call abort right then and there.
     
     >
     
     
     >
     
     
     >
     
      These are the types of errors that should be checked with
     
     >
     
      assert(): to detect an inconsistent internal state that should
     
     >
     
      never be possible. Therefore assert() prints an error message to
     
     >
     
      stderr and calls abort() if it fails.
     
     
  I guess it's OK.  The usefulness really depends on a few things:
1) Will the asserts reduce reliability (eg, cause aborts where without the 
assert, the code would still execute OK)
2) adversely effect performance - in this particular case, I don't see a 
problem, but one could see adding asserts in code that is caused really often 
not useful.
3) will it assist in debugging the code.

  Basically, does having them do more good than harm.  Note however it may 
(depending on the function) be useful to have actual LOG messages that can print 
out lots of debugging info before actually crashing (ala the aborts in 
common/object.c)


_______________________________________________
crossfire-devel mailing list
     
     crossfire-devel at lists.real-time.com
     
     
     https://mailman.real-time.com/mailman/listinfo/crossfire-devel
     
     
    


More information about the crossfire mailing list