# Help with reinterperating result of ccall

**URL:** https://discourse.julialang.org/t/help-with-reinterperating-result-of-ccall/131227
**Category:** General Usage
**Tags:** ccall, types
**Created:** [July 30, 2025, 9:46pm UTC](https://discourse.julialang.org/t/help-with-reinterperating-result-of-ccall/131227 "2025-07-30T21:46:06Z")
**Posts on this page:** 9
**Page:** 1

<div class="post-metadata">

### Author: ![AwesomeQuest](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/awesomequest/32/38910_2.png) [@AwesomeQuest](https://discourse.julialang.org/u/AwesomeQuest)
#### Post date: [July 30, 2025, 9:46pm UTC](https://discourse.julialang.org/t/help-with-reinterperating-result-of-ccall/131227/1 "2025-07-30T21:46:06Z")

</div>

So I have a function in a C library that returns a `uint16_t` and I call it something like this

```julia-auto
(@ccall ".\\lib.dll".crc16()::UInt16)

```

However, this gives the wrong result.  
But

```julia-auto
(@ccall ".\\lib.dll".crc16()::UInt16) |> x->reinterpret(UInt16, x)

```

Gives the right result.

Any clues as to what could be happening? I’ve also tried using `Cushort` instead of `UInt16` and the same thing happens.

Are `Cushort` and`UInt16` not basically the same thing?

---

<div class="post-metadata">

### Author: ![giordano](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/giordano/32/2166_2.png) [@giordano](https://discourse.julialang.org/u/giordano)
#### Post date: [July 30, 2025, 10:12pm UTC](https://discourse.julialang.org/t/help-with-reinterperating-result-of-ccall/131227/2 "2025-07-30T22:12:42Z")

</div>

Are you willing to share the code of the C function? It’s hard to tell what’s going on without knowing what’s actually in the library.

---

<div class="post-metadata">

### Author: ![AwesomeQuest](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/awesomequest/32/38910_2.png) [@AwesomeQuest](https://discourse.julialang.org/u/AwesomeQuest)
#### Post date: [July 30, 2025, 10:19pm UTC](https://discourse.julialang.org/t/help-with-reinterperating-result-of-ccall/131227/3 "2025-07-30T22:19:00Z")

</div>

Sure, I just thought it might be irrelevant. It’s stolen from ArduinoModbus.

Inside mymodbus.c

```cpp
#include <stdint.h>

/* Table of CRC values for high-order byte */
#if defined(ARDUINO) && defined( __AVR__ )
static PROGMEM const uint8_t table_crc_hi[] = {
#else
static const uint8_t table_crc_hi[] = {
#endif
    0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
    0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
    0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
    0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
    0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
    0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
    0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
    0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
    0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
    0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
    0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
    0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
    0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
    0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
    0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
    0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
    0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
    0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
    0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
    0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
    0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
    0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
    0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
    0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
    0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
    0x80, 0x41, 0x00, 0xC1, 0x81, 0x40
};

/* Table of CRC values for low-order byte */
#if defined(ARDUINO) && defined( __AVR__ )
#include <avr/pgmspace.h>
static PROGMEM const uint8_t table_crc_lo[] = {
#else
static const uint8_t table_crc_lo[] = {
#endif
    0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06,
    0x07, 0xC7, 0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD,
    0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09,
    0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A,
    0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC, 0x14, 0xD4,
    0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3,
    0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3,
    0xF2, 0x32, 0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4,
    0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A,
    0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29,
    0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF, 0x2D, 0xED,
    0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26,
    0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60,
    0x61, 0xA1, 0x63, 0xA3, 0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67,
    0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F,
    0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68,
    0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA, 0xBE, 0x7E,
    0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5,
    0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71,
    0x70, 0xB0, 0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92,
    0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C,
    0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B,
    0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89, 0x4B, 0x8B,
    0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C,
    0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42,
    0x43, 0x83, 0x41, 0x81, 0x80, 0x40
};

uint16_t crc16(uint8_t *buffer, uint16_t buffer_length)
{
    uint8_t crc_hi = 0xFF; /* high CRC byte initialized */
    uint8_t crc_lo = 0xFF; /* low CRC byte initialized */
    unsigned int i; /* will index into CRC lookup */

    /* pass through message buffer */
    while (buffer_length--) {
        i = crc_hi ^ *buffer++; /* calculate the CRC */
#if defined(ARDUINO) && defined( __AVR__ )
        crc_hi = crc_lo ^ pgm_read_byte_near(table_crc_hi + i);
        crc_lo = pgm_read_byte_near(table_crc_lo + i);
#else
        crc_hi = crc_lo ^ table_crc_hi[i];
        crc_lo = table_crc_lo[i];
#endif
    }

    return (crc_hi << 8 | crc_lo);
}

```

And the full example I’m calling it with is

```julia-auto
julia> (@ccall ".\\mymodbus.dll".crc16(pointer([0x01, 0x03, 0x00, 0x10, 0x00, 0x02])::Ptr{UInt8}, 6::UInt16)::UInt16)         
0x001b

julia> (@ccall ".\\mymodbus.dll".crc16(pointer([0x01, 0x03, 0x00, 0x10, 0x00, 0x02])::Ptr{UInt8}, 6::UInt16)::UInt16) |> x->reinterpret(UInt16, x)
0xc5ce

```

`0xc5ce` is the correct result

---

<div class="post-metadata">

### Author: ![giordano](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/giordano/32/2166_2.png) [@giordano](https://discourse.julialang.org/u/giordano)
#### Post date: [July 30, 2025, 10:30pm UTC](https://discourse.julialang.org/t/help-with-reinterperating-result-of-ccall/131227/4 "2025-07-30T22:30:11Z")

</div>

```julia-auto
julia> run(`cc -shared -fPIC test.c -o libtest.dylib`);

julia> @ccall "./libtest.dylib".crc16([0x01, 0x03, 0x00, 0x10, 0x00, 0x02]::Ref{UInt8}, 6::UInt16)::UInt16
0xc5ce

```

---

<div class="post-metadata">

### Author: ![Keno](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/keno/32/285_2.png) [@Keno](https://discourse.julialang.org/u/Keno)
#### Post date: [July 30, 2025, 11:51pm UTC](https://discourse.julialang.org/t/help-with-reinterperating-result-of-ccall/131227/5 "2025-07-30T23:51:27Z")

</div>

@giordano has the correct fix. The original code has a use-after-free.

---

<div class="post-metadata">

### Author: ![AwesomeQuest](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/awesomequest/32/38910_2.png) [@AwesomeQuest](https://discourse.julialang.org/u/AwesomeQuest)
#### Post date: [July 31, 2025, 12:02pm UTC](https://discourse.julialang.org/t/help-with-reinterperating-result-of-ccall/131227/6 "2025-07-31T12:02:48Z")

</div>

Can you explain how it’s a use-after-free?  
Because I’m using `pointer`?

---

<div class="post-metadata">

### Author: ![giordano](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/giordano/32/2166_2.png) [@giordano](https://discourse.julialang.org/u/giordano)
#### Post date: [July 31, 2025, 12:12pm UTC](https://discourse.julialang.org/t/help-with-reinterperating-result-of-ccall/131227/7 "2025-07-31T12:12:33Z")

</div>

Yes, see the [`pointer`](https://docs.julialang.org/en/v1/base/c/#Base.pointer) docstring:

> This function is “unsafe”. Be careful to ensure that a Julia reference to `array` exists as long as this pointer will be used. The [`GC.@preserve`](https://docs.julialang.org/en/v1/base/base/#Base.GC.@preserve) macro should be used to protect the `array` argument from garbage collection within a given block of code.

Lexically, the array is gone after you get its pointer, so it can be freed before the C function does something with it. This is also explained in the documentation for [calling C and Fortran code](https://docs.julialang.org/en/v1/manual/calling-c-and-fortran-code/index.html#Garbage-Collection-Safety), which you should really read carefully before working with this.

---

<div class="post-metadata">

### Author: ![sgaure](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/sgaure/32/14779_2.png) [@sgaure](https://discourse.julialang.org/u/sgaure)
#### Post date: [July 31, 2025, 12:14pm UTC](https://discourse.julialang.org/t/help-with-reinterperating-result-of-ccall/131227/8 "2025-07-31T12:14:08Z")

</div>

> [@AwesomeQuest](#):
>
> Because I’m using `pointer`?

Yes. When you use `pointer([1,2,3,4])`, julia can free the array `[1,2,3,4]` immediately, because as far as julia knows, it’s not used any more. It’s not different from e.g. `sum([1,2,3,4])`.

---

<div class="post-metadata">

### Author: ![mbauman](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/mbauman/32/31082_2.png) [@mbauman](https://discourse.julialang.org/u/mbauman)
#### Post date: [July 31, 2025, 1:28pm UTC](https://discourse.julialang.org/t/help-with-reinterperating-result-of-ccall/131227/9 "2025-07-31T13:28:32Z")

</div>

Right, this doesn’t have anything to do with `reinterpret` — that’s a no-op in both cases. It’s just that some particular code arrangements may lead to the collection of the array at different times.
