S# (pronounced "safety sharp") is a formal modeling framework and safety analysis framework for safety-critical systems developed by the Institute for Software & Systems Engineering at the University of Augsburg.
S# Features
To get started with S#, please consult the Wiki. S# and the case studies are available under the MIT License.
The following small and incomplete example shows the model of a pressure sensor using the S#'s modeling language: The sensor checks whether a certain pressure level is reached. The example shows how safety-critical components and their required and provided ports are modeled in S#. The model also includes a fault that prevents the sensor from reporting that the pressure level is reached, possibly resulting in a hazard at the system level. For more details about modeling with S#, please consult the Wiki.
// Represents a model of a pressure sensor.
class PressureSensor : Component
{
// The pressure level that the sensor reports.
private readonly int _pressure;
// A persistent fault that can occur nondeterminisitcally; once it has occurred,
// it cannot disappear.
private readonly Fault _noPressureFault = new PermanentFault();
// Instantiates an instance of a pressure sensor. The maximum allowed pressure is
// passed in as a constructor argument, allowing for easy configuration and
// re-use of component models.
public PressureSensor(int pressure)
{
_pressure = pressure;
}
// Required port. This is the port that the sensor uses to sense the actual
// pressure level in some environment component.
public extern int CheckPhysicalPressure();
// Provided port. Indicates whether the pressure level that the sensor is
// configured to report has been reached.
public virtual bool HasPressureLevelBeenReached()
{
return CheckPhysicalPressure() >= _pressure;
}
// Represents the effect of the fault '_noPressureFault'.
[FaultEffect(Fault = nameof(_noPressureFault)]
class SenseNoPressure : PressureTank
{
// Overwrites the behavior of the sensor's provided port, always returning the
// constant 'false' when the fault is activated.
public override bool HasPressureLevelBeenReached()
{
return false;
}
}
}
To conduct fully automated safety analyses with S#, the following simple code is required. Analysis results are shown for the pressure tank case study; for more details, please see the Wiki.
var result = SafetyAnalysis.AnalyzeHazard(model, hazard);
result.SaveCounterExamples("counter examples");
Console.WriteLine(result);
=======================================================================
======= Deductive Cause Consequence Analysis: Results =======
=======================================================================
Elapsed Time: 00:00:02.1703065
Fault Count: 4
Faults: SuppressIsEmpty, SuppressIsFull, SuppressPumping, SuppressTimeout
Checked Fault Sets: 13 (81% of all fault sets)
Minimal Critical Sets: 1
(1) { SuppressIsFull, SuppressTimeout }