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);
}
|