首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >LabVIEW在Rust释放CString时崩溃

问LabVIEW在Rust释放CString时崩溃
EN

Stack Overflow用户
提问于 2022-11-15 07:29:21
回答 1查看 40关注 0票数 0

我正在玩LabVIEW 2019 64位和Rust 1.64,但是LabVIEW在一个非常简单的代码上崩溃了。

我要做的是将一个Hello from Rust字符串传递给LabVIEW,然后在Rust中释放它。

代码语言:javascript
复制
use libc::c_char;
use std::ffi::CString;

#[no_mangle]
pub extern "cdecl" fn hello() -> *const c_char {
    CString::new("Hello from Rust")
        .expect("failed to create c string")
        .into_raw()
}

#[no_mangle]
pub extern "cdecl" fn bye(s: *mut c_char) {
    unsafe {drop(CString::from_raw(s));}
}

​

​

LabView可以显示正确的字符串,但在调用bye(s)时会冻结,然后崩溃。

​

​

但是,如果手动禁用bye(s)函数调用,则一切正常,但这违反了Rust建议:

代码语言:javascript
复制
alloc::ffi::c_str::CString
pub fn into_raw(self) -> *mut c_char
Consumes the CString and transfers ownership of the string to a C caller.

The pointer which this function returns must be returned to Rust and reconstituted using CString::from_raw to be properly deallocated. Specifically, one should not use the standard C free() function to deallocate this string.

Failure to call CString::from_raw will lead to a memory leak.

执行这个简单任务的正确方法是什么?

多亏了@srm,LabVIEW现在工作得很好。以下是工作框图:

​

​

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-11-16 09:25:08

您遇到的问题是,LabVIEW正在接收C字符串并将其转换为L字符串(非常不同的内存签名)。LabVIEW中的粉红线是指向charN的指针,其中N是字符串+4字节的长度。数组的前4个字节是字符串的长度。它类似于Pascal字符串,但具有4字节长度,而不是1字节长度。LV使用的数据结构与您传递给bye()的数据结构不同。你从来没有得到你的手的原始指针。与您当前的调用库设置。所以让我们改变你的设置。

背景:记住,从本质上讲,LabVIEW具有与Rust相同的内存管理规则--即LabVIEW知道按照固定的时间表分配和释放数据,并且希望控制内存管理。LabVIEW没有垃圾收集器。它分析数据流,并决定在哪里决定性地发布数据。但它也不认为数据超出了范围-- LabVIEW VIs没有“作用域”。理想情况下,对于LabVIEW来说,这个粉红色的电线将继续分配给VI的下一个调用,前提是下一个调用也需要相同的字符串缓冲区。

解决方案:如果您想让Rust分配字符串,您需要告诉LabVIEW返回的只是一个地址。所以告诉LabVIEW返回类型是指针大小的整数,而不是字符串.还返回字符串的长度。

在关系图上,调用hello()函数返回整数和字符串的长度。然后有另一个调用库函数来调用内置函数MoveBlock。https://www.ni.com/docs/en-US/bundle/labview/page/lvexcode/moveblock.html将库名设置为"LabVIEW“--没有文件扩展名。然后将第一个参数设为指针大小的整数。第二个参数是一个由字节组成的LabVIEW数组,您将其称为Initialize,并将其插入到N个字符中,其中N是字符串的长度--配置call Library节点来按指针执行数组。第三个参数是字符串的长度。

MoveBlock将把由Rust分配的C字符串中的字节复制到LabVIEW分配的L字符串中。然后,可以将指针大小的整数传递给bye()函数。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74441974

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档