Restrictions of C++ Language Features
Qubic enforces strict coding rules to ensure determinism, security, and network-wide consistency. Below is a list of forbidden language features and why they are restricted:
Prohibited Feature | Reason |
---|---|
Local variables on the stack | Avoids nondeterministic memory layouts. Use _WITH_LOCALS macros or store data in contract state. |
Pointers (* , casting, dereferencing) | Unsafe and non-deterministic. Only allowed for multiplication. |
Array brackets ([ ] ) | Prevents unchecked buffer access and low-level arrays, which can lead to memory issues. |
Preprocessor directives (# ) | Disallowed to avoid hidden logic and platform-specific behavior. #include "qpi.h" is allowed only temporarily for IntelliSense. |
Floating-point types (float , double ) | Arithmetic is not deterministic across platforms. |
Division (/ ) and modulo (% ) | Division by zero may cause inconsistent behavior. Use div() and mod() instead, which return 0 safely. |
Strings (" ) and chars (' )` | Can lead to memory access violations or random memory jumps. |
Variadic arguments (... ) | Compiler-dependent and unsafe for auditing. |
Double underscores (__ ) | Reserved for internal use; may conflict with system symbols. |
QpiContext , const_cast | Can be misused to alter internal contract behavior. |
Scope resolution (:: ) | Only allowed for structs, enums, and namespaces inside contracts or qpi.h . |
typedef , union | Reduces code clarity and may be used to obscure logic or manipulate memory. |
Global variables | Disallowed to avoid shared mutable state. Global constants must be prefixed with the contract state struct name. |
Recursion / deep call nesting | Limited to 10 levels to ensure execution is bounded and safe. |
Complex types in input/output | Only simple types (sint , uint , bit , id , Array , BitArray ) are allowed. Complex types like Collection are banned to ensure consistent state. |