• Top
    • Documentation
    • Books
    • Boolean-reasoning
    • Projects
    • Debugging
    • Std
    • Proof-automation
    • Macro-libraries
    • ACL2
      • Theories
      • Rule-classes
      • Proof-builder
      • Recursion-and-induction
      • Hons-and-memoization
      • Events
      • Parallelism
      • History
      • Programming
        • Defun
        • Declare
          • Xargs
            • Guard
              • Verify-guards
              • Mbe
              • Set-guard-checking
              • Ec-call
              • Print-gv
              • The
              • Guards-and-evaluation
              • Guard-debug
              • Set-check-invariant-risk
              • Guard-evaluation-table
              • Guard-evaluation-examples-log
              • Guard-example
              • Defthmg
              • Invariant-risk
                • Set-check-invariant-risk
                • Invariant-risk-details
                  • Set-register-invariant-risk
                • With-guard-checking
                • Guard-miscellany
                • Guard-holders
                • Guard-formula-utilities
                • Set-verify-guards-eagerness
                • Guard-quick-reference
                • Set-register-invariant-risk
                • Guards-for-specification
                • Guard-evaluation-examples-script
                • Guard-introduction
                • Program-only
                • Non-exec
                • Set-guard-msg
                • Safe-mode
                • Set-print-gv-defaults
                • Guard-theorem-example
                • With-guard-checking-event
                • With-guard-checking-error-triple
                • Guard-checking-inhibited
                • Extra-info
              • Otf-flg
              • Normalize
            • Type-spec
            • Declare-stobjs
            • Set-ignore-ok
            • Set-irrelevant-formals-ok
          • System-utilities
          • Stobj
          • State
          • Mutual-recursion
          • Memoize
          • Mbe
          • Io
          • Defpkg
          • Apply$
          • Loop$
          • Programming-with-state
          • Arrays
          • Characters
          • Time$
          • Defmacro
          • Loop$-primer
          • Fast-alists
          • Defconst
          • Evaluation
          • Guard
            • Verify-guards
            • Mbe
            • Set-guard-checking
            • Ec-call
            • Print-gv
            • The
            • Guards-and-evaluation
            • Guard-debug
            • Set-check-invariant-risk
            • Guard-evaluation-table
            • Guard-evaluation-examples-log
            • Guard-example
            • Defthmg
            • Invariant-risk
              • Set-check-invariant-risk
              • Invariant-risk-details
                • Set-register-invariant-risk
              • With-guard-checking
              • Guard-miscellany
              • Guard-holders
              • Guard-formula-utilities
              • Set-verify-guards-eagerness
              • Guard-quick-reference
              • Set-register-invariant-risk
              • Guards-for-specification
              • Guard-evaluation-examples-script
              • Guard-introduction
              • Program-only
              • Non-exec
              • Set-guard-msg
              • Safe-mode
              • Set-print-gv-defaults
              • Guard-theorem-example
              • With-guard-checking-event
              • With-guard-checking-error-triple
              • Guard-checking-inhibited
              • Extra-info
            • Equality-variants
            • Compilation
            • Hons
            • ACL2-built-ins
              • Let
              • Declare
                • Xargs
                  • Guard
                    • Verify-guards
                    • Mbe
                    • Set-guard-checking
                    • Ec-call
                    • Print-gv
                    • The
                    • Guards-and-evaluation
                    • Guard-debug
                    • Set-check-invariant-risk
                    • Guard-evaluation-table
                    • Guard-evaluation-examples-log
                    • Guard-example
                    • Defthmg
                    • Invariant-risk
                      • Set-check-invariant-risk
                      • Invariant-risk-details
                        • Set-register-invariant-risk
                      • With-guard-checking
                      • Guard-miscellany
                      • Guard-holders
                      • Guard-formula-utilities
                      • Set-verify-guards-eagerness
                      • Guard-quick-reference
                      • Set-register-invariant-risk
                      • Guards-for-specification
                      • Guard-evaluation-examples-script
                      • Guard-introduction
                      • Program-only
                      • Non-exec
                      • Set-guard-msg
                      • Safe-mode
                      • Set-print-gv-defaults
                      • Guard-theorem-example
                      • With-guard-checking-event
                      • With-guard-checking-error-triple
                      • Guard-checking-inhibited
                      • Extra-info
                    • Otf-flg
                    • Normalize
                  • Type-spec
                  • Declare-stobjs
                  • Set-ignore-ok
                  • Set-irrelevant-formals-ok
                • Mbe
                • Apply$
                • Fmt
                • Loop$
                • Return-last
                • Mv-let
                • Df
                • Pseudo-termp
                • Defwarrant
                • Time$
                • Mbt
                • Ec-call
                • Mv-nth
                • Sys-call
                • Msg
                • Er
                • Value-triple
                • O-p
                • Comp
                • Member
                • O<
                • Cw
                • Flet
                • Or
                • Hons
                • Cbd
                • Mv
                • Defbadge
                • Append
                • *ACL2-exports*
                • Comment
                • Eql
                • List
                • Unsigned-byte-p
                • Posp
                • Natp
                • The
                • Nth
                • And
                • Len
                • Time-tracker
                • Term-order
                • True-listp
                • Msgp
                • Booleanp
                • <
                • If
                • Pseudo-term-listp
                • +
                • Not
                • With-global-stobj
                • Bitp
                • Equal
                • Cdr
                • Car
                • String-listp
                • Nat-listp
                • Implies
                • Iff
                • Character-listp
                • Alistp
                • Cons
                • Symbol-listp
                • Macrolet
                • Quote
                • Integerp
                • Consp
                • True-list-listp
                • State-global-let*
                • Compress1
                • Symbolp
                • Stringp
                • *common-lisp-symbols-from-main-lisp-package*
                • Characterp
                • Prog2$
                • *
                • Last-prover-steps
                • Hons-acons
                • Let*
                • Eq
                • With-guard-checking
                • @
                • Length
                • With-local-stobj
                • Hard-error
                • -
                • Zp
                • Search
                • Intersection$
                • Assign
                • Aset1
                • Symbol-name
                • Union$
                • Set-gc-strategy
                • In-tau-intervalp
                • Cons-with-hint
                • Break-on-error
                • Pand
                • Case-match
                • Fast-alist-fork
                • Sys-call+
                • Signed-byte-p
                • ACL2-count
                • Remove-duplicates
                • With-serialize-character
                • Observation
                • Hons-resize
                • Make-tau-interval
                • Logbitp
                • Termp
                • Position
                • Assoc
                • *standard-co*
                • Take
                • Hons-acons!
                • Update-nth
                • Aref1
                • Read-run-time
                • Symbol-package-name
                • Symbol-alistp
                • Hons-wash
                • Keywordp
                • Expt
                • Coerce
                • Get-internal-time
                • Nthcdr
                • Intern
                • Non-exec
                • Case
                • Standard-oi
                • Standard-co
                • Formula
                • Atom
                • Without-evisc
                • Good-bye
                • Ash
                • With-local-state
                • Spec-mv-let
                • Intern-in-package-of-symbol
                • Binary-+
                • <=
                • With-fast-alist
                • Set-difference$
                • Hons-clear
                • Flush-compress
                • Rationalp
                • Por
                • Rassoc
                • Remove-assoc
                • =
                • Logand
                • Pargs
                • Nfix
                • Hons-copy
                • Alphorder
                • Subsetp
                • Floor
                • Remove1-assoc
                • No-duplicatesp
                • Mv-list
                • Canonical-pathname
                • Aset2
                • Serialize-read
                • Random$
                • Fmt-to-comment-window
                • F-put-global
                • Compress2
                • Concatenate
                • Fast-alist-clean
                • Assert$
                • Remove
                • Remove1
                • Intersectp
                • Endp
                • Put-assoc
                • Princ$
                • Primitive
                • Keyword-value-listp
                • True-list-fix
                • Swap-stobjs
                • Integer-listp
                • Illegal
                • Hons-get
                • With-output-lock
                • Setenv$
                • Open-output-channel!
                • Fast-alist-free
                • Er-progn
                • Cw-print-base-radix
                • Reverse
                • Cond
                • Complex
                • Add-to-set
                • Truncate
                • Digit-char-p
                • Code-char
                • Char-code
                • Set-print-case
                • Set-print-base
                • Read-ACL2-oracle
                • Error1
                • Print-object$
                • Plet
                • Integer-length
                • Zip
                • With-live-state
                • Hons-assoc-equal
                • Extend-pathname
                • Logior
                • In-package
                • With-guard-checking-event
                • Term-listp
                • Print-object$+
                • Fmx-cw
                • String
                • Mod
                • Unary--
                • Set-print-radix
                • Resize-list
                • Pkg-witness
                • Revappend
                • Null
                • Term-list-listp
                • Make-fast-alist
                • Header
                • Boole$
                • Subseq
                • With-guard-checking-error-triple
                • /
                • Make-list
                • Logxor
                • Char-upcase
                • Char-downcase
                • Strip-cars
                • Set-fmt-hard-right-margin
                • Make-ord
                • Ifix
                • Fast-alist-free-on-exit
                • F-get-global
                • Aref2
                • Standard-char-p
                • Lognot
                • Last
                • Must-be-equal
                • Integer-range-p
                • Getenv$
                • Binary-append
                • Er-hard
                • Eqlablep
                • Cpu-core-count
                • Boolean-listp
                • Allocate-fixnum-range
                • ACL2-numberp
                • Butlast
                • Pairlis$
                • Mod-expt
                • Hons-equal
                • Gc$
                • Substitute
                • Ceiling
                • With-stolen-alist
                • Mv?-let
                • String-upcase
                • String-downcase
                • Round
                • Count
                • Char
                • Sys-call-status
                • Progn$
                • Pprogn
                • Lexorder
                • Hons-summary
                • Break$
                • Assert*
                • Alpha-char-p
                • Strip-cdrs
                • Serialize-write
                • Keyword-listp
                • Upper-case-p
                • Lower-case-p
                • Logeqv
                • List*
                • Proofs-co
                • Maximum-length
                • Fix
                • Explode-nonnegative-integer
                • Eqlable-listp
                • Dimensions
                • Default
                • Arity
                • Sublis
                • Max
                • Evenp
                • Explode-atom
                • Change
                • Zerop
                • String<
                • String-equal
                • Abs
                • Set-print-base-radix
                • Print-base-p
                • Nonnegative-integer-quotient
                • Intern$
                • Getprop
                • Binary-*
                • Aset1-trusted
                • Symbol<
                • String-append
                • Rfix
                • Mv?
                • Logic-fns-list-listp
                • Fast-alist-fork!
                • Er-hard?
                • Char-equal
                • 1+
                • *standard-oi*
                • Sys-call*
                • Pos-listp
                • Mbt*
                • Hons-wash!
                • Hons-clear!
                • Signum
                • Rem
                • Real/rationalp
                • Rational-listp
                • O-first-coeff
                • Logic-fnsp
                • Logic-fns-listp
                • Hons-copy-persistent
                • Gc-strategy
                • Fast-alist-summary
                • String>=
                • String<=
                • Acons
                • O-first-expt
                • Fast-alist-clean!
                • >=
                • >
                • Subst
                • Logcount
                • Getpropc
                • Evens
                • Er-soft
                • Digit-to-char
                • Comp-gcl
                • Atom-listp
                • Arities-okp
                • ACL2-number-listp
                • /=
                • Cadr
                • *standard-ci*
                • Unary-/
                • The-true-list
                • Realfix
                • O-rst
                • Fast-alist-len
                • Complex/complex-rationalp
                • Array2p
                • Array1p
                • Logtest
                • Logandc1
                • Char<
                • Trace-co
                • Putprop
                • Get-real-time
                • Eqlable-alistp
                • Count-keys
                • Assoc-string-equal
                • Logorc1
                • Logandc2
                • Denominator
                • 1-
                • Packn
                • Logic-termp
                • Logic-term-list-listp
                • Fmt!
                • Fms
                • Cw!
                • Assoc-keyword
                • String>
                • Numerator
                • Logorc2
                • Char>=
                • Update-nth-array
                • The-number
                • Odds
                • Makunbound-global
                • Make-character-list
                • Make
                • List$
                • Int=
                • Get-cpu-time
                • Fmt-to-comment-window!
                • Fms!
                • F-boundp-global
                • Complex-rationalp
                • Alist-to-doublets
                • Access
                • Min
                • Lognor
                • Listp
                • Identity
                • Char>
                • Char<=
                • Zpf
                • Standard-char-listp
                • O-finp
                • Number-subtrees
                • Logic-term-listp
                • Last-cdr
                • Fmt1!
                • Fmt-to-comment-window!+
                • Character-alistp
                • Oddp
                • Minusp
                • Lognand
                • Imagpart
                • Conjugate
                • Xor
                • Unquote
                • String-alistp
                • Packn-pos
                • Maybe-flush-and-compress1
                • Kwote
                • Fmt1
                • Fmt-to-comment-window+
                • Cw-print-base-radix!
                • Alist-keys-subsetp
                • Realpart
                • Plusp
                • First
                • Symbol-name-lst
                • R-symbol-alistp
                • R-eqlable-alistp
                • Fmx
                • Cw!+
                • Cons-subtrees
                • Cons-count-bounded
                • Cddr
                • Caar
                • Proper-consp
                • Kwote-lst
                • Improper-consp
                • Cw+
                • Rest
                • Standard-char-p+
                • Mbe1
                • Caddr
                • Pairlis-x2
                • Pairlis-x1
                • O>=
                • O<=
                • O-infp
                • Merge-sort-lexorder
                • Fix-true-list
                • Cdddr
                • Set-fmt-soft-right-margin
                • Real-listp
                • O>
                • Cddar
                • Cdar
                • Cdadr
                • Cdaar
                • Cadar
                • Caadr
                • Caaar
                • Cadddr
                • Caddar
                • Third
                • Tenth
                • Sixth
                • Seventh
                • Second
                • Ninth
                • Fourth
                • Fifth
                • Eighth
                • Cddddr
                • Cdddar
                • Cddadr
                • Cddaar
                • Cdaddr
                • Cdadar
                • Cdaadr
                • Cdaaar
                • Cadadr
                • Cadaar
                • Caaddr
                • Caadar
                • Caaadr
                • Caaaar
                • Hons-shrink-alist!
                • Hons-shrink-alist
                • Flush-hons-get-hash-table-link
                • Delete-assoc
              • Developers-guide
              • System-attachments
              • Advanced-features
              • Set-check-invariant-risk
              • Numbers
              • Efficiency
              • Irrelevant-formals
              • Introduction-to-programming-in-ACL2-for-those-who-know-lisp
              • Redefining-programs
              • Lists
              • Invariant-risk
                • Set-check-invariant-risk
                • Invariant-risk-details
                  • Set-register-invariant-risk
                • Errors
                • Defabbrev
                • Conses
                • Alists
                • Set-register-invariant-risk
                • Strings
                • Program-wrapper
                • Get-internal-time
                • Basics
                • Packages
                • Oracle-eval
                • Defmacro-untouchable
                • <<
                • Primitive
                • Revert-world
                • Unmemoize
                • Set-duplicate-keys-action
                • Symbols
                • Def-list-constructor
                • Easy-simplify-term
                • Defiteration
                • Fake-oracle-eval
                • Defopen
                • Sleep
              • Operational-semantics
              • Real
              • Start-here
              • Debugging
              • Miscellaneous
              • Output-controls
              • Macros
              • Interfacing-tools
            • Interfacing-tools
            • Hardware-verification
            • Software-verification
            • Math
            • Testing-utilities
          • Invariant-risk

          Invariant-risk-details

          More details about invariant-risk

          This topic, which may be unnecessary for most ACL2 users, expands on the documentation for invariant-risk. See that topic and see evaluation for relevant background.

          We refer below to the following example, which is slightly expanded from the one in the documentation for invariant-risk.

          (defstobj st (fld :type integer :initially 0))
          
          (defun f1 (n st)
            (declare (xargs :stobjs st :guard (integerp n)))
            (update-fld n st))
          
          (defun f2 (n st)
            (declare (xargs :stobjs st :guard (integerp n)))
            (f1 n st))
          
          ; This :program-mode wrapper for f fails to require (integerp n):
          (defun g (n st)
            (declare (xargs :stobjs st :mode :program))
            (f2 n st))
          
          ; Trace f1 and f2 and their *1* functions.  (This is optional.)
          (trace$ f1 f2 g)
          
          ; Produces an invariant-risk warning; only *1* functions are called.
          (g 3 st)
          
          ; Produces an invariant-risk warning and a guard violation:
          (g 'a st)
          
          ; Defeat invariant-risk checking (risky; uses a trust tag):
          (set-check-invariant-risk nil)
          
          ; No warning because *1* functions are not called.
          (g 3 st)
          
          ; No warning because *1* functions are not called.
          (g 'a st)
          
          ; Non-integer field value!
          (assert-event (equal (fld st) 'a))

          To understand invariant-risk, consider the case that a stobj updater (such as update-fld above) is called on ill-guarded arguments. In that case the resulting ACL2 state could be ill-formed, as in the example above: after turning off invariant-risk checking, the stobj st is defined to have an integer field yet winds up with a symbol in that field. ACL2 arranges invariant-risk checking by installing special code in the executable-counterpart of a :program-mode function to prevent it from calling its corresponding submitted function. It does this when the :program-mode function has a non-nil 'invariant-risk property; in the example above, note:

          ACL2 !>(getpropc 'g 'invariant-risk)
          UPDATE-FLD
          ACL2 !>

          When the function symbol g was defined, it inherited this property from f2, which in turn inherited it from f1, which in turn inherited it from the stobj updater, update-fld. However, the aforementioned special code is only installed for :program mode functions, hence not for f1 or f2. Consider for example the following trace, from the call of (g 3) made above before turning off invariant-risk checking.

          1> (ACL2_*1*_ACL2::G 3 |<st>|)
          
          ACL2 Warning [Invariant-risk] in G:  Invariant-risk has been detected
          for a call of function G (as possibly leading to an ill-guarded call
          of UPDATE-FLD); see :DOC invariant-risk.
          
            2> (ACL2_*1*_ACL2::F2 3 |<st>|)
              3> (F2 3 |<st>|)
                4> (F1 3 |<st>|)
                <4 (F1 |<st>|)
              <3 (F2 |<st>|)
            <2 (ACL2_*1*_ACL2::F2 |<st>|)
          <1 (ACL2_*1*_ACL2::G |<st>|)
          <st>
          ACL2 !>

          This trace illustrates that even though f2 has the 'invariant-risk property, its executable-counterpart has permission to call its submitted function because f2 is a guard-verified :logic-mode function.

          As an optimization, ACL2 avoids setting the 'invariant-risk property on :logic mode functions whose guard is t or, more generally, a conjunction of stobj recognizer calls. For example, the call of (bar 3 st) below does not cause an invariant-risk warning.

          (progn (defstobj st (reg :type (array (unsigned-byte 31) (8))
                                   :initially 0))
                 (defun foo (i st)
                   (declare (xargs :guard t :stobjs st))
                   (if (eql i 0) (update-regi i 3 st) st))
                 (defun bar (i st)
                   (declare (xargs :stobjs st :mode :program))
                   (foo i st)))
          (bar 3 st)

          This optimization can hold even if the function is originally submitted without guard verification (typically, using xargs declaration :verify-guards nil), but only if its guards are verified before defining the :program-mode wrapper (e.g., bar above). Thus we see an invariant-risk warning in the call of bar below.

          (progn (defstobj st (reg :type (array (unsigned-byte 31) (8))
                                   :initially 0))
                 (defun foo (i st)
                   (declare (xargs :guard t :stobjs st :VERIFY-GUARDS NIL))
                   (if (eql i 0) (update-regi i 3 st) st))
                 (defun bar (i st)
                   (declare (xargs :stobjs st :mode :program))
                   (foo i st))
                 (verify-guards foo) ; avoid invariant-risk by moving before bar
                 )
          (bar 3 st) ; invariant-risk

          Here is code that will return a list of all :program-mode functions subject to invariant-risk checking that are user-defined (not built into ACL2).

          :q ; go into raw Lisp
          (let (ans (wrld (w *the-live-state*)))
            (dolist (p (list-all-packages))
              (do-symbols (sym p)
                (when (and (getpropc sym 'invariant-risk)
                           (programp sym wrld)
                           (not (getpropc sym 'predefined)))
                  (push sym ans))))
            ans)

          To see exactly the executable-counterpart code generated for a :program-mode function with invariant-risk, evaluate (trace! (oneify-cltl-code :native t)) before submitting its definition.