David Sanán

dblp:22/111 · DBLP profile ↗
← Back
38ranked-venue papers
3as first author
12since 2021 · last 2025
0000-0003-2755-3089ORCID · verified

Domains — the database's venue-derived domains; a paper can count in several

Software engineering, systems software and programming languages · 27 · 3 first-author · 8 since 2021Theory of computation · 8 · 2 since 2021Security and privacy · 3 · 1 since 2021Artificial intelligence and machine learning · 2 · 1 since 2021Applied, interdisciplinary, general and emerging computing · 2Computer networks · 1
YearPublicationVenuePosition
2025 Generalized Security-Preserving Refinement for Concurrent Systems
abstract
Ensuring compliance with Information Flow Security (IFS) is known to be challenging, especially for concurrent systems with large codebases such as multicore operating system (OS) kernels. Refinement, which verifies that an implementation preserves certain properties of a more abstract specification, is promising for tackling such challenges. However, in terms of refinement-based verification of security properties, existing techniques are still restricted to sequential systems or lack the expressiveness needed to capture complex security policies for concurrent systems.
David Sanán, Jingyi Wang 0004, Yongwang Zhao, Jun Sun 0001, Wenhai Wang
CCS2
2025 Modeling and Verifying Concurrent Reactive Systems Using Separation Logic
David Sanán, Jun Sun 0001, Wenhai Wang
ICFEM2
2025 Automated Program Refinement: Guide and Verify Code Large Language Model with Refinement Calculus
abstract
Recently, the rise of code-centric Large Language Models (LLMs) has reshaped the software engineering world with low-barrier tools like Copilot that can easily generate code. However, there is no correctness guarantee for the code generated by LLMs, which suffer from the hallucination problem, and their output is fraught with risks. Besides, the end-to-end process from specification to code through LLMs is a non-transparent and uncontrolled black box. This opacity makes it difficult for users to understand and trust the generated code. Addressing these challenges is both necessary and critical. In contrast, program refinement transforms high-level specification statements into executable code while preserving correctness. Traditional tools for program refinement are primarily designed for formal methods experts and lack automation and extensibility. We apply program refinement to guide LLM and validate the LLM-generated code while transforming refinement into a more accessible and flexible framework. To initiate this vision, we propose Refine4LLM, an approach that aims to:(1) Formally refine the specifications, (2) Automatically prompt and guide the LLM using refinement calculus, (3) Interact with the LLM to generate the code, (4) Verify that the generated code satisfies the constraints, thus guaranteeing its correctness, (5) Learn and build more advanced refinement laws to extend the refinement calculus. We evaluated Refine4LLM against the state-of-the-art baselines on program refinement and LLMs benchmarks. The experiment results show that Refine4LLM can efficiently generate more robust code and reduce the time for refinement and verification.
Yufan Cai 0001, David Sanán, Xiaokun Luan, Yun Lin 0001, Jun Sun 0001, Jin Song Dong 0001
Proc. ACM Program. Lang.3
2025 Generically Automating Separation Logic by Functors, Homomorphisms, and Modules
abstract
Foundational verification considers the functional correctness of programming languages with formalized semantics and uses proof assistants (e.g., Coq, Isabelle) to certify proofs. The need for verifying complex programs compels it to involve expressive Separation Logics (SLs) that exceed the scopes of well-studied automated proof theories, e.g., symbolic heap. Consequently, automation of SL in foundational verification relies heavily on ad-hoc heuristics that lack a systematic meta-theory and face scalability issues. To mitigate the gap, we propose a theory to specify SL predicates using abstract algebras including functors, homomorphisms, and modules over rings. Based on this theory, we develop a generic SL automation algorithm to reason about any data structures that can be characterized by these algebras. In addition, we also present algorithms for automatically instantiating the algebraic models to real data structures. The instantiation works compositionally, reusing the algebraic models of component structures and preserving their data abstractions. Case studies on formalized imperative semantics show our algorithm can instantiate the algebraic models automatically for a variety of complex data structures. Experimental results indicate the automatically instantiated reasoners from our generic theory show similar results to the state-of-the-art systems made of specifically crafted reasoning rules. The presented theories, proofs, and the verification framework are formalized in Isabelle/HOL.
Qiyuan Xu, David Sanán, Xiaokun Luan, Conrad Watt, Yang Liu 0003
Proc. ACM Program. Lang.2
2025 A Complete Formal Semantics of eBPF Instruction Set Architecture for Solana
abstract
We present the first formal semantics for the Solana eBPF bytecode language used in smart contracts on the Solana blockchain platform. Our formalization accurately captures all binary-level instructions of the Solana eBPF instruction set architecture. This semantics is structured in a small-step style, facilitating the formalization of the Solana eBPF interpreter within Isabelle/HOL. We provide a semantics validation framework that extracts an executable semantics from our formalization to test against the original implementation of the Solana eBPF interpreter. This approach introduces a novel lightweight and non-invasive method to relax the limitations of the existing Isabelle/HOL extraction mechanism. Furthermore, we illustrate potential applications of our semantics in the formalization of the main components of the Solana eBPF virtual machine
Shenghao Yuan, Zhuoruo Zhang, David Sanán, Yongwang Zhao
Proc. ACM Program. Lang.4
2024 Formalizing x86-64 ISA in Isabelle/HOL: A Binary Semantics for eBPF JIT Correctness
Shenghao Yuan, David Sanán, Yongwang Zhao
SETTA3
2024 A Parallel and Distributed Quantum SAT Solver Based on Entanglement and Teleportation
abstract
Abstract Boolean satisfiability (SAT) solving is a fundamental problem in computer science. Finding efficient algorithms for SAT solving has broad implications in many areas of computer science and beyond. Quantum SAT solvers have been proposed in the literature based on Grover’s algorithm. Although existing quantum SAT solvers can consider all possible inputs at once, they evaluate each clause in the formula one by one sequentially, making the time complexityO(m), linear to the number of clausesm,per Grover iteration. In this work, we develop aparallelquantum SAT solver, which reduces the time complexity in each iteration to constant timeO(1) by utilising extra entangled qubits. To further improve the scalability of our solution in case of extremely large problems, we develop a distributed version of the proposed parallel SAT solver based on quantum teleportation such that the total qubits required are shared and distributed among a set of quantum computers (nodes), and the quantum SAT solving is accomplished collaboratively by all the nodes. We prove the correctness of our approaches and evaluate them in simulations and real quantum computers.
Shangwei Lin 0001, Tzu-Fan Wang, Yean-Ru Chen, David Sanán, Yon Shin Teo
TACAS (2)5
2024 Formally understanding Rust's ownership and borrowing system at the memory level
Shuanglong Kan, Zhe Chen 0011, David Sanán, Yang Liu 0003
Formal Methods Syst. Des.3
2022 A Formal Methodology for Verifying Side-Channel Vulnerabilities in Cache Architectures
Ke Jiang 0001, Tianwei Zhang 0004, David Sanán, Yongwang Zhao, Yang Liu 0003
ICFEM3
2022 A Quantum interpretation of separating conjunction for local reasoning of Quantum programs based on separation logic
abstract
It is well-known that quantum programs are not only complicated to design but also challenging to verify because the quantum states can have exponential size and require sophisticated mathematics to encode and manipulate. To tackle the state-space explosion problem for quantum reasoning, we propose a Hoare-style inference framework that supports local reasoning for quantum programs. By providing a quantum interpretation of the separating conjunction, we are able to infuse separation logic into our framework and apply local reasoning using a quantum frame rule that is similar to the classical frame rule. For evaluation, we apply our framework to verify various quantum programs including Deutsch–Jozsa’s algorithm and Grover's algorithm.
Xuan-Bach Le, Shangwei Lin 0001, Jun Sun 0001, David Sanán
Proc. ACM Program. Lang.4
2021 An Isabelle/HOL Formalisation of the SPARC Instruction Set Architecture and the TSO Memory Model
David Sanán, Alwen Tiu, Yang Liu 0003, Koh Chuen Hoa, Jin Song Dong 0001
J. Autom. Reason.2
2021 CSim2: Compositional Top-down Verification of Concurrent Systems using Rely-Guarantee
abstract
To make feasible and scalable the verification of large and complex concurrent systems, it is necessary the use of compositional techniques even at the highest abstraction layers. When focusing on the lowest software abstraction layers, such as the implementation or the machine code, the high level of detail of those layers makes the direct verification of properties very difficult and expensive. It is therefore essential to use techniques allowing to simplify the verification on these layers. One technique to tackle this challenge is top-down verification where by means of simulation properties verified on top layers (representing abstract specifications of a system) are propagated down to the lowest layers (that are an implementation of the top layers). There is no need to say that simulation of concurrent systems implies a greater level of complexity, and having compositional techniques to check simulation between layers is also desirable when seeking for both feasibility and scalability of the refinement verification. In this article, we present CSim 2 a (compositional) rely-guarantee-based framework for the top-down verification of complex concurrent systems in the Isabelle/HOL theorem prover. CSim 2 uses CSimpl, a language with a high degree of expressiveness designed for the specification of concurrent programs. Thanks to its expressibility, CSimpl is able to model many of the features found in real world programming languages like exceptions, assertions, and procedures. CSim 2 provides a framework for the verification of rely-guarantee properties to compositionally reason on CSimpl specifications. Focusing on top-down verification, CSim 2 provides a simulation-based framework for the preservation of CSimpl rely-guarantee properties from specifications to implementations. By using the simulation framework, properties proven on the top layers (abstract specifications) are compositionally propagated down to the lowest layers (source or machine code) in each concurrent component of the system. Finally, we show the usability of CSim 2 by running a case study over two CSimpl specifications of an Arinc-653 communication service. In this case study, we prove a complex property on a specification, and we use CSim 2 to preserve the property on lower abstraction layers.
David Sanán, Yongwang Zhao, Shangwei Lin 0001, Yang Liu 0003
ACM Trans. Program. Lang. Syst.1
2020 Automatic Verification of Multi-threaded Programs by Inference of Rely-Guarantee Specifications
abstract
Rely-Guarantee is a comprehensive technique that supports compositional reasoning for concurrent programs. However, specifications of the Rely condition - environment interference, and Guarantee condition - local transformation of thread state - are challenging to establish. Thus the construction of these conditions becomes bottleneck in automating the technique. To tackle the above problem, we propose a verification framework that, based on Rely-Guarantee principles, constructs the correctness proof of concurrent program through inferring suitable Rely -Guarantee conditions automatically. Our framework first constructs a Hoare-style sequential proof for each thread and then applies abstraction refinement to elevate these proofs into concurrent ones with appropriate Rely-Guarantee relations. Experiment results demonstrate that our approach is efficient in proving the correctness of concurrent programs.
Xuan-Bach Le, David Sanán, Jun Sun 0001, Shangwei Lin 0001
ICECCS2
2020 Semantic Understanding of Smart Contracts: Executable Operational Semantics of Solidity
abstract
Bitcoin has been a popular research topic recently. Ethereum (ETH), a second generation of cryptocurrency, extends Bitcoin's design by offering a Turing-complete programming language called Solidity to develop smart contracts. Smart contracts allow creditable execution of contracts on EVM (Ethereum Virtual Machine) without third parties. Developing correct and secure smart contracts is challenging due to the decentralized computation nature of the blockchain. Buggy smart contracts may lead to huge financial loss. Furthermore, smart contracts are very hard, if not impossible, to patch once they are deployed. Thus, there is a recent surge of interest in analyzing and verifying smart contracts. While most of the existing works either focus on EVM bytecode or translate Solidity smart contracts into programs in intermediate languages, we argue that it is important and necessary to understand and formally define the semantics of Solidity since programmers write and reason about smart contracts at the level of source code. In this work, we develop a formal semantics for Solidity which provides a formal specification of smart contracts to define semantic-level security properties for the high-level verification. Furthermore, the proposed semantics defines correct and secure high-level execution behaviours of smart contracts to reason about compiler bugs and assist developers in writing secure smart contracts.
Jiao Jiao 0002, Shuanglong Kan, Shangwei Lin 0001, David Sanán, Yang Liu 0003, Jun Sun 0001
SP4
2019 Rely-Guarantee Reasoning About Concurrent Memory Management in Zephyr RTOS
abstract
Formal verification of concurrent operating systems (OSs) is challenging, and in particular the verification of the dynamic memory management due to its complex data structures and allocation algorithm. Up to our knowledge, this paper presents the first formal specification and mechanized proof of a concurrent buddy memory allocation for a real-world OS. We develop a fine-grained formal specification of the buddy memory management in Zephyr RTOS. To ease validation of the specification and the source code, the provided specification closely follows the C code. Then, we use the rely-guarantee technique to conduct the compositional verification of functional correctness and invariant preservation. During the formal verification, we found three bugs in the C code of Zephyr.
Yongwang Zhao, David Sanán
CAV (2)2
2019 A Parametric Rely-Guarantee Reasoning Framework for Concurrent Reactive Systems
Yongwang Zhao, David Sanán, Fuyuan Zhang, Yang Liu 0003
FM2
2019 A Formally Verified Buddy Memory Allocation Model
abstract
Buddy memory allocation algorithms are widely adopted by various memory management systems for managing memory layouts. Rigorous mathematical proofs provide strong assurance to improve the confidence on the reliability of a memory management system. In this paper, we model and formally verify, in the interactive theorem prover Isabelle/HOL, a buddy memory allocation model, which preserves functional correctness and security properties. Firstly, we construct a specification consisting of operations to allocate and dispose memory blocks according to a buddy memory allocation algorithm. Then we verify that the specification preserves key invariants over the memory to guarantee functional correctness of the algorithm. Finally, we verify that the specification also preserves the integrity of the memory. Therefore, they do not affect other memory blocks previously allocated.
Ke Jiang 0001, David Sanán, Yongwang Zhao, Shuanglong Kan, Yang Liu 0003
ICECCS2
2019 A Verified Specification of TLSF Memory Management Allocator Using State Monads
Yongwang Zhao, David Sanán, Jinkun Zhang
SETTA3
2019 Refinement-Based Specification and Security Analysis of Separation Kernels
abstract
Assurance of information-flow security by formal methods is mandated in security certification of separation kernels. As an industrial standard for improving safety, ARINC 653 has been complied with by mainstream separation kernels. Due to the new trend of integrating safe and secure functionalities into one separation kernel, security analysis of ARINC 653 as well as a formal specification with security proofs are thus significant for the development and certification of ARINC 653 compliant Separation Kernels (ARINC SKs). This paper presents a specification development and security analysis method for ARINC SKs based on refinement. We propose a generic security model and a stepwise refinement framework. Two levels of functional specification are developed by the refinement. A major part of separation kernel requirements in ARINC 653 are modeled, such as kernel initialization, two-level scheduling, partition and process management, and inter-partition communication. The formal specification and its security proofs are carried out in the Isabelle/HOL theorem prover. We have reviewed the source code of one industrial and two open-source ARINC SK implementations, i.e., VxWorks 653, XtratuM, and POK, in accordance with the formal specification. During the verification and code review, six security flaws, which can cause information leakage, are found in the ARINC 653 standard and the implementations.
Yongwang Zhao, David Sanán, Fuyuan Zhang, Yang Liu 0003
IEEE Trans. Dependable Secur. Comput.2
2018 Compositional Reasoning for Shared-Variable Concurrent Programs
Fuyuan Zhang, Yongwang Zhao, David Sanán, Yang Liu 0003, Alwen Tiu, Shangwei Lin 0001, Jun Sun 0001
FM3
2017 Proof Tactics for Assertions in Separation Logic
David Sanán, Alwen Tiu, Yang Liu 0003
ITP2
2017 FiB: squeezing loop invariants by interpolation between Forward/Backward predicate transformers
abstract
Loop invariant generation is a fundamental problem in program analysis and verification. In this work, we propose a new approach to automatically constructing inductive loop invariants. The key idea is to aggressively squeeze an inductive invariant based on Craig interpolants between forward and backward reachability analysis. We have evaluated our approach by a set of loop benchmarks, and experimental results show that our approach is promising.
Shangwei Lin 0001, Jun Sun 0001, Yang Liu 0003, David Sanán, Henri Hansen
ASE5
2017 CSimpl: A Rely-Guarantee-Based Framework for Verifying Concurrent Programs
David Sanán, Yongwang Zhao, Fuyuan Zhang, Alwen Tiu, Yang Liu 0003
TACAS (1)1
2016 An Executable Formalisation of the SPARCv8 Instruction Set Architecture: A Case Study for the LEON3 Processor
David Sanán, Alwen Tiu, Yang Liu 0003, Koh Chuen Hoa
FM2
2016 Reasoning About Information Flow Security of Separation Kernels with Channel-Based Communication
Yongwang Zhao, David Sanán, Fuyuan Zhang, Yang Liu 0003
TACAS2
2016 Formal Specification and Analysis of Partitioning Operating Systems by Integrating Ontology and Refinement
abstract
Partitioning operating systems (POSs) have been widely applied in safety-critical domains from aerospace to automotive. In order to improve the safety and the certification process of POSs, the ARINC 653 standard has been developed and complied with by the mainstream POSs. Rigorous formalization of ARINC 653 can reveal hidden errors in this standard and provide a necessary foundation for formal verification of POSs and ARINC 653 applications. For the purpose of reusability and efficiency, a novel methodology by integrating ontology and refinement is proposed to formally specify and analyze POSs in this paper. An ontology of POSs is developed as an intermediate model between informal descriptions of ARINC 653 and the formal specification in Event-B. A semiautomatic translation from the ontology and ARINC 653 into Event-B is implemented, which leads to a complete Event-B specification for ARINC 653 compliant POSs. During the formal analysis, six hidden errors in ARINC 653 have been discovered and fixed in the Event-B specification. We also validate the existence of these errors in two open-source POSs, i.e., XtratuM and POK. By introducing the ontology, the degree of automatic verification of the Event-B specification reaches a higher level.
Yongwang Zhao, David Sanán, Fuyuan Zhang, Yang Liu 0003
IEEE Trans. Ind. Informatics2
2015 Verifying FreeRTOS' Cyclic Doubly Linked List Implementation: From Abstract Specification to Machine Code
abstract
In order to facilitate proof of correctness, micro-kernels are based on simplicity, providing an application only with the minimal set of features it needs in order to to work. However, simplicity alone does not guarantee the absence of bugs and software errors, and the complexity of an OS often makes such problems difficult to find and fix. In this work, we prove the functional correctness of an abstract model for the C implementation of the cyclic linked list in the real-time micro-kernel FreeRTOS, which is used in the FreeRTOS scheduler, its correctness being of critical importance for the real-time properties of FreeRTOS. The formal specification of the functional properties of FreeRTOS also provides a guide for a correct use of the functions that the implementation provides, since it lacks checks on the data. Additionally, we prove the correctness of the machine code resulting from compiling the implementation targeting the ARM architecture. Following a verification approach based on refinement, we first construct the abstract model of the implementation, where we prove both the cyclic linked list invariant and the correctness of the implementation behaviour for any list in the heap using separation logic. Second, we leverage existing machine code verification frameworks to get a HOL model of the FreeRTOS linked list compiled machine code, and we apply forward simulation to prove that such a machine code model refines the abstract model, and therefore satisfies the properties already proven over the specification.
David Sanán, Yang Liu 0003, Yongwang Zhao, Zhenchang Xing, Michael G. Hinchey
ICECCS1
2015 Event-based formalization of safety-critical operating system standards: An experience report on ARINC 653 using Event-B
abstract
Standards play the key role in safety-critical systems. Errors in standards could mislead system developer's understanding and introduce bugs into system implementations. In this paper, we present an Event-B formalization and verification for the ARINC 653 standard, which provides a standardized interface between safety-critical real-time operating systems and application software, as well as a set of functionalities aimed to improve the safety and certification process of such safety-critical systems. The formalization is a complete model of ARINC 653, and provides a necessary foundation for the formal development and verification of ARINC 653 compliant operating systems and applications. Three hidden errors and three cases of incomplete specification were discovered from the verification using the Event-B formal reasoning approach.
Yongwang Zhao, Zhibin Yang 0005, David Sanán, Yang Liu 0003
ISSRE3
2013 State Space Reduction for Sensor Networks Using Two-Level Partial Order Reduction
Manchun Zheng, David Sanán, Jun Sun 0001, Yang Liu 0003, Jin Song Dong 0001, Yu Gu 0001
VMCAI2
2013 Verification of complex dynamic data tree with mu-calculus
María-del-Mar Gallardo, David Sanán
Autom. Softw. Eng.2
2012 A model-extraction approach to verifying concurrent C programs with CADP
María-del-Mar Gallardo, Christophe Joubert, Pedro Merino 0001, David Sanán
Sci. Comput. Program.4
2011 Towards bug-free implementation for wireless sensor networks
abstract
In this demonstration, a systematically domain-specific model checker, NesC@PAT, is presented. The tool takes NesC programs as input, and automatically verifies WSNs against properties specified in the form of deadlock freeness, state reachability or linear temporal logic formulas. We will show that NesC@PAT is able to find errors caused by rarely unexpected scenarios, which are difficult to be detected by general simulating or debugging.
Manchun Zheng, Jun Sun 0001, David Sanán, Yang Liu 0003, Jin Song Dong 0001, Yu Gu 0001
SenSys3
2010 Verification of Dynamic Data Tree with mu-calculus Extended with Separation
abstract
The problem of verifying software systems that use dynamic data structures (such as linked lists, queues, or binary trees) has attracted increasing interest over the last decade. Dynamic structures are barely supported by verification techniques because among other reasons, it is difficult to efficiently manage the pointer-based internal representation. This is a key aspect when the goal is to construct a verification tool based on model checking techniques, for instance. In addition, since new nodes may be dynamically inserted or extracted from the structure, the shape of the dynamic data (and other more specific properties) may vary at runtime, it being difficult to detect errors such as, for instance, the non desirable sharing between two nodes. In this paper, we propose to use mu-calculus to describe and analyze, using model checking techniques, dynamic data such as lists, and non-linear data structures like trees. The expressiveness of mu-calculus makes it possible to naturally describe these structures. In addition, following the ideas of separation logic, the logic has been extended with a new operator able to describe the non-sharing property which is essential when analyzing data structures of this type.
María-del-Mar Gallardo, David Sanán
SEFM2
2009 Model Checking Dynamic Memory Allocation in Operating Systems
María-del-Mar Gallardo, Pedro Merino 0001, David Sanán
J. Autom. Reason.3
2009 Checking the reliability of socket based communication software
Pedro de la Cámara, María-del-Mar Gallardo, Pedro Merino 0001, David Sanán
Int. J. Softw. Tools Technol. Transf.4
2008 Model Checking C Programs with Dynamic Memory Allocation
abstract
Software model checking technology is based on an exhaustiveand efficient simulation of all possible execution paths in concurrent programs. Existing tools based on this method can rapidly detect execution errors, preventing malfunctions in the final system. However dealing with dynamic memory allocation is still an open trend. In this paper, we present a novel method to extend explicit model checking of C programs with dynamic memory management. The method consists in defining a canonical representation of the heap that is based on moving most of the information from the state vector to a global structure. We give a formal semantics of the method in order to show its soundness. Our experimental results show that this method can be efficiently implemented in many well known model checkers, like CADP or SPIN.
María-del-Mar Gallardo, Pedro Merino 0001, David Sanán
COMPSAC3
2007 On-the-fly model checking for C programs with extended CADP in FMICS-jETI
abstract
A current trend in the software engineering community is to integrate different tools in a friendly and powerful development environment for use by final users. This is also the case for tools based on formal methods, which are very valuable for increasing confidence in the reliability of software. This paper contributes to one promising approach to make this integration possible, the project FMICS-jETI. This project aims to obtain an active repository of tools based on formal methods in such a way that users can access and combine all the tools simply by defining a graph with the tools and the files they manage. In particular, the paper explains how two new modules of the well known toolset CADP are added to FMICS-jETI. These new modules, named C.Open and Annotator extend Cadp with functions to manage C programs in this toolset.
María-del-Mar Gallardo, Pedro Merino 0001, Christophe Joubert, David Sanán
ICECCS4
2005 Model checking software with well-defined APIs: the socket case
abstract
The application of model checking technology to real software seems to be a promising and realistic approach to increase its quality. There are some successful examples of tools for this purpose, mainly working with self-contained programs. However, verifying software that uses external functionality provided by the operating system via API s is currently a challenging trend.In this paper, we give a method for using the tool SPIN to verify distributed software systems that use the API Socket and the network protocol stack TCPIP for communications. Our approach consists in building a model of the underlying operating system to be joined with the original C code in order to obtain the input for the model checker. We define and use a formal semantics of the API to conduct the correct construction of models. The whole modelling process is transparent to the C programmer, because it is performed automatically and without special syntactic constraints in the input C code. Regarding verification, we consider optimization techniques suitable for this application domain, and we ensure that the system only reports potential (non-spurious) errors.
Pedro de la Cámara, María-del-Mar Gallardo, Pedro Merino 0001, David Sanán
FMICS4