| I'm kinda torn. It seems there are only three approaches. 1. laissez-faire / manual memory management (c, c++, etc) In this approach, the programmer decides everything. 2. dictatorship / garbage collection (java, go, etc) In this approach, the runtime decides everything. 3. deterministic / lifetime memory management (rust, c with arenas, etc) In this approach, the problem determines everything. |
https://www.absint.com/astree/index.htm
For those who think static analyzers cannot do that, notice the word “sound”. This is a different type of static analyzer than the more common ones that do not catch everything.
Sadly, there is no open source option that works across a broad range of software. NASA’s IKOS is open source for example, but it does not support multithreading and some other things that I do not recall offhand, which makes it unable to catch all memory safety bugs in software using the features that it does not support. For now, people who want to use sound static analyzers need to use closed source tools or restrict themselves to a subset of what C/C++ can do so they can use IKOS:
https://github.com/NASA-SW-VnV/ikos