gear_core/code/
errors.rs

1// This file is part of Gear.
2
3// Copyright (C) 2024-2025 Gear Technologies Inc.
4// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0
5
6// This program is free software: you can redistribute it and/or modify
7// it under the terms of the GNU General Public License as published by
8// the Free Software Foundation, either version 3 of the License, or
9// (at your option) any later version.
10
11// This program is distributed in the hope that it will be useful,
12// but WITHOUT ANY WARRANTY; without even the implied warranty of
13// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14// GNU General Public License for more details.
15
16// You should have received a copy of the GNU General Public License
17// along with this program. If not, see <https://www.gnu.org/licenses/>.
18
19//! Module that describes various code errors.
20
21pub use gear_wasm_instrument::{InstrumentationError, ModuleError};
22pub use wasmparser::BinaryReaderError;
23
24/// Section name in WASM module.
25#[derive(PartialEq, Eq, Debug, derive_more::Display)]
26pub enum SectionName {
27    /// Type section.
28    #[display("Type section")]
29    Type,
30    /// Import section.
31    #[display("Import section")]
32    Import,
33    /// Function (Code) section.
34    #[display("Function section")]
35    Function,
36    /// Data section.
37    #[display("Data section")]
38    Data,
39    /// Global section.
40    #[display("Global section")]
41    Global,
42    /// Table section.
43    #[display("Table section")]
44    Table,
45    /// Element section.
46    #[display("Element section")]
47    Element,
48    /// Export section.
49    #[display("Export section")]
50    Export,
51    /// Start section.
52    #[display("Start section")]
53    Start,
54}
55
56/// Section error in WASM module.
57#[derive(Debug, derive_more::Display)]
58pub enum SectionError {
59    /// Section not found.
60    #[display("{_0} not found")]
61    NotFound(SectionName),
62    /// Section not supported.
63    #[display("{_0} not supported")]
64    NotSupported(SectionName),
65}
66
67/// Memory error in WASM module.
68#[derive(Debug, derive_more::Display)]
69pub enum MemoryError {
70    /// Memory entry not found in import section.
71    #[display("Memory entry not found")]
72    EntryNotFound,
73    /// The WASM module has invalid count of static memory pages.
74    #[display("The WASM module has invalid count of static memory pages")]
75    InvalidStaticPageCount,
76}
77
78/// Stack end error in WASM module.
79#[derive(Debug, derive_more::Display)]
80pub enum StackEndError {
81    /// Unsupported initialization of gear stack end global variable.
82    #[display("Unsupported initialization of gear stack end global")]
83    Initialization,
84    /// Gear stack end offset is not aligned to wasm page size.
85    #[display("Gear stack end {_0:#x} is not aligned to wasm page size")]
86    NotAligned(u32),
87    /// Gear stack end is out of static memory.
88    #[display("Gear stack end {_0:#x} is out of static memory 0x0..{_1:#x}")]
89    OutOfStatic(u32, u64),
90}
91
92/// Data section error in WASM module.
93#[derive(Debug, derive_more::Display)]
94pub enum DataSectionError {
95    /// Unsupported initialization of data segment.
96    #[display("Unsupported initialization of data segment")]
97    Initialization,
98    /// Data section overlaps gear stack.
99    #[display("Data segment {_0:#x} overlaps gear stack 0x0..{_1:#x}")]
100    GearStackOverlaps(u32, u32),
101    /// Data segment end address is out of possible 32 bits address space.
102    #[display("Data segment {_0:#x} ends out of possible 32 bits address space")]
103    EndAddressOverflow(u32),
104    /// Data segment end address is out of static memory.
105    #[display("Data segment {_0:#x}..={_1:#x} is out of static memory 0x0..{_2:#x}")]
106    EndAddressOutOfStaticMemory(u32, u32, u64),
107    /// Data segment amount exceeds the limit.
108    #[display("Data segment amount limit exceeded: limit={limit}, actual={actual}")]
109    DataSegmentsAmountLimit {
110        /// Limit of data segments.
111        limit: u32,
112        /// Actual amount of data segments.
113        actual: u32,
114    },
115}
116
117/// Export error in WASM module.
118#[derive(Debug, derive_more::Display)]
119pub enum ExportError {
120    /// Incorrect global export index. Can occur when export refers to not existing global index.
121    #[display("Global index `{_0}` in export index `{_1}` is incorrect")]
122    IncorrectGlobalIndex(u32, u32),
123    /// Exporting mutable globals is restricted by the Gear protocol.
124    #[display("Global index `{_0}` in export index `{_1}` cannot be mutable")]
125    MutableGlobalExport(u32, u32),
126    /// Export references to an import function, which is not allowed.
127    #[display("Export index `{_0}` references to imported function with index `{_1}`")]
128    ExportReferencesToImportFunction(u32, u32),
129    /// Export references to an import global, which is not allowed.
130    #[display("Export index `{_0}` references to imported global with index `{_1}`")]
131    ExportReferencesToImportGlobal(u32, u32),
132    /// The signature of an exported function is invalid.
133    #[display("Exported function with index `{_0}` must have signature `fn f() {{ ... }}`")]
134    InvalidExportFnSignature(u32),
135    /// The provided code contains excess function export.
136    #[display("Excess export with index `{_0}` found")]
137    ExcessExport(u32),
138    /// The provided code doesn't contain the required `init` or `handle` export function.
139    #[display("Required export function `init` or `handle` is not found")]
140    RequiredExportNotFound,
141}
142
143/// Import error in WASM module.
144#[derive(Debug, derive_more::Display)]
145pub enum ImportError {
146    /// The imported function is not supported by the Gear protocol.
147    #[display("Unknown imported function with index `{_0}`")]
148    UnknownImport(u32),
149    /// The imported function is declared multiple times.
150    #[display("Imported function with index `{_0}` is declared multiple times")]
151    DuplicateImport(u32),
152    /// The signature of an imported function is invalid.
153    #[display("Invalid function signature for imported function with index `{_0}`")]
154    InvalidImportFnSignature(u32),
155    /// Unexpected import kind.
156    #[display("Unexpected import kind `{kind}` with index `{index}`")]
157    UnexpectedImportKind {
158        /// Kind of the import.
159        kind: &'static &'static str,
160        /// Index of the import.
161        index: u32,
162    },
163}
164
165/// Describes why the code is not valid Gear program.
166#[derive(Debug, derive_more::Display, derive_more::From)]
167pub enum CodeError {
168    /// Validation by wasmparser failed.
169    #[display("wasmparser validation error: {_0}")]
170    Validation(BinaryReaderError),
171    /// Module encode/decode error.
172    #[display("Codec error: {_0}")]
173    Module(ModuleError),
174    /// The provided code contains section error.
175    #[display("Section error: {_0}")]
176    Section(SectionError),
177    /// The provided code contains memory error.
178    #[display("Memory error: {_0}")]
179    Memory(MemoryError),
180    /// The provided code contains stack end error.
181    #[display("Stack end error: {_0}")]
182    StackEnd(StackEndError),
183    /// The provided code contains data section error.
184    #[display("Data section error: {_0}")]
185    DataSection(DataSectionError),
186    /// The provided code contains export error.
187    #[display("Export error: {_0}")]
188    Export(ExportError),
189    /// The provided code contains import error.
190    #[display("Import error: {_0}")]
191    Import(ImportError),
192    /// Error occurred during instrumentation WASM module.
193    #[display("Instrumentation error: {_0}")]
194    Instrumentation(InstrumentationError),
195}
196
197impl core::error::Error for CodeError {}