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/// Type section error in WASM module.
118#[derive(Debug, derive_more::Display)]
119pub enum TypeSectionError {
120    /// Type section length exceeds the limit.
121    #[display("Type section length limit exceeded: limit={limit}, actual={actual}")]
122    LengthLimitExceeded {
123        /// Max length of type section.
124        limit: u32,
125        /// Actual length of type section.
126        actual: u32,
127    },
128    /// Type section number of parameters per type exceeds the limit.
129    #[display("Type section parameters per type limit exceeded: limit={limit}, actual={actual}")]
130    ParametersPerTypeLimitExceeded {
131        /// Max number of parameters per type.
132        limit: u32,
133        /// Actual number of parameters per type.
134        actual: u32,
135    },
136}
137
138/// Export error in WASM module.
139#[derive(Debug, derive_more::Display)]
140pub enum ExportError {
141    /// Incorrect global export index. Can occur when export refers to not existing global index.
142    #[display("Global index `{_0}` in export index `{_1}` is incorrect")]
143    IncorrectGlobalIndex(u32, u32),
144    /// Exporting mutable globals is restricted by the Gear protocol.
145    #[display("Global index `{_0}` in export index `{_1}` cannot be mutable")]
146    MutableGlobalExport(u32, u32),
147    /// Export references to an import function, which is not allowed.
148    #[display("Export index `{_0}` references to imported function with index `{_1}`")]
149    ExportReferencesToImportFunction(u32, u32),
150    /// Export references to an import global, which is not allowed.
151    #[display("Export index `{_0}` references to imported global with index `{_1}`")]
152    ExportReferencesToImportGlobal(u32, u32),
153    /// The signature of an exported function is invalid.
154    #[display("Exported function with index `{_0}` must have signature `fn f() {{ ... }}`")]
155    InvalidExportFnSignature(u32),
156    /// The provided code contains excess function export.
157    #[display("Excess export with index `{_0}` found")]
158    ExcessExport(u32),
159    /// The provided code doesn't contain the required `init` or `handle` export function.
160    #[display("Required export function `init` or `handle` is not found")]
161    RequiredExportNotFound,
162}
163
164/// Import error in WASM module.
165#[derive(Debug, derive_more::Display)]
166pub enum ImportError {
167    /// The imported function is not supported by the Gear protocol.
168    #[display("Unknown imported function with index `{_0}`")]
169    UnknownImport(u32),
170    /// The imported function is declared multiple times.
171    #[display("Imported function with index `{_0}` is declared multiple times")]
172    DuplicateImport(u32),
173    /// The signature of an imported function is invalid.
174    #[display("Invalid function signature for imported function with index `{_0}`")]
175    InvalidImportFnSignature(u32),
176    /// Unexpected import kind.
177    #[display("Unexpected import kind `{kind}` with index `{index}`")]
178    UnexpectedImportKind {
179        /// Kind of the import.
180        kind: &'static &'static str,
181        /// Index of the import.
182        index: u32,
183    },
184}
185
186/// Describes why the code is not valid Gear program.
187#[derive(Debug, derive_more::Display, derive_more::From)]
188pub enum CodeError {
189    /// Validation by wasmparser failed.
190    #[display("wasmparser validation error: {_0}")]
191    Validation(BinaryReaderError),
192    /// Module encode/decode error.
193    #[display("Codec error: {_0}")]
194    Module(ModuleError),
195    /// The provided code contains section error.
196    #[display("Section error: {_0}")]
197    Section(SectionError),
198    /// The provided code contains memory error.
199    #[display("Memory error: {_0}")]
200    Memory(MemoryError),
201    /// The provided code contains stack end error.
202    #[display("Stack end error: {_0}")]
203    StackEnd(StackEndError),
204    /// The provided code contains data section error.
205    #[display("Data section error: {_0}")]
206    DataSection(DataSectionError),
207    /// The provided code contains type section error.
208    #[display("Type section error: {_0}")]
209    TypeSection(TypeSectionError),
210    /// The provided code contains export error.
211    #[display("Export error: {_0}")]
212    Export(ExportError),
213    /// The provided code contains import error.
214    #[display("Import error: {_0}")]
215    Import(ImportError),
216    /// Error occurred during instrumentation WASM module.
217    #[display("Instrumentation error: {_0}")]
218    Instrumentation(InstrumentationError),
219}
220
221impl core::error::Error for CodeError {}