How To Code Like The Top Programmers At NASA — 10 Critical Rules

Flojo

Expert Member
Joined
Sep 24, 2009
Messages
1,928
Reaction score
416
http://techaed.com/how-to-code-like-the-top-programmers-at-nasa-10-critical-rules/

The developers at NASA have one of the most challenging jobs in the programming world. They write code and develop mission-critical applications with safety as their primary concerns.

In such situations, it’s important to follow some serious coding guidelines. These rules cover different aspects of software development like how a software should be written, which language features should be used etc.

Even though it’s difficult to establish a consensus over a good coding standard, NASA’s Jet Propulsion Laboratory (JPL) follows a set of guidelines of code named “The Power of Ten–Rules for Developing Safety Critical Code”.

This guide focuses mainly on code written in C programming languages due to JPL’s long association with the language. But, these guidelines could be easily applied on other programming languages as well.

Laid by JPL lead scientist Gerard J. Holzmann, these strict coding rules focus on security.

NASA’s 10 rules for writing mission-critical code:

1. Restrict all code to very simple control flow constructs – do not use goto statements, setjmp or longjmp constructs, and direct or indirect recursion.

2. All loops must have a fixed upper-bound. It must be trivially possible for a checking tool to prove statically that a preset upper-bound on the number of iterations of a loop cannot be exceeded. If the loop-bound cannot be proven statically, the rule is considered violated.

3. Do not use dynamic memory allocation after initialization.

4. No function should be longer than what can be printed on a single sheet of paper in a standard reference format with one line per statement and one line per declaration. Typically, this means no more than about 60 lines of code per function.

5. The assertion density of the code should average to a minimum of two assertions per function. Assertions are used to check for anomalous conditions that should never happen in real-life executions. Assertions must always be side-effect free and should be defined as Boolean tests. When an assertion fails, an explicit recovery action must be taken, e.g., by returning an error condition to the caller of the function that executes the failing assertion. Any assertion for which a static checking tool can prove that it can never fail or never hold violates this rule (I.e., it is not possible to satisfy the rule by adding unhelpful “assert(true)” statements).

6. Data objects must be declared at the smallest possible level of scope.

7. The return value of non-void functions must be checked by each calling function, and the validity of parameters must be checked inside each function.

8. The use of the preprocessor must be limited to the inclusion of header files and simple macro definitions. Token pasting, variable argument lists (ellipses), and recursive macro calls are not allowed. All macros must expand into complete syntactic units. The use of conditional compilation directives is often also dubious, but cannot always be avoided. This means that there should rarely be justification for more than one or two conditional compilation directives even in large software development efforts, beyond the standard boilerplate that avoids multiple inclusion of the same header file. Each such use should be flagged by a tool-based checker and justified in the code.

9. The use of pointers should be restricted. Specifically, no more than one level of dereferencing is allowed. Pointer dereference operations may not be hidden in macro definitions or inside typedef declarations. Function pointers are not permitted.

10. All code must be compiled, from the first day of development, with all compiler warnings enabled at the compiler’s most pedantic setting. All code must compile with these setting without any warnings. All code must be checked daily with at least one, but preferably more than one, state-of-the-art static source code analyzer and should pass the analyses with zero warnings.

About these rules, here’s what NASA has to say:

The rules act like the seatbelt in your car: initially they are perhaps a little uncomfortable, but after a while their use becomes second-nature and not using them becomes unimaginable.
 
No function pointers in C?
Why don't they cut off my balls while they are at it.
 
No function pointers in C?
Why don't they cut off my balls while they are at it.

As useful as they are, it means that someone reading the caller does not know for sure what code is about to execute. A switch or if sequence is clunkier and less efficient, but it is also self documenting.

One of the reasons that C++ is usually not used or at least artificially restricted by policy, is that C++ can have reader oblivious behavior just about anywhere.
 
Pointless article. NASA spends a ridiculous amount on testing and verification, and there's a reason why the hardware they use for everything is always N generations behind the newest toys coming out.

Your average business developer sadly has to do 10x more code in 10x less time.
 
Interesting this. I have a friend that writes software for space-borne components. Apparently they have to use 'other' techniques for programming because out in space a stray gamma ray can swop a bit in memory. You can think of the consequences of this....
 
Interesting this. I have a friend that writes software for space-borne components. Apparently they have to use 'other' techniques for programming because out in space a stray gamma ray can swop a bit in memory. You can think of the consequences of this....

Thats interesting... is there a list or article somewhere? I would love to know how they counter things like that...
 
Interesting this. I have a friend that writes software for space-borne components. Apparently they have to use 'other' techniques for programming because out in space a stray gamma ray can swop a bit in memory. You can think of the consequences of this....

It happens on Earth too, its just a bit rarer than in space.

https://en.wikipedia.org/wiki/Soft_error
"One experiment measured the soft error rate at the sea level to be 5,950 failures in time (FIT = failures per billion hours) per DRAM chip. When the same test setup was moved to an underground vault, shielded by over 50 feet (15 m) of rock that effectively eliminated all cosmic rays, zero soft errors were recorded.[9] In this test, all other causes of soft errors are too small to be measured, compared to the error rate caused by cosmic rays."


Its also a problem for data centers, simply because they contain so many chips that errors become a constant occurrence.

Very interesting field.
 
Thats interesting... is there a list or article somewhere? I would love to know how they counter things like that...

You also use space hardend hardware, with fail-over on everything, dual verification, data checking, ect ... basically the over-kill method of building something.
 
Pointless article. NASA spends a ridiculous amount on testing and verification, and there's a reason why the hardware they use for everything is always N generations behind the newest toys coming out.

Your average business developer sadly has to do 10x more code in 10x less time.

Half of the things listed you should be doing anyway
 
i stopped reading after "do not use goto statements"

This isn't 1987 anymore
 
For reference:

[video=youtube;7JwNmdV2QPs]https://www.youtube.com/watch?v=7JwNmdV2QPs[/video]
 
Top
Sign up to the MyBroadband newsletter
X