Hi Bryan

But the returned uintptr from syscall is as far as i know a pointer to a 
struct which has been created by the C API, so go runtime won't touch it or 
do I miss something?

Am Freitag, 15. Dezember 2017 00:48:51 UTC+1 schrieb Bryan Mills:
>
> In this case, the vet tool is correct if you're making the syscall with 
> Go-allocated memory.
> The Go runtime is allowed to move values around: the address of a Go 
> variable is only pinned for the duration of the syscall itself.
>
> If you've got C-allocated memory (or statically-allocated memory), 
> https://golang.org/issue/13656#issuecomment-303216308 has a solution that 
> avoids copying and is more robust to large sizes.
>
>
> On Thursday, December 14, 2017 at 5:27:57 AM UTC-5, snmed wrote:
>>
>> Okay I found a way, this seems to work:
>>
>> ca := (*[1000000]byte) (unsafe.Pointer(certctx.pbCertEncoded))[:certctx.
>> cbCertEncoded]
>>
>> or
>>
>> mm := make([]byte, certctx.cbCertEncoded)
>>     for i := uint32(0) ; i < certctx.cbCertEncoded; i++ {
>>         mm[i] = *((*byte)(unsafe.Pointer(certctx.pbCertEncoded + uintptr(
>> i) * unsafe.Sizeof(new(byte)))))
>>     }
>>
>>
>>
>> Anyway, the vet tool is complaining:
>>
>> main.go:106: possible misuse of unsafe.Pointer
>> main.go:109: possible misuse of unsafe.Pointer
>>
>> This is the code fragment:
>>
>> 104    certctx := new(CERT_CONTEXT)
>> 105
>> 106    certctx = (*CERT_CONTEXT) (unsafe.Pointer(pccert_context))
>> 107
>> 108    
>> 109    ca := (*[1000000]byte) (unsafe.Pointer(certctx.pbCertEncoded))[:
>> certctx.cbCertEncoded]
>>
>> Is there another way to use syscall return values uintptr without vet 
>> warnings? And which solution should I prefer? I think the later one should 
>> be more safe, isn't it?
>>
>> Cheers
>>
>>
>> Am Donnerstag, 14. Dezember 2017 09:29:38 UTC+1 schrieb snmed:
>>>
>>> Hi Miki 
>>>
>>> I'm using syscall package and no C import, but maybe it is possible to 
>>> use this function as well?
>>>
>>> Am Donnerstag, 14. Dezember 2017 09:18:26 UTC+1 schrieb Miki Tebeka:
>>>>
>>>> Do you mean
>>>>
>>>> func C.GoBytes(unsafe.Pointer, C.int) []byte
>>>>
>>>>  ?
>>>>
>>>> On Thursday, December 14, 2017 at 9:05:32 AM UTC+2, snmed wrote:
>>>>>
>>>>> Hi all
>>>>>
>>>>> I'm trying to map a C structure to an equivalent go struct, but I 
>>>>> bumped into a problem with a pointer to byte that is actually an array of 
>>>>> bytes.
>>>>>
>>>>> Here is the C struct:
>>>>>
>>>>> typedef struct _CERT_CONTEXT {
>>>>>   DWORD      dwCertEncodingType;
>>>>>   BYTE       *pbCertEncoded;
>>>>>   DWORD      cbCertEncoded;
>>>>>   PCERT_INFO pCertInfo;
>>>>>   HCERTSTORE hCertStore;
>>>>> } CERT_CONTEXT, *PCERT_CONTEXT;
>>>>>
>>>>>
>>>>> and this is my go struct:
>>>>>
>>>>> type CERT_CONTEXT struct {
>>>>>     dwCertEncodingType uint32
>>>>>     pbCertEncoded      uintptr
>>>>>     cbCertEncoded      uint32
>>>>>     pCertInfo          uintptr
>>>>>     hCertStore         uintptr
>>>>> }
>>>>>
>>>>> for my case I need only the first 3 fields and I do not have any 
>>>>> problem to get 1 and 3, but I can't remember how to translate the second 
>>>>> field to a slice of bytes.
>>>>> This is how I map the struct from an uintptr and print it to the 
>>>>> console:
>>>>>
>>>>>     certctx = (*CERT_CONTEXT) (unsafe.Pointer(pccert_context))
>>>>>     fmt.Printf("%v\n", certctx)
>>>>>     
>>>>>     >&{1 807520 674 833008 789360}
>>>>>
>>>>> Any advise is warmly welcome.
>>>>>
>>>>> Cheers,
>>>>> Sandro
>>>>>
>>>>

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to