To paint these tools with an overfly broad brush, they linter-like in that they perform shallow intra-procedural analysis to identify common bug patterns (e.g.,
if (x != null) {
y = x.f
}
z = x.f // possible NPE; x was previously checked for null
or
foo(String s) {
if ("x" == s) // oops, should use .equals() for Java String comparison.
}).
By contrast, Infer performs deeper inter-procedural reasoning that can track the flow of values across long chains of procedure calls to identify subtle bugs that are hard to see with the naked eye. Infer doesn't support as many bug patterns as these existing tools do yet, but it can find some deep bugs that these tools will miss.