[PATCH] Detect identical conditions in if-else-if statements

Anton Yartsev anton.yartsev at gmail.com
Tue Mar 11 16:08:43 PDT 2014


On 11.03.2014 20:58, Jordan Rose wrote:
>
> On Mar 6, 2014, at 13:16 , Daniel Fahlgren <daniel at fahlgren.se 
> <mailto:daniel at fahlgren.se>> wrote:
>
>> Hi Jordan,
>>
>> Thanks for reviewing this.
>>
>> On Wed, 2014-03-05 at 14:38 -0800, Jordan Rose wrote:
>>> I'm sorry, I managed to miss this one. Please feel free to include me
>>> in the To or CC fields when you have analyzer patches.
>>
>>> I'm glad to get this check! It definitely seems useful for copy-paste
>>> checking. Thanks for doing the timing checks in advance.
>>>
>>> Comments:
>>>
>>> +  if (Stmt1 && Stmt2) {
>>> +    const Expr *Cond1 = I->getCond();
>>> +    const Stmt *Else = Stmt2;
>>> +    while (const IfStmt *I2 = dyn_cast<IfStmt>(Else)) {
>>>
>>> If you use dyn_cast_or_null here, then you can drop the check for a
>>> missing 'else' at the end of the loop (and at the beginning of the loop
>>> too, though that's less interesting).
>>
>> I've kept the check at the beginning, mostly because I think it makes
>> the code more readable.
>>
>>> +        PathDiagnosticLocation ELoc = 
>>> PathDiagnosticLocation::createBegin(Cond2,
>>> +            BR.getSourceManager(), AC);
>>>
>>> Please use the regular Stmt-based constructor for
>>> PathDiagnosticLocation. We want to consider the whole condition to be
>>> the location, not just the beginning.
>>>
>>> +        BR.EmitBasicReport(AC->getDecl(), Checker,
>>> +                           "Identical conditions",
>>> +                           categories::LogicError,
>>> +                           "identical condition as a previous one", 
>>> ELoc, Sr);
>>>
>>> This isn't quite valid English: two things can "be identical", and one
>>> thing can "be identical to" another thing, but one thing can't be
>>> "identical as" another thing. The "one" also makes me
>>> uncomfortable...it feels weird in a compiler tool. How about
>>> "expression is identical to previous condition"? (I'm cheating by using
>>> "expression" to mean "condition" in this case, but it sounds better to
>>> not repeat "condition".)
>>>
>>> As far as test cases go, please include some cases where
>>> - the duplicated condition is not last
>>> - the duplicated condition is not first
>>> - there are multiple pairs of duplicated conditions in the chain
>>
>> Valid points as usual. Attached is an updated version of the patch.
>>
>> Btw, who should I poke to get the list of potential checkers updated?
>> The page still lists different.IdenticalExprBinOp,
>> different.IdenticalStmtThenElse and different.CondOpIdenticalReturn as
>> without progress.
>
> Ah, that's also me, probably. The original list was set up by Anna and 
> Anton Yartsev, for the most part, but Anna is still out and I don't 
> think Anton wants to be the general maintainer for it. The fastest way 
> to get it updated is to send me a diff; the entire analyzer site is in 
> www/analyzer/.
>
> Patch committed as r203585!
>
> Jordan

Hm, the list is really long outdated. I'll update it one of these days.

-- 
Anton

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20140312/ca733cf7/attachment.html>


More information about the cfe-commits mailing list