8b0a3db74749d3d905b08d93bc4c35ec2052f5c5
[fw/sdcc] / support / regression / tests / bug-524691.c
1 /* Division by powers of two.
2  */
3 #include <testfwk.h>
4
5 #if defined __mcs51 || defined __ds390 || defined __xa51
6 #define XDATA xdata
7 #else
8 #define XDATA
9 #endif
10
11 typedef unsigned int UINT;
12
13 typedef struct _HeapEntryState
14 {
15   void *pBase;
16   UINT uFlags;
17 } HeapEntryState;
18
19 static HeapEntryState *_getHeapEntryState(void *p, HeapEntryState *pStates, UINT nStateEntries)
20 {
21   int uLeft = -1, uRight = nStateEntries, uMiddle;
22
23   while (uRight - uLeft > 1)
24     {
25       int iDiff;
26
27       uMiddle = (uLeft + uRight)/2;
28       /* A divide by zero is added just before iDiff is assigned */
29       iDiff = pStates[uMiddle].pBase - p;
30
31       if (iDiff > 0)
32         {
33           uRight = uMiddle;
34         }
35       else if (iDiff < 0)
36         {
37           uLeft = uMiddle;
38         }
39       else
40         {
41           return pStates + uMiddle;
42         }
43     }
44
45   return NULL;
46 }
47
48 void
49 testDivByZero(void)
50 {
51   HeapEntryState aStates[] = {
52     { (void XDATA *)1, 0 }
53   };
54   void *p = (void XDATA *)0x1234;
55
56   ASSERT(_getHeapEntryState(p, aStates, 1) == NULL);
57
58   aStates[0].pBase = p;
59   ASSERT(_getHeapEntryState(p, aStates, 1) == aStates + 0);
60 }