Astrée Static Analyzer for C and C++
absint.com
absint.com
This is also the case with CompCert, which is still developed mostly by French researchers (with an open-source, non-commercial license), and packaged in commercial form by AbsInt.
> The company name is an acronym for “abstract interpretation”, a sophisticated approach to static program analysis formalized by Patrick and Radhia Cousot at the Laboratoire d’Informatique, Grenoble in 1977. It is by implementing this approach that we were able to develop our unique, highly successful products.
I am surprised with the lack of startups in the area. It's just a bit of abstract algebra. With Datalog, the barrier of entry is pretty low: https://arxiv.org/abs/2012.10086
I have personally implemented a few of the features provided by Astrée, e.g. array bounds check, using the ideas described in: https://link.springer.com/book/10.1007/978-3-662-03811-6
Fire simulation modelling.
Computational GIS tooling (Hexagon et al)
Computational Algebra (eg Cayley|Magma)
Fireball monitoring, Square Kilometre Array processing, . . .
I'm struggling to recall anything I've worked on that didn't emphasis code correctness.
But there are so few options available, at such a high cost, that nobody uses them.
Abstract interpretation / static analysis can detect lots of defects automatically.
Usually, the time required to properly setup and understand and refine the analysis will take most of the trial period.
These tools are better thought of in the long term, they may require some changes to coding style, and also some knowledge of the code itself.
While they are good for building defenses, they are not so effective for helping attackers. But in the end, yes, they _could_ be used for that.
And regulated fields are a big market, not just the huge companies that work in this field (you can see a short list on the linked page), but also suppliers of these companies.
[1] https://blogs.grammatech.com/how-sound-static-analysis-compl...
You also need to know your competition, and the story is even worse there. As I've watched security engineering advance over the years -- and I know you aren't specifically talking about security, but go with me here -- one of the only methods that has actually gone from "nascent infosec curiosity" into full-blown large scale usage by major and minor players has been fuzzing, which most people know as just "throw random shit at it until it breaks". That's because it's often easy to integrate, has few visible thorns in practice, has a surprisingly high signal-to-noise ratio, and can be performed even with duct tape and glue on an existing codebase. It can be done in any language. It often delivers positive results immediately in the short term and continuously over time. That's actually what your userbase considers "easy to implement", not "learn datalog and abstract algebra to understand and integrate domain specific static analyzers into your build system." Is it powerful? Yes, and I like solutions like CodeQL or MIRAI (for Rust). Do they have long term benefits? I think so. Is it easy or at least "not that hard"? I'm not immediately convinced.
Roughest bit is probably having to write the portable, cross-platform GUI imo.
(There is an experimental C++ front-end, but it is not ready for industrial size C++ that makes extensive use of the standard library)
I wonder if it's not too limiting.
The tool will either prove that all the properties hold (user is happy), or prove that some property does not hold at some point in the program (user knows what to fix usually), or bail-out with no proof at all for a property at some point (user has to modify the program to make it more understandable by the tool).
The accepted language is still Turing-complete (C or C++) and the tool is not solving the halting problem in the general case since it can bail-out with no proof.
Now I'm not saying that they solved the halting problem, as that is not possible. Rather that there is missing information on the linked page. Either:
1. The tool requires the an external machine-checkable proof that no division by zero happens.
2. Certain language constructs are disallowed. They probably just ban goto (this is fine), possibly also recursion, multiple return statements, loops without a hard bound of iteration, etc... .
Or both. Where can I find information about this?
Neither, the tool has false positives, i.e. it sometimes reports divions as a potential divion by zero even though it isn't one.
I will guess that when analyzing avionics code with no memory allocation it is perfect, and when analyzing other code it is merely great. I wonder what the recruiting pipeline from INRIA into AbsInt is like.