[cfe-dev] Query regarding Clang SA analyzer-config options

Artem Dergachev via cfe-dev cfe-dev at lists.llvm.org
Fri Mar 8 17:06:18 PST 2019


Yup, max-times-inline-large controls how many times do functions that 
have (min-cfg-size-treat-functions-as-large) or more Control Flow Graph 
blocks are "inlined" during analysis when called from other functions. 
This doesn't apply to functions from which the analysis *starts* (you 
can list them via -analyzer-display-progress).

But note that if a function was inlined, then it usually *won't* be 
re-analyzed as a top-level function. This heuristic is based on the 
assumption that the reliability of warnings found by analyzing the 
function as a top-level function is usually much lower than that of 
warnings found within an inlined function, because when inlining, you 
have more context on how the function is actually used in the program.

Yup, the complexity value that max-symbol-complexity limits is roughly 
as long as the "length" of the most complicated symbolic expression. 
Every atomic symbol (SymbolData) has complexity of 1, a constant has 
complexity 0, and every operation also adds 1 to the complexity of its 
operands, unless both operands are non-constants (but this last part 
seems to be an accidental omission). Anyway, the point is, when the 
symbolic expression becomes too long, the Static Analyzer prefers to 
collapse it to UnknownVal in order to avoid performance problems. This 
is usually not terrible because when a piece of code produces terribly 
complicated symbolic expressions, the user is more likely to forgive us 
for not understanding it perfectly :)

Generally, these -analyzer-config tweaks are simply a way to avoid magic 
constants in the code. They help when trying to find the best value for 
the magic constant, but they aren't recommended for everyday use. But if 
it suddenly turns out that some non-standard -analyzer-config values 
make the Static Analyzer perform significantly better on your code, 
please let us know :)



On 3/7/19 7:47 PM, Sulekha Kulkarni via cfe-dev wrote:
> Hi,
>
> I am a fairly new entrant to Clang SA. I wanted to confirm the 
> behavior of the following two analyzer-config options:
>
> max-times-inline-large : When CSA is analyzing a compilation unit, at 
> most max-times-inline-large "large" functions will be inlined during 
> the analysis of the entire CU. In particular, it is not applied 
> per-top-level function analyzed. Is this correct?
> A test I did: Suppose a CU t.c contains a function foo() that has a 
> null dereference, and several other functions. The command "/clang 
> -cc1 -analyze -analyzer-checker=core.NullDereference t.c 
> -analyze-function=foo/" detects the null deref bug while the command 
> "/clang -cc1 -analyze -analyzer-checker=core.NullDereference t.c/" 
> does not. When I increased the max-times-inline-large value, running 
> CSA on the entire t.c did detect the null deref bug.
>
> max-symbol-complexity=35 : What is the number 35 counting? Is it 
> (approximately) the number of operators in a symbolic expression?
>
> I'll really appreciate any clarification on these points.
>
> Thanks in advance,
> Sulekha
>
>
> _______________________________________________
> cfe-dev mailing list
> cfe-dev at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20190308/64e22583/attachment.html>


More information about the cfe-dev mailing list