[cfe-dev] CanQualType for ssize_t

Alex L via cfe-dev cfe-dev at lists.llvm.org
Thu Jul 13 02:38:23 PDT 2017


On 12 July 2017 at 21:00, Alexander Shaposhnikov <
alexander.v.shaposhnikov at gmail.com> wrote:

> Yeah, I think you are right,
> my question was mostly about if it's on purpose that  TargetInfo
> <https://clang.llvm.org/doxygen/classclang_1_1TargetInfo.html> and
> ASTContext don't expose this information (like they do for size_t).
>
I mean that there is getSizeType method, but there isn't getSignedSizeType
> and I'm wondering if it's expected.
> If it's not on purpose  - what would people say to adding it ? or what we
> should use instead.
> Many thanks for the reply,
> Kind regards,
> Alexander Shaposhnikov
>
>
I think that the standard says that we can just take the signed version of
the SizeType. A method like this in TargetInfo should suffice then:

IntType getSignedSizeType() const {
  switch (SizeType) {
  case UnsignedLongLong: return SignedLongLong;
  ....
  }
}

Then you should be able to add an appropriate method to the ASTContext that
returns a QualType that corresponds to this Target type.

In my opinion this is a reasonable solution to the problem,
Alex


>
>
> On Wed, Jul 12, 2017 at 4:10 AM, Alex L <arphaman at gmail.com> wrote:
>
>> The C11 standard has the following paragraph for 'z':
>>
>> Specifies that a following d, i, o, u, x, or X conversion specifier
>> applies to a size_t or the corresponding signed integer type argument; or
>> that a following n conversion specifier applies to a pointer to a signed
>> integer type corresponding to size_t argument.
>>
>> If I interpret it correctly (please correct me if I'm wrong) then this
>> means that for '%zd' you can use a type that identical to the target's
>> SizeType, except that it has to be signed.
>>
>> Alex
>>
>> On 12 July 2017 at 03:01, Александр Шапошников <
>> alexander.v.shaposhnikov at gmail.com> wrote:
>>
>>>
>>>
>>> On Tue, Jul 11, 2017 at 5:19 PM, Alexander Shaposhnikov <
>>> shal1t712 at gmail.com> wrote:
>>>
>>>> Hi,
>>>> I have a question regarding the right way to get CanQualType/QualType
>>>> for "ssize_t".
>>>>
>>>> The class ASTContext
>>>> <https://clang.llvm.org/doxygen/classclang_1_1ASTContext.html#a7c89acd533ffea38c5011885d8d029e4>
>>>>  (https://clang.llvm.org/doxygen/ASTContext_8cpp_source.html#l04524)
>>>> has a number of methods: getIntMaxType, getUintMaxType, getSizeType etc
>>>> but if i am not mistaken it doesn't have the counterpart for "ssize_t".
>>>> After looking at the implementation of those methods i see that it's
>>>> missing in the class TargetInfo
>>>> <https://clang.llvm.org/doxygen/classclang_1_1TargetInfo.html> either.
>>>> https://clang.llvm.org/doxygen/include_2clang_2Basic_2Target
>>>> Info_8h_source.html#l00228 .
>>>>
>>>> Some context:
>>>>
>>>> in PrintfSpecifier::getArgType (in ./lib/Analysis/PrintfForma
>>>> tString.cpp)
>>>> there is a FIXME:
>>>>
>>>>      case LengthModifier::AsSizeT:
>>>>          return ArgType(); // FIXME: ssize_t
>>>>
>>>> as a result Clang doesn't analyze the format string "%zd" correctly
>>>> and doesn't warn on the following (broken) code:
>>>>
>>>>     int main() {
>>>>       printf("%zd", 12.2);
>>>>       return 0;
>>>>     }
>>>>
>>>> Kind regards,
>>>> Alexander Shaposhnikov
>>>>
>>>
>>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20170713/140d45d5/attachment.html>


More information about the cfe-dev mailing list