Skip to content

Commit 2f6bf64

Browse files
committed
test: add tests for check-checker
1 parent ce61daf commit 2f6bf64

File tree

7 files changed

+494
-0
lines changed

7 files changed

+494
-0
lines changed

tests/checker/.gitignore

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
2+
settings/Mainnet.toml
3+
settings/Testnet.toml
4+
history.txt
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
2+
{
3+
"deno.enable": true,
4+
}

tests/checker/Clarinet.toml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
[project]
2+
name = "checker"
3+
requirements = []
4+
analysis = ["check-checker"]
5+
costs_version = 1
6+
[contracts.checker]
7+
path = "contracts/checker.clar"
8+
depends_on = []
Lines changed: 321 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,321 @@
1+
;;RUN: cargo run check | filecheck %s
2+
3+
(define-public (tainted (amount uint))
4+
;; CHECK: taint:[[# @LINE + 6 ]]:20: warning: use of potentially unchecked data
5+
;; CHECK-NEXT: (stx-transfer? amount (as-contract tx-sender) tx-sender)
6+
;; CHECK-NEXT: ^~~~~~
7+
;; CHECK-NEXT: taint:[[# @LINE - 4 ]]:25: note: source of untrusted input here
8+
;; CHECK-NEXT: (define-public (tainted (amount uint))
9+
;; CHECK-NEXT: ^~~~~~
10+
(stx-transfer? amount (as-contract tx-sender) tx-sender)
11+
)
12+
13+
(define-public (expr-tainted (amount uint))
14+
;; CHECK: taint:[[# @LINE + 6 ]]:20: warning: use of potentially unchecked data
15+
;; CHECK-NEXT: (stx-transfer? (+ u10 amount) (as-contract tx-sender) tx-sender)
16+
;; CHECK-NEXT: ^~~~~~~~~~~~~~
17+
;; CHECK-NEXT: taint:[[# @LINE - 4 ]]:30: note: source of untrusted input here
18+
;; CHECK-NEXT: (define-public (expr-tainted (amount uint))
19+
;; CHECK-NEXT: ^~~~~~
20+
(stx-transfer? (+ u10 amount) (as-contract tx-sender) tx-sender)
21+
)
22+
23+
(define-public (let-tainted (amount uint))
24+
(let ((x amount))
25+
;; CHECK: taint:[[# @LINE + 6 ]]:24: warning: use of potentially unchecked data
26+
;; CHECK-NEXT: (stx-transfer? x (as-contract tx-sender) tx-sender)
27+
;; CHECK-NEXT: ^
28+
;; CHECK-NEXT: taint:[[# @LINE - 5 ]]:29: note: source of untrusted input here
29+
;; CHECK-NEXT: (define-public (let-tainted (amount uint))
30+
;; CHECK-NEXT: ^~~~~~
31+
(stx-transfer? x (as-contract tx-sender) tx-sender)
32+
)
33+
)
34+
35+
(define-public (filtered (amount uint))
36+
(begin
37+
(asserts! (< amount u100) (err u100))
38+
;; CHECK-NOT: taint:[[# @LINE + 1 ]]:24: warning:
39+
(stx-transfer? amount (as-contract tx-sender) tx-sender)
40+
)
41+
)
42+
43+
(define-public (filtered-expr (amount uint))
44+
(begin
45+
(asserts! (< (+ amount u10) u100) (err u100))
46+
;; CHECK-NOT: taint:[[# @LINE + 1 ]]:24: warning:
47+
(stx-transfer? amount (as-contract tx-sender) tx-sender)
48+
)
49+
)
50+
51+
(define-public (let-filtered (amount uint))
52+
(let ((x amount))
53+
(asserts! (< x u100) (err u100))
54+
;; CHECK-NOT: taint:[[# @LINE + 1 ]]:24: warning:
55+
(stx-transfer? x (as-contract tx-sender) tx-sender)
56+
)
57+
)
58+
59+
(define-public (let-filtered-parent (amount uint))
60+
(let ((x amount))
61+
(asserts! (< amount u100) (err u100))
62+
;; CHECK-NOT: taint:[[# @LINE + 1 ]]:24: warning:
63+
(stx-transfer? x (as-contract tx-sender) tx-sender)
64+
)
65+
)
66+
67+
(define-public (let-tainted-twice (amount1 uint) (amount2 uint))
68+
(let ((x (+ amount1 amount2)))
69+
;; CHECK: taint:[[# @LINE + 9 ]]:24: warning: use of potentially unchecked data
70+
;; CHECK-NEXT: (stx-transfer? x (as-contract tx-sender) tx-sender)
71+
;; CHECK-NEXT: ^
72+
;; CHECK-NEXT: taint:[[# @LINE - 5 ]]:35: note: source of untrusted input here
73+
;; CHECK-NEXT: (define-public (let-tainted-twice (amount1 uint) (amount2 uint))
74+
;; CHECK-NEXT: ^~~~~~~
75+
;; CHECK-NEXT: taint:[[# @LINE - 8 ]]:50: note: source of untrusted input here
76+
;; CHECK-NEXT: (define-public (let-tainted-twice (amount1 uint) (amount2 uint))
77+
;; CHECK-NEXT: ^~~~~~~
78+
(stx-transfer? x (as-contract tx-sender) tx-sender)
79+
)
80+
)
81+
82+
(define-public (let-tainted-twice-filtered-once (amount1 uint) (amount2 uint))
83+
(let ((x (+ amount1 amount2)))
84+
(asserts! (< amount1 u100) (err u100))
85+
;; CHECK: taint:[[# @LINE + 6 ]]:24: warning: use of potentially unchecked data
86+
;; CHECK-NEXT: (stx-transfer? x (as-contract tx-sender) tx-sender)
87+
;; CHECK-NEXT: ^
88+
;; CHECK-NEXT: taint:[[# @LINE - 6 ]]:64: note: source of untrusted input here
89+
;; CHECK-NEXT: (define-public (let-tainted-twice-filtered-once (amount1 uint) (amount2 uint))
90+
;; CHECK-NEXT: ^~~~~~~
91+
(stx-transfer? x (as-contract tx-sender) tx-sender)
92+
)
93+
)
94+
95+
(define-public (let-tainted-twice-filtered-twice (amount1 uint) (amount2 uint))
96+
(let ((x (+ amount1 amount2)))
97+
(asserts! (< amount1 u100) (err u100))
98+
(asserts! (< amount2 u100) (err u101))
99+
;; CHECK-NOT: taint:[[# @LINE + 1 ]]:24: warning:
100+
(stx-transfer? x (as-contract tx-sender) tx-sender)
101+
)
102+
)
103+
104+
(define-public (let-tainted-twice-filtered-together (amount1 uint) (amount2 uint))
105+
(let ((x (+ amount1 amount2)))
106+
(asserts! (< (+ amount1 amount2) u100) (err u100))
107+
;; CHECK-NOT: taint:[[# @LINE + 1 ]]:24: warning:
108+
(stx-transfer? x (as-contract tx-sender) tx-sender)
109+
)
110+
)
111+
112+
(define-public (if-filter (amount uint))
113+
;; CHECK-NOT: taint:[[# @LINE + 1 ]]:40: warning:
114+
(stx-transfer? (if (< amount u100) amount u100) (as-contract tx-sender) tx-sender)
115+
)
116+
117+
(define-public (if-not-filtered (amount uint))
118+
;; CHECK: taint:[[# @LINE + 6 ]]:20: warning: use of potentially unchecked data
119+
;; CHECK-NEXT: (stx-transfer? (if (< u50 u100) amount u100) (as-contract tx-sender) tx-sender)
120+
;; CHECK-NEXT: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
121+
;; CHECK-NEXT: taint:[[# @LINE - 4 ]]:33: note: source of untrusted input here
122+
;; CHECK-NEXT: (define-public (if-not-filtered (amount uint))
123+
;; CHECK-NEXT: ^~~~~~
124+
(stx-transfer? (if (< u50 u100) amount u100) (as-contract tx-sender) tx-sender)
125+
)
126+
127+
(define-public (and-tainted (amount uint))
128+
(ok (and
129+
;; CHECK: taint:[[# @LINE + 6 ]]:38: warning: use of potentially unchecked data
130+
;; CHECK-NEXT: (unwrap-panic (stx-transfer? amount (as-contract tx-sender) tx-sender))
131+
;; CHECK-NEXT: ^~~~~~
132+
;; CHECK-NEXT: taint:[[# @LINE - 5 ]]:29: note: source of untrusted input here
133+
;; CHECK-NEXT: (define-public (and-tainted (amount uint))
134+
;; CHECK-NEXT: ^~~~~~
135+
(unwrap-panic (stx-transfer? amount (as-contract tx-sender) tx-sender))
136+
))
137+
)
138+
139+
(define-public (and-filter (amount uint))
140+
(ok (and
141+
(< amount u100)
142+
;; CHECK-NOT: taint:[[# @LINE + 1 ]]:38: warning:
143+
(unwrap-panic (stx-transfer? amount (as-contract tx-sender) tx-sender))
144+
))
145+
)
146+
147+
(define-public (and-filter-after (amount uint))
148+
(ok (and
149+
;; CHECK: taint:[[# @LINE + 6 ]]:38: warning: use of potentially unchecked data
150+
;; CHECK-NEXT: (unwrap-panic (stx-transfer? amount (as-contract tx-sender) tx-sender))
151+
;; CHECK-NEXT: ^~~~~~
152+
;; CHECK-NEXT: taint:[[# @LINE - 5 ]]:34: note: source of untrusted input here
153+
;; CHECK-NEXT: (define-public (and-filter-after (amount uint))
154+
;; CHECK-NEXT: ^~~~~~
155+
(unwrap-panic (stx-transfer? amount (as-contract tx-sender) tx-sender))
156+
(< amount u100)
157+
))
158+
)
159+
160+
(define-public (or-tainted (amount uint))
161+
(ok (or
162+
;; CHECK: taint:[[# @LINE + 6 ]]:38: warning: use of potentially unchecked data
163+
;; CHECK-NEXT: (unwrap-panic (stx-transfer? amount (as-contract tx-sender) tx-sender))
164+
;; CHECK-NEXT: ^~~~~~
165+
;; CHECK-NEXT: taint:[[# @LINE - 5 ]]:28: note: source of untrusted input here
166+
;; CHECK-NEXT: (define-public (or-tainted (amount uint))
167+
;; CHECK-NEXT: ^~~~~~
168+
(unwrap-panic (stx-transfer? amount (as-contract tx-sender) tx-sender))
169+
))
170+
)
171+
172+
(define-public (or-filter (amount uint))
173+
(ok (or
174+
(>= amount u100)
175+
;; CHECK-NOT: taint:[[# @LINE + 1 ]]:38: warning:
176+
(unwrap-panic (stx-transfer? amount (as-contract tx-sender) tx-sender))
177+
))
178+
)
179+
180+
(define-public (or-filter-after (amount uint))
181+
(ok (or
182+
;; CHECK: taint:[[# @LINE + 6 ]]:38: warning: use of potentially unchecked data
183+
;; CHECK-NEXT: (unwrap-panic (stx-transfer? amount (as-contract tx-sender) tx-sender))
184+
;; CHECK-NEXT: ^~~~~~
185+
;; CHECK-NEXT: taint:[[# @LINE - 5 ]]:33: note: source of untrusted input here
186+
;; CHECK-NEXT: (define-public (or-filter-after (amount uint))
187+
;; CHECK-NEXT: ^~~~~~
188+
(unwrap-panic (stx-transfer? amount (as-contract tx-sender) tx-sender))
189+
(>= amount u100)
190+
))
191+
)
192+
193+
(define-public (tainted-stx-burn (amount uint))
194+
;; CHECK: taint:[[# @LINE + 6 ]]:16: warning: use of potentially unchecked data
195+
;; CHECK-NEXT: (stx-burn? amount (as-contract tx-sender))
196+
;; CHECK-NEXT: ^~~~~~
197+
;; CHECK-NEXT: taint:[[# @LINE - 4 ]]:34: note: source of untrusted input here
198+
;; CHECK-NEXT: (define-public (tainted-stx-burn (amount uint))
199+
;; CHECK-NEXT: ^~~~~~
200+
(stx-burn? amount (as-contract tx-sender))
201+
)
202+
203+
(define-fungible-token stackaroo)
204+
205+
(define-public (tainted-ft-burn (amount uint))
206+
;; CHECK: taint:[[# @LINE + 6 ]]:25: warning: use of potentially unchecked data
207+
;; CHECK-NEXT: (ft-burn? stackaroo amount (as-contract tx-sender))
208+
;; CHECK-NEXT: ^~~~~~
209+
;; CHECK-NEXT: taint:[[# @LINE - 4 ]]:33: note: source of untrusted input here
210+
;; CHECK-NEXT: (define-public (tainted-ft-burn (amount uint))
211+
;; CHECK-NEXT: ^~~~~~
212+
(ft-burn? stackaroo amount (as-contract tx-sender))
213+
)
214+
215+
(define-public (tainted-ft-transfer (amount uint))
216+
;; CHECK: taint:[[# @LINE + 6 ]]:29: warning: use of potentially unchecked data
217+
;; CHECK-NEXT: (ft-transfer? stackaroo amount (as-contract tx-sender) tx-sender)
218+
;; CHECK-NEXT: ^~~~~~
219+
;; CHECK-NEXT: taint:[[# @LINE - 4 ]]:37: note: source of untrusted input here
220+
;; CHECK-NEXT: (define-public (tainted-ft-transfer (amount uint))
221+
;; CHECK-NEXT: ^~~~~~
222+
(ft-transfer? stackaroo amount (as-contract tx-sender) tx-sender)
223+
)
224+
225+
(define-public (tainted-ft-mint (amount uint))
226+
;; CHECK: taint:[[# @LINE + 6 ]]:25: warning: use of potentially unchecked data
227+
;; CHECK-NEXT: (ft-mint? stackaroo amount (as-contract tx-sender))
228+
;; CHECK-NEXT: ^~~~~~
229+
;; CHECK-NEXT: taint:[[# @LINE - 4 ]]:33: note: source of untrusted input here
230+
;; CHECK-NEXT: (define-public (tainted-ft-mint (amount uint))
231+
;; CHECK-NEXT: ^~~~~~
232+
(ft-mint? stackaroo amount (as-contract tx-sender))
233+
)
234+
235+
(define-non-fungible-token stackaroo2 uint)
236+
237+
(define-public (tainted-nft-burn (amount uint))
238+
;; CHECK: taint:[[# @LINE + 6 ]]:27: warning: use of potentially unchecked data
239+
;; CHECK-NEXT: (nft-burn? stackaroo2 amount (as-contract tx-sender))
240+
;; CHECK-NEXT: ^~~~~~
241+
;; CHECK-NEXT: taint:[[# @LINE -4 ]]:34: note: source of untrusted input here
242+
;; CHECK-NEXT: (define-public (tainted-nft-burn (amount uint))
243+
;; CHECK-NEXT: ^~~~~~
244+
(nft-burn? stackaroo2 amount (as-contract tx-sender))
245+
)
246+
247+
(define-public (tainted-nft-transfer (amount uint))
248+
;; CHECK: taint:[[# @LINE + 6 ]]:31: warning: use of potentially unchecked data
249+
;; CHECK-NEXT: (nft-transfer? stackaroo2 amount (as-contract tx-sender) tx-sender)
250+
;; CHECK-NEXT: ^~~~~~
251+
;; CHECK-NEXT: taint:[[# @LINE - 4 ]]:38: note: source of untrusted input here
252+
;; CHECK-NEXT: (define-public (tainted-nft-transfer (amount uint))
253+
;; CHECK-NEXT: ^~~~~~
254+
(nft-transfer? stackaroo2 amount (as-contract tx-sender) tx-sender)
255+
)
256+
257+
(define-public (tainted-nft-mint (amount uint))
258+
;; CHECK: taint:[[# @LINE + 6 ]]:27: warning: use of potentially unchecked data
259+
;; CHECK-NEXT: (nft-mint? stackaroo2 amount (as-contract tx-sender))
260+
;; CHECK-NEXT: ^~~~~~
261+
;; CHECK-NEXT: taint:[[# @LINE - 4 ]]:34: note: source of untrusted input here
262+
;; CHECK-NEXT: (define-public (tainted-nft-mint (amount uint))
263+
;; CHECK-NEXT: ^~~~~~
264+
(nft-mint? stackaroo2 amount (as-contract tx-sender))
265+
)
266+
267+
(define-data-var myvar uint u0)
268+
269+
(define-public (tainted-var-set (amount uint))
270+
;; CHECK: taint:[[# @LINE + 6 ]]:24: warning: use of potentially unchecked data
271+
;; CHECK-NEXT: (ok (var-set myvar amount))
272+
;; CHECK-NEXT: ^~~~~~
273+
;; CHECK-NEXT: taint:[[# @LINE - 4 ]]:33: note: source of untrusted input here
274+
;; CHECK-NEXT: (define-public (tainted-var-set (amount uint))
275+
;; CHECK-NEXT: ^~~~~~
276+
(ok (var-set myvar amount))
277+
)
278+
279+
(define-map mymap { key-name-1: uint } { val-name-1: int })
280+
281+
(define-public (tainted-map-set (key uint) (value int))
282+
;; CHECK: taint:[[# @LINE + 12 ]]:37: warning: use of potentially unchecked data
283+
;; CHECK-NEXT: (ok (map-set mymap {key-name-1: key} {val-name-1: value}))
284+
;; CHECK-NEXT: ^~~
285+
;; CHECK-NEXT: taint:[[# @LINE - 4 ]]:33: note: source of untrusted input here
286+
;; CHECK-NEXT: (define-public (tainted-map-set (key uint) (value int))
287+
;; CHECK-NEXT: ^~~
288+
;; CHECK-NEXT: taint:[[# @LINE + 6 ]]:55: warning: use of potentially unchecked data
289+
;; CHECK-NEXT: (ok (map-set mymap {key-name-1: key} {val-name-1: value}))
290+
;; CHECK-NEXT: ^~~~~
291+
;; CHECK-NEXT: taint:[[# @LINE - 10 ]]:44: note: source of untrusted input here
292+
;; CHECK-NEXT: (define-public (tainted-map-set (key uint) (value int))
293+
;; CHECK-NEXT: ^~~~~
294+
(ok (map-set mymap {key-name-1: key} {val-name-1: value}))
295+
)
296+
297+
(define-public (tainted-map-insert (key uint) (value int))
298+
;; CHECK: taint:[[# @LINE + 12 ]]:40: warning: use of potentially unchecked data
299+
;; CHECK-NEXT: (ok (map-insert mymap {key-name-1: key} {val-name-1: value}))
300+
;; CHECK-NEXT: ^~~
301+
;; CHECK-NEXT: taint:[[# @LINE - 4 ]]:36: note: source of untrusted input here
302+
;; CHECK-NEXT: (define-public (tainted-map-insert (key uint) (value int))
303+
;; CHECK-NEXT: ^~~
304+
;; CHECK-NEXT: taint:[[# @LINE + 6 ]]:58: warning: use of potentially unchecked data
305+
;; CHECK-NEXT: (ok (map-insert mymap {key-name-1: key} {val-name-1: value}))
306+
;; CHECK-NEXT: ^~~~~
307+
;; CHECK-NEXT: taint:[[# @LINE - 10 ]]:47: note: source of untrusted input here
308+
;; CHECK-NEXT: (define-public (tainted-map-insert (key uint) (value int))
309+
;; CHECK-NEXT: ^~~~~
310+
(ok (map-insert mymap {key-name-1: key} {val-name-1: value}))
311+
)
312+
313+
(define-public (tainted-map-delete (key uint))
314+
;; CHECK: taint:[[# @LINE + 6 ]]:40: warning: use of potentially unchecked data
315+
;; CHECK-NEXT: (ok (map-delete mymap {key-name-1: key}))
316+
;; CHECK-NEXT: ^~~
317+
;; CHECK-NEXT: taint:[[# @LINE - 4 ]]:36: note: source of untrusted input here
318+
;; CHECK-NEXT: (define-public (tainted-map-delete (key uint))
319+
;; CHECK-NEXT: ^~~
320+
(ok (map-delete mymap {key-name-1: key}))
321+
)

tests/checker/lit.cfg

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import lit.formats
2+
3+
config.name = 'check checker'
4+
config.suffixes = ['.clar']
5+
config.test_format = lit.formats.ShTest("0")

0 commit comments

Comments
 (0)