[cfe-dev] [analyzer] Applying fixes automatically in CSA as it done in Clang Tidy

Artem Dergachev via cfe-dev cfe-dev at lists.llvm.org
Mon Apr 15 12:58:14 PDT 2019


Hmm, at a glance this doesn't sound like a path-sensitive check. In 
order to decide whether you can replace the container with a different 
container you have to understand how the container is used on *all* 
execution paths, not just one path. For that purpose the technology 
behind the Static Analyzer wouldn't be very helpful.

On 4/15/19 11:01 AM, Alexander Zaitsev wrote:
> At first I use path-insensitive callback - check::ASTCodeBody. What my
> check will do - find possibly inefficient container usages and suggest
> possibly better container for different situations. Set of supported
> cases is limited (e.g. I limit this check only by function scope - a
> container has to be declared in function scope, without any outer
> pointers/references, etc.).
>
> So for my quite small set I can provide FixIt functionality. But I agree
> that support FixIt for changing containers can be very complicated if we
> are talking about general C++ without limitations.
>
> 15.04.2019 18:37, Artem Dergachev пишет:
>> I'm still curious though - how can a path-sensitive check suggest
>> anything without a high risk of suggesting a breaking or incorrect
>> change? There are just too many ways of manipulating execution paths
>> and events on these paths and it's very hard to figure out which
>> specific modification would be the right one.
>>
>> Eg., suppose you've found a division by zero bug:
>>
>>    01 int foo(int x) {
>>    02   int y = 0;        // note: `y` is initialized to 0
>>    03   return x / y;   // warning: division by zero!
>>    04 }
>>
>> What would be the fixit that you'd suggest:
>>
>>    (a) initialize `y` with 1 instead,
>>    (b) insert `assert(y != 0 && "Don't divide by zero!")` before the
>> return statement*,
>>    (c) return `y / x` instead?
>>
>> I guess Kristoff's uninitialized field after construction checker is
>> actually a good candidate for fixits: in many cases you can avoid the
>> warning by initializing the field with {} (as long as it's your direct
>> field and it's default-constructible). But even then, the bug may be
>> worse than that, eg. it might have been in fact caused by invalid
>> control flow somewhere in the constructor. Or the default constructor
>> may be the wrong constructor to use even if available. I actually
>> remember how in my early days i zero-initialized a field in my
>> constructor and got 20 test failures simply because the garbage value
>> from the stack was working much better :/ It was worth it though. So,
>> yeah, i guess it's a good example of a path-sensitive check that could
>> occasionally take advantage of fixits. I'd love to learn about other
>> such checks or understand what do they have in common.
>>
>> _____
>> * Bonus points for providing a similar fixit hint for:
>>    02   int y = -1;
>>    03   return x / (++y)".
>>
>>
>> On 4/15/19 7:55 AM, Kristóf Umann via cfe-dev wrote:
>>> Hi!
>>>
>>> As far as I know, the analyzer currently doesn't support FixIts in
>>> any of the output types, unfortunately. I guess it wouldn't be too
>>> hard to add it to BugReport, and let diagnostic consumers implement
>>> it on their own.
>>>
>>> Cheers,
>>> Kristóf
>>>
>>> On Sun, 14 Apr 2019 at 16:40, Alexander Zaitsev via cfe-dev
>>> <cfe-dev at lists.llvm.org <mailto:cfe-dev at lists.llvm.org>> wrote:
>>>
>>>      Hello.
>>>
>>>      In Clang Tidy there is an option to apply fixes automatically if a
>>>      checker can suggest something. But I can't find similar
>>>      functionality in
>>>      Clang Static Analyzer (CSA).
>>>
>>>      My check is too complex to be part of Clang Tidy but I can
>>> provide to
>>>      user an option to fix some places automatically. Is there any
>>>      option to
>>>      do it with CSA?
>>>
>>>      Thank you.
>>>
>>>      --     Best regards,
>>>      Alexander Zaitsev
>>>
>>>
>>>      _______________________________________________
>>>      cfe-dev mailing list
>>>      cfe-dev at lists.llvm.org <mailto:cfe-dev at lists.llvm.org>
>>>      https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev
>>>
>>>
>>> _______________________________________________
>>> cfe-dev mailing list
>>> cfe-dev at lists.llvm.org
>>> https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev



More information about the cfe-dev mailing list