[PATCH] D139759: [analyzer] Fix assertion in getAPSIntType
Balázs Benics via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Sat Dec 10 23:12:17 PST 2022
steakhal added inline comments.
================
Comment at: clang/include/clang/StaticAnalyzer/Core/PathSensitive/BasicValueFactory.h:157-158
+ Loc::isLocType(T));
return APSIntType(Ctx.getIntWidth(T),
!T->isSignedIntegerOrEnumerationType());
}
----------------
vabridgers wrote:
> steakhal wrote:
> > I don't think you are supposed to call `isSignedIntegerOrEnumerationType()` if you have a //fixed-point// type.
> > ```lang=C++
> > inline bool Type::isSignedFixedPointType() const {
> > if (const auto *BT = dyn_cast<BuiltinType>(CanonicalType)) {
> > return ((BT->getKind() >= BuiltinType::ShortAccum &&
> > BT->getKind() <= BuiltinType::LongAccum) ||
> > (BT->getKind() >= BuiltinType::ShortFract &&
> > BT->getKind() <= BuiltinType::LongFract) ||
> > (BT->getKind() >= BuiltinType::SatShortAccum &&
> > BT->getKind() <= BuiltinType::SatLongAccum) ||
> > (BT->getKind() >= BuiltinType::SatShortFract &&
> > BT->getKind() <= BuiltinType::SatLongFract));
> > }
> > return false;
> > }
> > ```
> > By looking at the implementation of this, I don't think you could substitute that with `isSignedIntegerOrEnumerationType()`.
> > Am I wrong about this?
> >
> > Please demonstrate this by tests.
> I tried using isSignedIntegerOrEnumerationType() instead of (T->isIntegralOrEnumerationType() || T->isFixedPointType() ... ), but got the same assert :/
>
> I corrected the formatting and expanded the test cases.
Is hould have clarified, sorry.
My point is that for constructing the APSIntType, we calculate the bitwidth and the signedness.
My problem is that the calculation is wrong for the signedness in case we have a signed fixedpointtype.
It is wrong because we reach `isSignedIntegerOrEnumerationType()` with a fixedpoint type. For that even though its signed, it will return false!
And in the end we will have an APSIntType with the wrong signednss.
So my point is that we should probably handle fixedpoint types separately to have a distict return statement for it.
But im jumping to the solution, what I originally wanted to highlight was this.
That was why I requested changes.
And this is what I wanted to see some how intests, but I wont insist if its too difficult to craft.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D139759/new/
https://reviews.llvm.org/D139759
More information about the cfe-commits
mailing list