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
|
.segment "HEADER"
.byte 'N', 'E', 'S', $1A
.byte $02, $01
.byte $00
.byte $00
.segment "CHARS"
.byte 0
.segment "VECTORS"
.addr reset, reset, reset
.segment "CODE"
zp_buffer = $00 ; asan:reserve $10
.proc reset
;; Fine.
ldx #0
lda zp_buffer, x
;; NOTE: overflow!
dex
lda zp_buffer, x
;; Just so there are no "unused" warnings :)
jsr overflow_on_arithmetics
jsr stack_underflow
jsr bad_rom_data_indexing
rts
.endproc
.proc overflow_on_arithmetics
;; NOTE: overflow!
;; NOTE: another overflow scenario could be 'lda zp_buffer + 16, x', but
;; 'nasm' can statically point this out and it will throw an error.
ldx #1
lda zp_buffer + 15, x
rts
.endproc
;; asan:stack $FD-$FF
.proc stack_underflow
lda #0
;; NOTE: stack underflow!
pha
pla
rts
.endproc
.proc bad_rom_data_indexing
;; Fine.
ldx #0
lda data, x
clc
adc #4
tax
;; NOTE: overflow!
lda data, x
rts
data:
.byte $00, $01, $02, $03
lda zp_buffer
.endproc
|