|
| 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 | +) |
0 commit comments