Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 42 additions & 0 deletions arewesafetycriticalyet.org/docs/main/intro.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,45 @@ sidebar_position: 1
---

# Are We Safety Critical Yet?

## What is Safety-Critical?

Software is not inherently "safe" or "unsafe" in isolation - it becomes safety-critical when it controls actions in the physical world that could potentially cause harm to people or the environment. Whether software is safety-critical is thus determined by its operational context: specifically, whether it contributes to system hazards as established through risk analysis and system design.

**Note:** Functional safety addresses risks from unintended malfunctions. It is distinct from cybersecurity, which addresses intentional malicious attacks.

## Evaluating safety-critical readiness of “Rust”

In practice, software is considered safe by demonstrating compliance with the relevant safety standard for the target industry and application. It is worth noting that compliance is a proxy for safety: compliant systems can still be unsafe, and non-compliant systems can be safe. The standard provides a structured framework, not a guarantee.

For this analysis, safety-critical readiness is measured by how well Rust's language design, toolchain, and ecosystem enable developers to meet the requirements of the relevant safety standards when developing safety-critical applications.

## Standards-Based Evaluations

The following evaluation examines how well specific safety-standard requirements can be satisfied when using Rust, based on the following scale:

🟢 Well supported - requirement can be met with no additional effort

🟡 Achievable - requirement can be met with moderate additional effort

🔴 Gap - requirement needs substantial additional effort or qualification activity

⚪ Not impacted - requirement is not directly affected by the choice of programming language

**Note:** Safety standards generally leave room for interpretation. In standards such as ISO 26262, final compliance claims are subject to the assessor's judgment.

### ISO 26262

🟡 Achievable with moderate additional effort

Rust's core language features - memory safety, strong typing, and data race prevention - provide excellent basis for ISO 26262 compliance. However, critical gaps exist in qualified tools, control/data flow analysis, and qualified RTOS/HAL/PAC support. These require individual qualification efforts and are barriers for production use.

[Detailed Rust vs. ISO 26262 gap analysis](iso26262.md)

### IEC 61508

Analysis in preparation. Contributions welcome via [GitHub](https://github.com/rustfoundation/safety-critical-rust-consortium).

### DO-178C

Analysis in preparation. Contributions welcome via [GitHub](https://github.com/rustfoundation/safety-critical-rust-consortium).
262 changes: 262 additions & 0 deletions arewesafetycriticalyet.org/docs/main/iso26262.md

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion arewesafetycriticalyet.org/docusaurus.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ const baseUrl = process.env.BASE_URL || '/';

const config: Config = {
title: 'Are We Safety Critical Yet?',
tagline: 'It depends 🤔, we have a few certified compilers, a few certification products in-progress and a few use cases.',
tagline: 'Tracking Rust\'s readiness for safety-critical development across industry standards.',
favicon: 'img/favicon.ico',

// Set the production url of your site here
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,9 @@ export default function HomepageFeatures(): ReactNode {
return (
<section className={styles.features}>
<div className="container">
<Heading as="h2" className="text--center margin-bottom--lg">
Consortium Working Groups
</Heading>
<div className="row">
{FeatureList.map((props, idx) => (
<Feature key={idx} {...props} />
Expand Down
128 changes: 128 additions & 0 deletions arewesafetycriticalyet.org/src/components/StandardsOverview/index.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,128 @@
import type {ReactNode} from 'react';
import clsx from 'clsx';
import Link from '@docusaurus/Link';
import Heading from '@theme/Heading';
import styles from './styles.module.css';

type Rating = 'green' | 'yellow' | 'red' | 'grey';

interface Standard {
name: string;
rating: Rating;
verdict: string;
description: string;
detailsUrl: string | null;
}

const standards: Standard[] = [
{
name: 'ISO 26262',
rating: 'yellow',
verdict: 'Achievable with moderate additional effort',
description:
"Rust's core language features - memory safety, strong typing, and data race prevention - provide an excellent basis for ISO 26262 compliance. Critical gaps exist in qualified tools, control/data flow analysis, and qualified RTOS/HAL/PAC support.",
detailsUrl: '/docs/iso26262',
},
{
name: 'IEC 61508',
rating: 'grey',
verdict: 'Analysis in preparation',
description: 'Contributions welcome.',
detailsUrl: null,
},
{
name: 'DO-178C',
rating: 'grey',
verdict: 'Analysis in preparation',
description: 'Contributions welcome.',
detailsUrl: null,
},
];

const ratingDotClass: Record<Rating, string> = {
green: styles.dotGreen,
yellow: styles.dotYellow,
red: styles.dotRed,
grey: styles.dotGrey,
};

const ratingCardClass: Record<Rating, string> = {
green: styles.standardCardGreen,
yellow: styles.standardCardYellow,
red: styles.standardCardRed,
grey: '',
};

function RatingDot({rating}: {rating: Rating}) {
return <span className={clsx(styles.dot, ratingDotClass[rating])} />;
}

function StandardCard({standard}: {standard: Standard}) {
return (
<div
className={clsx(
styles.standardCard,
ratingCardClass[standard.rating],
!standard.detailsUrl && styles.standardCardPending,
)}>
<div className={styles.cardHeader}>
<RatingDot rating={standard.rating} />
<Heading as="h3">{standard.name}</Heading>
</div>
<p className={styles.verdict}>{standard.verdict}</p>
<p className={styles.description}>{standard.description}</p>
{standard.detailsUrl ? (
<Link to={standard.detailsUrl} className={styles.detailsLink}>
View detailed analysis &rarr;
</Link>
) : (
<Link
to="https://github.com/rustfoundation/safety-critical-rust-consortium"
className={styles.detailsLink}>
Contribute on GitHub &rarr;
</Link>
)}
</div>
);
}

export default function StandardsOverview(): ReactNode {
return (
<section className={styles.overview}>
<div className="container">
<Heading as="h2" className="text--center margin-bottom--sm">
Standards-Based Evaluations
</Heading>
<p className={clsx('text--center', styles.introText)}>
Safety-critical readiness is measured by how well Rust's language design, toolchain, and
ecosystem enable developers to meet the requirements of the relevant safety standards.
For more context, see the{' '}
<Link to="/docs/intro">full overview</Link>.
</p>

<div className={styles.legend}>
<span className={styles.legendItem}>
<RatingDot rating="green" /> Well supported
</span>
<span className={styles.legendItem}>
<RatingDot rating="yellow" /> Achievable with effort
</span>
<span className={styles.legendItem}>
<RatingDot rating="red" /> Gap
</span>
<span className={styles.legendItem}>
<RatingDot rating="grey" /> Not yet rated
</span>
</div>

<div className="row">
{standards.map(standard => (
<div className="col col--4 margin-bottom--lg" key={standard.name}>
<StandardCard standard={standard} />
</div>
))}
</div>
</div>
</section>
);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
.overview {
padding: 2rem 0;
}

.introText {
max-width: 700px;
margin: 0 auto 1rem;
}

.legend {
display: flex;
flex-wrap: wrap;
gap: 1.5rem;
justify-content: center;
margin-bottom: 2rem;
color: var(--ifm-color-emphasis-700);
}

.legendItem {
display: flex;
align-items: center;
gap: 0.4rem;
}

.dot {
width: 12px;
height: 12px;
border-radius: 50%;
display: inline-block;
flex-shrink: 0;
}

.dotGreen {
background-color: var(--rating-green);
}

.dotYellow {
background-color: var(--rating-yellow);
}

.dotRed {
background-color: var(--rating-red);
}

.dotGrey {
background-color: var(--rating-grey);
}

.standardCard {
border: 1px solid var(--ifm-color-emphasis-200);
border-left: 4px solid var(--rating-grey);
border-radius: 6px;
padding: 1.25rem;
height: 100%;
display: flex;
flex-direction: column;
}

.standardCardGreen {
border-left-color: var(--rating-green);
}

.standardCardYellow {
border-left-color: var(--rating-yellow);
}

.standardCardRed {
border-left-color: var(--rating-red);
}

.standardCardPending {
opacity: 0.6;
border-left-style: dashed;
}

.cardHeader {
display: flex;
align-items: center;
gap: 0.5rem;
margin-bottom: 0.5rem;
}

.cardHeader h3 {
margin: 0;
}

.verdict {
font-weight: 600;
margin-bottom: 0.5rem;
}

.description {
color: var(--ifm-color-emphasis-700);
flex: 1;
}

.detailsLink {
margin-top: 0.75rem;
}
6 changes: 6 additions & 0 deletions arewesafetycriticalyet.org/src/css/custom.css
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,12 @@
--ifm-color-primary-lightest: #273168;
--ifm-code-font-size: 95%;
--docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.1);

/* Match the emoji colors: 🟢 🟡 🔴 ⚪ */
--rating-green: #4caf50;
--rating-yellow: #fdd835;
--rating-red: #f44336;
--rating-grey: #bdbdbd;
}

/* For readability concerns, you should choose a lighter palette in dark mode. */
Expand Down
6 changes: 6 additions & 0 deletions arewesafetycriticalyet.org/src/pages/index.module.css
Original file line number Diff line number Diff line change
Expand Up @@ -21,3 +21,9 @@
align-items: center;
justify-content: center;
}

.divider {
border-top: 1px solid var(--ifm-color-emphasis-200);
max-width: 800px;
margin: 0 auto;
}
10 changes: 6 additions & 4 deletions arewesafetycriticalyet.org/src/pages/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import Link from '@docusaurus/Link';
import useDocusaurusContext from '@docusaurus/useDocusaurusContext';
import Layout from '@theme/Layout';
import HomepageFeatures from '@site/src/components/HomepageFeatures';
import StandardsOverview from '@site/src/components/StandardsOverview';
import Heading from '@theme/Heading';

import styles from './index.module.css';
Expand All @@ -21,7 +22,7 @@ function HomepageHeader() {
<Link
className="button button--secondary button--lg"
to="/docs/intro">
Find out!
Read the overview
</Link>
</div>
</div>
Expand All @@ -30,13 +31,14 @@ function HomepageHeader() {
}

export default function Home(): ReactNode {
const {siteConfig} = useDocusaurusContext();
return (
<Layout
title={`Hello from ${siteConfig.title}`}
description="Description will go into a meta tag in <head />">
title="Are We Safety Critical Yet?"
description="Tracking Rust's readiness for safety-critical software development across ISO 26262, IEC 61508, and DO-178C.">
<HomepageHeader />
<main>
<StandardsOverview />
<div className={styles.divider} />
<HomepageFeatures />
</main>
</Layout>
Expand Down
Loading