kit@EXPO.LCS.MIT.EDU (Chris D. Peterson) (03/01/89)
This is obscure and annoying enough that I thought all you xperts out there
might be interested.
Chris D. Peterson
Disclaimer: This is not an "official" patch, I just thought it would
be of interest to the community.
------------------------------------------------------------
X Window System Bug Report
VERSION:
R3
CLIENT MACHINE and OPERATING SYSTEM:
all
DISPLAY:
all
WINDOW MANAGER:
all
AREA:
Xaw
SYNOPSIS:
Macro definitions for AssignMin and AssignMax can cause problems.
DESCRIPTION:
The following lines of code will cause unexpected behavior.
if (fubar)
AssignMin(foo, bar)
else
i++;
When the macros get substituted in via cpp, the code looks like:
if (fubar)
if ((bar) < (foo))
foo = (bar)
else
i++;
This is NOT the expected bevaior, but the compiler is happy to
interpret this since it is valid C code.
REPEAT BY:
Try using code with the above syntax in it.
SAMPLE FIX:
I added an extra set of curly braces, this does not allow the above
statement to work, but the compiler at least complains.
*** /tmp/,RCSt1a02004 Tue Feb 28 13:26:45 1989
--- lib/Xaw/XawMisc.h Tue Feb 28 13:17:02 1989
***************
*** 1,5 ****
/*
! * $XConsortium: XawMisc.h,v 1.8 88/09/06 16:42:52 jim Exp $
*/
/***********************************************************
--- 1,5 ----
/*
! * $XConsortium: XawMisc.h,v 1.9 89/02/28 13:16:26 kit Exp $
*/
/***********************************************************
***************
*** 35,41 ****
#define Max(x, y) (((x) > (y)) ? (x) : (y))
#define Min(x, y) (((x) < (y)) ? (x) : (y))
! #define AssignMax(x, y) if ((y) > (x)) x = (y)
! #define AssignMin(x, y) if ((y) < (x)) x = (y)
#endif /*_XawMisc_h*/
--- 35,41 ----
#define Max(x, y) (((x) > (y)) ? (x) : (y))
#define Min(x, y) (((x) < (y)) ? (x) : (y))
! #define AssignMax(x, y) {if ((y) > (x)) x = (y);}
! #define AssignMin(x, y) {if ((y) < (x)) x = (y);}
#endif /*_XawMisc_h*/