[cfe-dev] Non Deterministic floats in clang static analyzer.

George Karpenkov via cfe-dev cfe-dev at lists.llvm.org
Mon Oct 2 15:21:03 PDT 2017


(re-adding cfe-dev)

Hi Julian,

Artem’s reply above in this thread indicates that currently float modeling is not performed:

> Finally, the analyzer isn't conducting symbolic floating-point arithmetic at all yet, only integers. A step in the direction of improving it can be found in https://reviews.llvm.org/D28954 <https://reviews.llvm.org/D28954> .

You might have more luck using Z3-mode and the mentioned patch.

George

> On Sep 25, 2017, at 8:50 AM, Julian Löffler <loefflju at informatik.uni-freiburg.de> wrote:
> 
> Hey there,
> 
> What is strange to me, that Clang/scanbuild does not recognize the following:
> 
> Program:
> 
> #include <math.h>
> 
> extern void clang_analyzer_warnIfReached();
> 
> int main(){
>   float x = NAN;
>   // NAN == NAN --> False.
>   if(x == x){
>      clang_analyzer_warnIfReached();
>   }
> }
> 
> The clang_analyzer_warnIfReached() should not be reachable, but is reachable.
> 
> 
> On 19/09/2017 19:03, George Karpenkov wrote:
>> Hi Julian,
>> 
>>> On Sep 19, 2017, at 3:43 AM, Julian Löffler <loefflju at informatik.uni-freiburg.de> wrote:
>>> 
>>> Hey George,
>>> 
>>> Thanks a lot for the additional information.
>>> 
>>> Using prototypes works as expected I think.
>>> 
>>> However, do you think clang is a good tool to analyze reachability of certain program-points?
>>> 
>>> Currently we model requirements of a math-lib in the form of small programs for each function, where we analyze if we can reach error-states. (i.e. states where the requirement can be injured). The question is if we should rather use Clang  on the source code.
>> Clang static analyzer is neither sound, nor complete, so you will not be able to verify
>> that a certain program point is definitely not reachable.
>> There are many sources of imprecision: functions are inlined only if they are smaller than a certain size,
>> program is analyzed one translation unit at a time, and many others.
>> 
>> However, unlike more academic tools clang static analyzer
>> gives you a push-button technology: you can just run it on an *arbitrary* codebase, and in a very timely manner
>> get a list of found bugs.
>> As far as I am aware that would be very difficult to achieve with e.g. Ultimate Atomizer and similar tools.
>> 
>>> Usually we do that using trace abstraction and abstract interpretation, anyway I did not find a hint what clang static analyzer is doing exactly.
>>> So if you have a clue which analysis-methods Clang static analyzer uses, I'd be glad to hear it^^
>> I believe it would be closest to symbolic execution.
>> 
>> George
>> 
>>> 
>>> Thanks a lot and kind regards,
>>> 
>>> Julian
>>> 
>>> 
>>> On 19.09.2017 03:02, George Karpenkov wrote:
>>>> Hi Julian,
>>>> 
>>>> Artem has mentioned a few good points, to that I would like to add that:
>>>> 
>>>> a) Using uninitialized values as non-det inputs from the user like CBMC
>>>> does is usually not a good thing to do, as uninitialized values are not simply
>>>> non-deterministic, and can cause undefined behavior.
>>>> 
>>>> b) In order to get Clang static analyzer to model non-deterministic input from user
>>>> it is enough to define a function prototype without implementation which would return
>>>> desired type.
>>>> 
>>>> Regards,
>>>> George
>>>> 
>>>>> On Sep 16, 2017, at 7:07 AM, Julian Löffler via cfe-dev <cfe-dev at lists.llvm.org> wrote:
>>>>> 
>>>>> Greetings,
>>>>> 
>>>>> I wonder how one can obtain that Clang Static Analyzer recognizes non-deterministic-floats.
>>>>> 
>>>>> Usually you can simulate them in c as follows:
>>>>> 
>>>>> float nondet_float(){
>>>>>     float x;
>>>>>     return x;
>>>>> }
>>>>> 
>>>>> float myFloat = nondet_float();
>>>>> 
>>>>> Such that tools like CBMC will handle such variables as non-det floats, which are assumed to be every possible value.
>>>>> 
>>>>> Is that behavior somehow possible in Clang Static Analyzer?
>>>>> Or is it generally impossible for Static code analyzers to do such things?
>>>>> 
>>>>> Regards,
>>>>> Julian
>>>>> _______________________________________________
>>>>> cfe-dev mailing list
>>>>> cfe-dev at lists.llvm.org
>>>>> http://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/20171002/de9beb4f/attachment.html>


More information about the cfe-dev mailing list