bug-apl
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Bug-apl] cast from pointer to smaller type 'int'


From: Xiao-Yong Jin
Subject: Re: [Bug-apl] cast from pointer to smaller type 'int'
Date: Wed, 20 Sep 2017 15:26:24 -0500

So you have a 32bit linux?  Things got more complicated when you want memory 
safety unfortunately.
POSIX basically tells us pthread_t can be anything, so if you really want to 
print the content, perhaps the following would work without the compiler 
complaining.  (I think only char can be used for type punning without breaking 
the strict aliasing rule, but that may only be true in C?)

const unsigned char* a = reinterpret_cast<const unsigned char*>(&thread);
for (size_t i = 0; i < sizeof(thread); ++i)
  out << hex << setw(2) << static_cast<unsigned int>(a[i]);

> On Sep 20, 2017, at 3:00 PM, Juergen Sauermann <address@hidden> wrote:
> 
> Hi Xiao-Yong,
> 
> with reinterpret_cast<size_t> I am getting (gcc 4.8)  this:
> 
> Thread_context.cc: In member function ‘void 
> Thread_context::print(std::ostream&) const’:
> Thread_context.cc:73:42: error: invalid cast from type ‘pthread_t {aka long 
> unsigned int}’ to type ‘size_t {aka unsigned int}’
>         << reinterpret_cast<size_t>(thread)
>                                           ^
> make[1]: *** [apl-Thread_context.o] Error 1
> 
> It seems a little ridiculous to me that replacing a good old C-style cast 
> that worked fine for the
> last 10 years cannot be replaced by one of the 3 members of the C++ zoo of 
> casts in a portable way?
> 
> Maybe some intermediate cast to const void * can be done on your machine?
> 
> Best Regards,
> Jürgen
> 
> 
> On 09/19/2017 11:44 PM, Xiao-Yong Jin wrote:
>> Should have got back to you sooner, but static_cast is not allowed between 
>> pointer types and non-pointer types.
>> 
>> Thread_context.cc:73:11: error: static_cast from 'pthread_t' (aka 
>> '_opaque_pthread_t *') to 'int' is not allowed
>>        << static_cast<int>(thread)
>>           ^~~~~~~~~~~~~~~~~~~~~~~~
>> 
>> I need reinterpret_cast<size_t> here.  I cannot reinterpret_cast<int> 
>> either, because of the difference in size.
>> 
>> 
>>> On Sep 11, 2017, at 3:01 PM, Juergen Sauermann <address@hidden>
>>>  wrote:
>>> 
>>> Hi Xiao-Yong,
>>> 
>>> I see. In this particular case the pthread_t is only used to identify a 
>>> thread and
>>> to distinguish it from other threads for debugging purposes. So as long as 
>>> the
>>> compiler does not complain about the cast everything is fine. Cast to void 
>>> * instead of
>>> int would also be an option.
>>> 
>>> /// Jürgen
>>>  
>>> 
>>> On 09/11/2017 08:38 PM, Xiao-Yong Jin wrote:
>>> 
>>>> I don't think there is a portable way of printing a variable of type 
>>>> pthread_t.  It could be a struct, depending on the implementation.  
>>>> static_cast<int> is alright, but may not be useful in the future.
>>>> 
>>>> 
>>>> 
>>>>> On Sep 11, 2017, at 1:08 PM, Juergen Sauermann <address@hidden>
>>>>> 
>>>>>  wrote:
>>>>> 
>>>>> Hi Xiao-Yong,
>>>>> 
>>>>> thanks, maybe fixed in SVN 1011.
>>>>> Problem with that error is that the casted type is not a pointer, at 
>>>>> least on my machine.
>>>>> 
>>>>> /// Jürgen
>>>>> 
>>>>> 
>>>>> On 09/11/2017 06:55 PM, Xiao-Yong Jin wrote:
>>>>> 
>>>>> 
>>>>>> At revision 1010
>>>>>> 
>>>>>> Thread_context.cc:72:65: error: cast from pointer to smaller type 'int' 
>>>>>> loses information
>>>>>>    out << "thread #"     << setw(2) << N << ":" << setw(16)  << 
>>>>>> int(thread)
>>>>>> 
>>>>>> 
>>>>>> 
>>>>>> 
>>>>>> 
>>>>>> 
>> 
> 




reply via email to

[Prev in Thread] Current Thread [Next in Thread]