[Rd] longint

Benjamin Tyner btyner @ending from gm@il@com
Thu Aug 16 02:32:14 CEST 2018


Thanks for the replies and for confirming my suspicion.

Interestingly, src/include/S.h uses a trick:

    #define longint int

and so does the nlme package (within src/init.c).

On 08/15/2018 02:47 PM, Hervé Pagès wrote:
> No segfault but a BIG warning from the compiler. That's because 
> dereferencing the pointer inside your myfunc() function will
> produce an int that is not predictable i.e. it is system-dependent.
> Its value will depend on sizeof(long int) (which is not
> guaranteed to be 8) and on the endianness of the system.
>
> Also if the pointer you pass in the call to the function is
> an array of long ints, then pointer arithmetic inside your myfunc()
> won't necessarily take you to the array element that you'd expect.
>
> Note that there are very specific situations where you can actually
> do this kind of things e.g. in the context of writing a callback
> function to pass to qsort(). See 'man 3 qsort' if you are on a Unix
> system. In that case pointers to void and explicit casts should
> be used. If done properly, this is portable code and the compiler won't
> issue warnings.
>
> H.
>
>
> On 08/15/2018 07:05 AM, Brian Ripley wrote:
>>
>>
>>> On 15 Aug 2018, at 12:48, Duncan Murdoch <murdoch.duncan using gmail.com> 
>>> wrote:
>>>
>>>> On 15/08/2018 7:08 AM, Benjamin Tyner wrote:
>>>> Hi
>>>> In my R package, imagine I have a C function defined:
>>>>      void myfunc(int *x) {
>>>>         // some code
>>>>      }
>>>> but when I call it, I pass it a pointer to a longint instead of a
>>>> pointer to an int. Could this practice potentially result in a 
>>>> segfault?
>>>
>>> I don't think the passing would cause a segfault, but "some code" 
>>> might be expecting a positive number, and due to the type error you 
>>> could pass in a positive longint and have it interpreted as a 
>>> negative int.
>>
>> Are you thinking only of a little-endian system?  A 32-bit lookup of 
>> a pointer to a 64-bit area could read the wrong half and get a 
>> completely different value.
>>
>>>
>>> Duncan Murdoch
>>>
>>> ______________________________________________
>>> R-devel using r-project.org mailing list
>>> https://urldefense.proofpoint.com/v2/url?u=https-3A__stat.ethz.ch_mailman_listinfo_r-2Ddevel&d=DwIFAg&c=eRAMFD45gAfqt84VtBcfhQ&r=BK7q3XeAvimeWdGbWY_wJYbW0WYiZvSXAJJKaaPhzWA&m=ERck0y30d00Np6hqTNYfjusx1beZim0OrKe9O4vkUxU&s=x1gI9ACZol7WbaWQ7Ocv60csJFJClZotWkJIMwUdjIc&e= 
>>>
>>
>> ______________________________________________
>> R-devel using r-project.org mailing list
>> https://urldefense.proofpoint.com/v2/url?u=https-3A__stat.ethz.ch_mailman_listinfo_r-2Ddevel&d=DwIFAg&c=eRAMFD45gAfqt84VtBcfhQ&r=BK7q3XeAvimeWdGbWY_wJYbW0WYiZvSXAJJKaaPhzWA&m=ERck0y30d00Np6hqTNYfjusx1beZim0OrKe9O4vkUxU&s=x1gI9ACZol7WbaWQ7Ocv60csJFJClZotWkJIMwUdjIc&e= 
>>
>>
>



More information about the R-devel mailing list