On Jun 19, 2013, at 9:05 AM, Jordan Rose <[email protected]> wrote:

> Hi, Adam. Here're some more comments:
> 
> +  typedef std::pair<const ExplodedNode*, const MemRegion*> AllocSite;
> +
> +  /// \brief This utility function finds the location of the allocation of
> +  /// Sym on the path leading to the exploded node N.
> +  template <typename T>
> +  AllocSite getAllocationSite(const ExplodedNode *N, SymbolRef Sym) const  {
> 
> I know this isn't your code, but that return value is pretty idiosyncratic. I 
> was going to ask you to add a doc comment, but maybe you could just return a 
> little struct instead? Then the members are named nicely.
> 
> (Anna: this is why it has to go in a header—it's templated on the GDM key.)
> 
> 
> +      N = N->pred_empty() ? NULL : *(N->pred_begin());
> 
> Again, not your fault, but there's a short accessor for this now, 
> N->getFirstPred(), that includes the empty check.
> 
> This also scares me because it's not robust against paths that merge before 
> the error. Maybe some day we'll go back and rewrite this as a visitor, but 
> then we'd have to let visitors update the BugReport's description.
> 
> 
> +//===----------------------------------------------------------------------===//
> +/// Defines a checker for the proper use of stream APIs.
> +//===----------------------------------------------------------------------===//
> 
> This should be marked as \file.
> 
> 
> +typedef SmallVector<SymbolRef, 2> SymbolVector;
> 
> We don't really need this. You only use it twice (three times including the 
> Decl), and conventionally we use ArrayRefs or references to SmallVectorImpls 
> to pass around arrays. You definitely shouldn't be passing a SmallVector by 
> value.
> 
> 
> +class StopTrackingCallback : public SymbolVisitor {
> 
> *sigh* This should be a generic helper at some point. We've tossed around the 
> idea of having a special kind of ProgramState data that does this 
> automatically.
> 
> 
> +  StreamMapTy TrackedStreams = State->get<StreamMap>();
> +  StreamMapTy::Factory &F = State->get_context<StreamMap>();
> 
> Anna: this is more efficient if there are a lot of things to remove, because 
> it doesn't canonicalize the state with each removal.
> 

The chance of removing more than one tracked symbol here are very low and this 
does make code less readable. If we think it's a better practice to remove a 
bunch of symbols and canonize afterwards in all the checkers, we could provide 
the API for it.

> 
> As for the name, I'm not such a fan of OpenCloseAPIChecker, but everything 
> I'm coming up with sounds worse. (ResourceManagementChecker, CleanupChecker.) 
> Not everything in the general checker is "open" and "close" (locks, security 
> authorization, etc).
> 
> Thanks for working on this!
> Jordan
> 
> 
> On Jun 17, 2013, at 14:40 , Anna Zaks <[email protected]> wrote:
> 
>> Adam, 
>> 
>> Sorry for the delayed review. Please let us know if you are still interested 
>> in working on this since Alexey was interested in adding some extra stream 
>> checks.
>> 
>> Moving of getAllocationSite is a good idea. However, you should change the 
>> name to something more generic (allocation sounds too related to memory 
>> allocations/deallocations). Also, the function implementation should go into 
>> the cpp file, not into a header. Please, submit this as a separate patch. 
>> 
>> Review for StreamCheckerV2.cpp:
>> 
>> We can just delete StreamChecker.cpp. The content will always stay in the 
>> repository, but we could reuse the name. Another option would be to name 
>> this checker something else, like OpenCloseAPI checker. The up-site is that 
>> we could reuse the code to implement other open/close API checks 
>> (lock/unlock,...). The downside is that the placement of non-open close 
>> Stream API checks would be unclear. I personally prefer the second option - 
>> OpenCloseAPI checker. Other opinions are welcome!
>> 
>> We should have a first commit for just copying the SimpleStreamChecker into 
>> another checker and follow up commits for the specific improvements. LLVM 
>> follows iterative development process, which encourages small incremental 
>> patches. This would also allow others to improve the checker.
>> 
>> There are several header files that have been added. Please, only include 
>> the ones that are needed. For example, I don't think "InterCheckerAPI.h" is 
>> used. I suspect that most others are not needed either.
>> 
>> Is there a reason to go through the factory in 
>> StreamCheckerV2::checkDeadSymbols? The original code was simpler.
>> 
>> 399 +  if (Optional<StmtPoint> SP = P.getAs<StmtPoint>())
>> 400 +    AllocationStmt = SP->getStmt();
>> The malloc checker also special cases the situation where the point is 
>> CallExitEnd. Please, test what happens when the allocation site happens in a 
>> function called from the function where the issue is reported.
>> 
>> 463 +  IIfopen  = &Ctx.Idents.get("fopen");
>> Extra space before '='.
>> 
>> Thanks for working on this!
>> Anna.
>> 
>> On Apr 28, 2013, at 10:52 PM, Adam Schnitzer <[email protected]> wrote:
>> 
>>> I had another shot at it. I made a new checker, StreamV2, which is based 
>>> off of SimpleStream, so that can stay as an example.
>>> 
>>> This patch moved the getFirstAllocation function from the malloc checker to 
>>> CheckerContext so it can be reused. If there's a better spot for it, let me 
>>> know.
>>> 
>>> I also added the printing for the MemRegion where the stream was opened. 
>>> This did change the location where some of the bugs were reported. There is 
>>> one example that I don't think is quite right:
>>> 
>>> int checkLeak(int *Data) {
>>>   FILE *F = fopen("myfile.txt", "w");
>>>   if (F != 0) {
>>>     fputs ("fopen example", F); // expected-warning {{Opened file is never 
>>> closed; potential resource leak of 'F'}}
>>>   }
>>> 
>>>   if (Data)
>>>     return *Data;
>>>   else
>>>     return 0;
>>> }
>>> 
>>> It seems like the bug should be reported on the line: if (Data). I think 
>>> this might be an error with the order in which I'm removing nodes from the 
>>> graph and reporting bugs.
>>> 
>>> Adam
>>> 
>>> On Mon, Apr 22, 2013 at 3:10 PM, Adam Schnitzer <[email protected]> wrote:
>>> Anna,
>>> 
>>> Thanks for the feedback. I think I have a better idea of how to go about it 
>>> now. I'll have another shot at it.
>>> 
>>> Adam
>>> 
>>> 
>>> On Mon, Apr 22, 2013 at 1:17 PM, Anna Zaks <[email protected]> wrote:
>>> Adam,
>>> 
>>> The warning looks good for the listed test cases (though the column seems 
>>> redundant). However, it might not be a good fit when the file name is not a 
>>> string literal. In other checkers, we often pretty print the region 
>>> instead; for example, see reportLeak in the MallocChecker. 
>>> 
>>> The second issue is storing the string in the state. It should be possible 
>>> to get the file info only at the point of a leak report, not when 
>>> processing 'fopen'. Specifically, you would go up the path when reporting 
>>> the leak and find the statement that opened the file. That logic would be 
>>> very similar to "getAllocationSite" from mallocChecker. Let's see if we can 
>>> factor it out so that we do not continue with copying and pasting of that 
>>> code.
>>> 
>>> Thanks!
>>> Anna.
>>> On Apr 21, 2013, at 10:56 PM, Adam Schnitzer <[email protected]> wrote:
>>> 
>>>> Anna, 
>>>> 
>>>> Got it, sorry about the mixup. I will go ahead and work in a separate 
>>>> file. But did it look like I was on the right track for the diagnostics?
>>>> 
>>>> Adam
>>>> 
>>>> On Mon, Apr 22, 2013 at 1:20 AM, Anna Zaks <[email protected]> wrote:
>>>> Adam,
>>>> 
>>>> Sorry if I was not 100% clear. We'd like to leave the 
>>>> SimpleStreamChecker.cpp file as is for reference purposes. You can either 
>>>> create a new file or replace StreamChecker.cpp with your checker.
>>>> 
>>>> Thanks,
>>>> Anna.
>>>> On Apr 20, 2013, at 11:34 PM, Adam Schnitzer <[email protected]> wrote:
>>>> 
>>>> > This is my first patch for the SimpleStreamChecker. It improves 
>>>> > diagnostics by adding the file name in the case of a resource leak. I 
>>>> > did so by adding a std::string to the StreamState to hold the file name.
>>>> >
>>>> > Any feedback would be great.
>>>> >
>>>> > Adam
>>>> > <SimpleStreamChecker.patch>
>>> 
>>> 
>>> 
>>> <StreamCheckerV2.patch>

_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to