• Top
    • Documentation
    • Books
    • Boolean-reasoning
    • Projects
    • Debugging
    • Community
    • Std
    • Proof-automation
    • Macro-libraries
    • ACL2
    • Interfacing-tools
    • Hardware-verification
    • Software-verification
      • Kestrel-books
        • Crypto-hdwallet
        • Apt
        • Error-checking
        • Fty-extensions
        • Isar
        • Kestrel-utilities
        • Set
        • Soft
        • C
          • Syntax-for-tools
            • Disambiguator
            • Parser
            • Validator
              • Valid-exprs/decls/stmts
              • Valid-stmt
              • Valid-dirdeclor
              • Valid-expr
              • Valid-type-spec
              • Valid-stor-spec-list
              • Valid-binary
              • Valid-unary
              • Valid-initdeclor
              • Valid-fundef
              • Valid-type-spec-list-residual
              • Valid-stringlit-list
              • Valid-cond
              • Valid-lookup-ord
              • Valid-transunit
              • Valid-declor
              • Valid-c-char
              • Valid-transunit-ensemble
              • Valid-iconst
              • Valid-initer
              • Valid-funcall
              • Valid-arrsub
              • Valid-add-ord
              • Valid-univ-char-name
              • Valid-extdecl
              • Valid-extdecl-list
              • Valid-s-char
              • Valid-cconst
                • Valid-sizeof/alignof
                • Valid-memberp
                • Valid-cast
                • Valid-var
                • Valid-add-ord-file-scope
                • Valid-spec/qual
                • Valid-oct-escape
                • Valid-decl-spec
                • Valid-param-declon
                • Valid-enum-const
                • Valid-structdeclor
                • Valid-structdecl
                • Valid-gensel
                • Valid-escape
                • Valid-designor
                • Valid-const
                • Valid-add-ords-file-scope
                • Valid-s-char-list
                • Valid-dec/oct/hex-const
                • Valid-c-char-list
                • Valid-stringlit
                • Valid-member
                • Valid-decl-spec-list
                • Valid-lookup-ord-file-scope
                • Valid-param-declor
                • Valid-spec/qual-list
                • Valid-fconst
                • Valid-block-item
                • Valid-structdeclor-list
                • Valid-align-spec
                • Valid-simple-escape
                • Valid-enumer
                • Valid-decl
                • Valid-enumspec
                • Valid-dirabsdeclor
                • Valid-declor-option
                • Valid-pop-scope
                • Valid-initer-option
                • Valid-block-item-list
                • Valid-absdeclor
                • Valid-push-scope
                • Valid-label
                • Valid-genassoc
                • Valid-tyname
                • Valid-struni-spec
                • Valid-structdecl-list
                • Valid-genassoc-list
                • Valid-dirabsdeclor-option
                • Valid-designor-list
                • Valid-const-expr
                • Valid-initdeclor-list
                • Valid-absdeclor-option
                • Valid-expr-list
                • Valid-desiniter-list
                • Valid-table-num-scopes
                • Valid-param-declon-list
                • Valid-desiniter
                • Valid-const-expr-option
                • Valid-expr-option
                • Valid-statassert
                • Valid-enumer-list
                • Valid-member-designor
                • Valid-init-table
                • Valid-empty-scope
                • Valid-decl-list
              • Printer
              • Formalized-subset
              • Mapping-to-language-definition
              • Input-files
              • Defpred
              • Output-files
              • Abstract-syntax-operations
              • Validation-information
              • Concrete-syntax
              • Ascii-identifiers
              • Unambiguity
              • Preprocessing
              • Abstract-syntax
              • Implementation-environments
              • Standard
              • Gcc-builtins
              • Purity
            • Atc
            • Language
            • Transformation-tools
            • Representation
            • Insertion-sort
            • Pack
          • Bv
          • Imp-language
          • Event-macros
          • Java
          • Riscv
          • Bitcoin
          • Ethereum
          • Yul
          • Zcash
          • ACL2-programming-language
          • Prime-fields
          • Json
          • Syntheto
          • File-io-light
          • Cryptography
          • Number-theory
          • Lists-light
          • Axe
          • Builtins
          • Solidity
          • Helpers
          • Htclient
          • Typed-lists-light
          • Arithmetic-light
        • X86isa
        • Axe
        • Execloader
      • Math
      • Testing-utilities
    • Validator

    Valid-cconst

    Validate a character constant.

    Signature
    (valid-cconst cconst ienv) → (mv erp type)
    Arguments
    cconst — Guard (cconstp cconst).
    ienv — Guard (ienvp ienv).
    Returns
    erp — Type (maybe-msgp erp).
    type — Type (typep type).

    We check the characters that form the constant, with respect to the prefix (if any). If validation is successful, we return the type of the constant. According to [C17:6.4.4.4/10], a character constant without prefix has type int. According to [C17:6.4.4.4/11], a character constant with a prefix has type wchar_t, char16_t, or char32_t; since for now we do not model these, we return an unknown type in this case.

    The types wchar_t, char16_t, and char32_t may vary across implementations. In order to handle these in a general way, we should probably extend our implementation environments with information about which built-in types those types expand to. Once we do that, we will be able to perform a full validation of character constants here.

    Definitions and Theorems

    Function: valid-cconst

    (defun valid-cconst (cconst ienv)
      (declare (xargs :guard (and (cconstp cconst) (ienvp ienv))))
      (let ((__function__ 'valid-cconst))
        (declare (ignorable __function__))
        (b* (((reterr) (irr-type))
             ((cconst cconst) cconst)
             ((erp &)
              (valid-c-char-list cconst.cchars cconst.prefix? ienv)))
          (if cconst.prefix? (retok (type-unknown))
            (retok (type-sint))))))

    Theorem: maybe-msgp-of-valid-cconst.erp

    (defthm maybe-msgp-of-valid-cconst.erp
      (b* (((mv acl2::?erp ?type)
            (valid-cconst cconst ienv)))
        (maybe-msgp erp))
      :rule-classes :rewrite)

    Theorem: typep-of-valid-cconst.type

    (defthm typep-of-valid-cconst.type
      (b* (((mv acl2::?erp ?type)
            (valid-cconst cconst ienv)))
        (typep type))
      :rule-classes :rewrite)

    Theorem: valid-cconst-of-cconst-fix-cconst

    (defthm valid-cconst-of-cconst-fix-cconst
      (equal (valid-cconst (cconst-fix cconst) ienv)
             (valid-cconst cconst ienv)))

    Theorem: valid-cconst-cconst-equiv-congruence-on-cconst

    (defthm valid-cconst-cconst-equiv-congruence-on-cconst
      (implies (cconst-equiv cconst cconst-equiv)
               (equal (valid-cconst cconst ienv)
                      (valid-cconst cconst-equiv ienv)))
      :rule-classes :congruence)

    Theorem: valid-cconst-of-ienv-fix-ienv

    (defthm valid-cconst-of-ienv-fix-ienv
      (equal (valid-cconst cconst (c::ienv-fix ienv))
             (valid-cconst cconst ienv)))

    Theorem: valid-cconst-ienv-equiv-congruence-on-ienv

    (defthm valid-cconst-ienv-equiv-congruence-on-ienv
      (implies (c::ienv-equiv ienv ienv-equiv)
               (equal (valid-cconst cconst ienv)
                      (valid-cconst cconst ienv-equiv)))
      :rule-classes :congruence)