{
  "type": "failure-mode",
  "name": "Unconstrained hints not re-checked by the caller",
  "slug": "unconstrained-hints-not-re-checked-by-the-caller",
  "section": {
    "id": "audit",
    "number": "03",
    "title": "Auditing a ZK protocol",
    "url": "https://zkpick.com/audit/"
  },
  "url": "https://zkpick.com/audit/failure-modes/unconstrained-hints-not-re-checked-by-the-caller/",
  "markdown": "https://zkpick.com/md/audit/failure-modes/unconstrained-hints-not-re-checked-by-the-caller.md",
  "detail": "Modern DSLs let you compute a value outside the constraint system for efficiency — an unconstrained function, an unsafe block, a witness hint — on the understanding that the caller will constrain the result afterwards. Nothing in the language enforces that obligation, and the comment conventions surrounding it are advisory. A hint that is used but never re-constrained is an underconstrained circuit with a friendlier syntax.",
  "mitigation": "Treat every unconstrained or unsafe block as a review checkpoint with an explicit written obligation: what the caller must verify, and where that verification happens. Grep for them and enumerate them in the audit scope rather than trusting the accompanying comment.",
  "relatedOptions": [
    {
      "name": "Audit contests",
      "url": "https://zkpick.com/audit/audit-contests/"
    }
  ],
  "updated": "2026-09-12",
  "version": "1.3",
  "canonical": "https://zkpick.com/audit/failure-modes/unconstrained-hints-not-re-checked-by-the-caller/",
  "license": "https://creativecommons.org/licenses/by/4.0/",
  "authors": [
    "MarketComp"
  ]
}