summaryrefslogtreecommitdiff
path: root/support/regression/tests/bug-2807.c
blob: a2e61a8b501e981f8ad41e7dbaa983acd3d59d93 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
/* bug-2807.c
   Overwritten operand in code generation for division.
 */

#include <testfwk.h>

#include <stdint.h>

typedef struct
{
    uint8_t interval;
    uint8_t duration;
}
Buzzer_request;

typedef struct
{
    const Buzzer_request* request;
    uint8_t state;
}
Buzzer;

int f(const char *c)
{
  static int truecount;

  if(*c == 't')
    truecount++;

  ASSERT(truecount <= 1);

  return (0);
}

void Buzzer_tick(Buzzer* const self)
{
  const Buzzer_request* const request = self->request;

  const uint8_t state = self->state + 1U;

  self->state = state;

  if(request->duration && (state < request->duration))
  {
    f("stop\n");
  }
  else if (request->interval)
  {
    if ((state % request->interval) == 0U)
    {
      // This if statement is always true due to overwritten request->interval.
      if((state / request->interval) % 2U)
      {
        f("true\n");
      }
      else
      {
        f("false\n");
      }
    }
  }
}


void testBuzzer(void)
{
  Buzzer_request request = { 1, 0 };
  Buzzer buzzer = { &request, 0 };

  Buzzer_tick(&buzzer);
  Buzzer_tick(&buzzer);
}