[cfe-dev] [StaticAnalyzer] C++ related checkers
Adam Romanek
romanek.adam at gmail.com
Fri Mar 20 14:34:13 PDT 2015
Hi Gábor!
Thanks for the information. The work you've done might in fact help me
to push the C++ related checkers further. I'd like to investigate it a bit.
Is there any summary of what has been done and what is still missing?
Are there any code examples?
BTW, how would I know which parts of C++ standard library might need to
be synthesized through BodyFarm?
I'm just trying to understand the amount of work required to use this
approach for a basic checker I mentioned at the beginning. Any further
hints would be useful.
Thanks!
Adam Romanek
On 19.03.2015 09:39, Gábor Horváth wrote:
> Hi Jared!
>
> You might be interested in this GSoC project from last year:
> http://www.google-melange.com/gsoc/project/details/google/gsoc2014/xazax/5717271485874176
>
> It makes it possible to wrote C++ code for the bodyfarm instead of
> assembling the AST manually. It works for simple cases and available in
> the trunk already. Unfortunately there is a lot of work left to do which
> I plan to solve, but I lack the time for that at the moment.
>
> Cheers,
> Gábor
>
>
>
> On 19 March 2015 at 06:00, Jared Grubb <jared.grubb at gmail.com
> <mailto:jared.grubb at gmail.com>> wrote:
>
>
>> On Mar 16, 2015, at 15:18, Adam Romanek <romanek.adam at gmail.com
>> <mailto:romanek.adam at gmail.com>> wrote:
>>
>> Hi!
>>
>> I'm new to this list and to Clang development. Nevertheless I've
>> been interested in Clang Static Analyzer for a while. I've been
>> using it on a large code base with a lot of success. So let me
>> start by saying: thanks for this amazing piece of code!
>>
>> But... Some time ago I realized there are hardly any strictly C++
>> related checkers in CSA. I was wondering if there's any movement
>> in this area. I was thinking about some checkers for
>> use-after-free for STL containers like std::string, for example:
>>
>> const char* x = NULL;
>> {
>> std::string foo("foo");
>> x = foo.c_str();
>> }
>> printf("%s", x); // boom
>>
>> There are also some other common types of errors in C++ like use
>> of iterator after it has been invalidated. FYI this one in
>> particular is detected by cppcheck.
>>
>> So I decided to dig a bit to find out whether it is hard to write
>> a checker for use-after-free like in the example with std::string.
>> It looks like MallocChecker deals with a similar class of issues.
>>
>> I was wondering whether it would be the right approach to try to
>> "bend" MallocChecker to my needs (but it's already 2.5k lines of
>> code) or to start something new on my own.
>>
>> Honestly it took me some time even to detect a simple std::string
>> constructor call so the road looks rather long and bumpy...
>>
>> Any hints, pointers? Any related work?
>
> I have looked at this in the past, but it was about 18 months ago.
> So take my thoughts with that grain of salt. Also note that I’m not
> a regular or major contributor here. I’ve done very minor patches,
> but always hoping to do more :) So here’s my thoughts, and take them
> as you will.
>
> The MallocChecker is fine, but the problem is that libc++ is really
> hard to analyze. It is an efficient implementation, but that
> cleverness really stresses the analyzer. For example, std::string’s
> memory layout is a union of three different types (“long”, “short”,
> “raw” buffers). I think the SA gives up on unions immediately.
>
> The best way around this is to simplify what the analyzer sees. Here
> are two approaches.
>
> One idea is to use “BodyFarm”, whose role is to synthesize alternate
> implementations for functions that should be simple to model. If you
> look here, you’ll see a bit about that:
> http://clang-analyzer.llvm.org/open_projects.html
>
> Another idea is to actually implement a “simple libc++” and
> interpose that for analysis. For example, std::basic_string class
> would just be a pointer and two size_t’s, along with simple
> implementations of all the member functions and simple iterators. In
> the future, you could add other analysis hooks (for example, check
> for iterator invalidation).
>
> I did play around a bit on this for Body Farm, and I can forward you
> the code I did. I got a couple constructors implemented, as well as
> “empty()” and “size()” for some very basic cases (string literal
> initialized strings). However, it got a bit tedious and I’m not sure
> it would scale. I think the second approach is far more interesting
> and maintainable. But a “simple libc++” could be hard for its own
> reasons.
>
> Anyway I’m happy to give you my sketches. I’ll email them off-list.
> Take them or ignore them however you like.
>
>
>>
>> Thanks in advance.
>>
>> Best regards,
>> Adam Romanek
>> _______________________________________________
>> cfe-dev mailing list
>> cfe-dev at cs.uiuc.edu <mailto:cfe-dev at cs.uiuc.edu>
>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev
>
>
> _______________________________________________
> cfe-dev mailing list
> cfe-dev at cs.uiuc.edu <mailto:cfe-dev at cs.uiuc.edu>
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev
>
>
More information about the cfe-dev
mailing list