[cfe-commits] r57240 - /cfe/trunk/lib/Analysis/GRExprEngine.cpp
Zhongxing Xu
xuzhongxing at gmail.com
Tue Oct 7 19:43:00 PDT 2008
New patch:
Index: lib/Analysis/GRExprEngine.cpp
===================================================================
--- lib/Analysis/GRExprEngine.cpp (revision 57240)
+++ lib/Analysis/GRExprEngine.cpp (working copy)
@@ -1132,10 +1132,12 @@
case 5:
if (!memcmp(s, "panic", 5)) Builder->BuildSinks = true;
else if (!memcmp(s, "error", 5)) {
- Expr* Arg = *CE->arg_begin();
- if (IntegerLiteral* IL = dyn_cast<IntegerLiteral>(Arg))
- if (IL->getValue() != 0)
+ if (CE->getNumArgs() > 0) {
+ RVal X = GetRVal(St, *CE->arg_begin());
+ nonlval::ConcreteInt* CI =
dyn_cast<nonlval::ConcreteInt>(&X);
+ if (CI && CI->getValue() != 0)
Builder->BuildSinks = true;
+ }
}
break;
On Wed, Oct 8, 2008 at 10:28 AM, Zhongxing Xu <xuzhongxing at gmail.com> wrote:
> Is this OK?
>
> Index: lib/Analysis/GRExprEngine.cpp
> ===================================================================
> --- lib/Analysis/GRExprEngine.cpp (revision 57240)
> +++ lib/Analysis/GRExprEngine.cpp (working copy)
> @@ -1132,9 +1132,9 @@
> case 5:
> if (!memcmp(s, "panic", 5)) Builder->BuildSinks = true;
> else if (!memcmp(s, "error", 5)) {
> - Expr* Arg = *CE->arg_begin();
> - if (IntegerLiteral* IL = dyn_cast<IntegerLiteral>(Arg))
> - if (IL->getValue() != 0)
> + RVal X = GetRVal(St, *CE->arg_begin());
> + if (nonlval::ConcreteInt* CI =
> dyn_cast<nonlval::ConcreteInt>(&X))
> + if (CI->getValue() != 0)
> Builder->BuildSinks = true;
> }
> break;
>
>
>
> On Wed, Oct 8, 2008 at 12:49 AM, Ted Kremenek <kremenek at apple.com> wrote:
>
>>
>> On Oct 7, 2008, at 3:06 AM, Zhongxing Xu wrote:
>>
>> if (!memcmp(s, "panic", 5)) Builder->BuildSinks = true;
>>> + else if (!memcmp(s, "error", 5)) {
>>> + Expr* Arg = *CE->arg_begin();
>>> + if (IntegerLiteral* IL = dyn_cast<IntegerLiteral>(Arg))
>>> + if (IL->getValue() != 0)
>>> + Builder->BuildSinks = true;
>>> + }
>>> break;
>>>
>>
>>
>> Hi Zhongxing,
>>
>> I think this code will crash if error() isn't passed any arguments. It
>> should check to see if error() has the number of arguments that you expect.
>>
>> Also, is there a reason you check the AST node for an IntegerLiteral
>> instead of just consulting the value of 'CE' that is in the state? You'll
>> get far more accurate information by looking at the semantics of the
>> argument instead of its syntax.
>>
>> For example, checking for an integer literal will miss the following
>> cases:
>>
>> error(1 - 1);
>>
>> error((1)); // note the '()'
>>
>> x = 1;
>> error(x);
>>
>> I think just doing GetRVal(St, CE) should do the trick.
>>
>> Ted
>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20081008/1af727b3/attachment.html>
More information about the cfe-commits
mailing list