Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

May be a bug in tnn_rvm.cpp #240

Closed
ZachL1 opened this issue Mar 17, 2022 · 1 comment
Closed

May be a bug in tnn_rvm.cpp #240

ZachL1 opened this issue Mar 17, 2022 · 1 comment
Assignees
Labels
bug Something isn't working High Priority TNN

Comments

@ZachL1
Copy link

ZachL1 commented Mar 17, 2022

In the TNN inference code of RVM,在第181行的 transform 函数中,定义了一个局部的cv::Mat对象 canvas,并在第191行把它的 data 作为 std::make_shared<tnn::Mat>() 的参数。

canvas 是一个局部对象,但是 src_mat 指向的 tnn::Mat 对象,其中的 data_ 成员指向了 canvas.data。如果 cv::Mat 的底层不是使用智能指针实现(我猜想应该不是),那么当 transform 函数结束,canvas.data 处的内存将被释放,此时 src_mat 指向的对象中的 data_ 成员将指向一块非法内存。

在第201行的 detect 函数中,第209行调用了 transform 函数,并且在 216 行使用了 src_mat ,此时可能将访问非法内存,出现访问冲突的错误(在我的Windows电脑上,它确实出现了)。
不过值得一提的是,如果第 209 行的 transform 函数被编译器优化为 inline function ,使用 src_matcanvas 还未被销毁。我想这可能是为什么在 MacOS 上没有出现错误的原因。

@DefTruth
Copy link
Owner

我先看看,你说的有一定的道理。cv::Mat底层有一个引用计数的机制,但是resize会导致一个新的cv::Mat,它并不是引用传进来的原始Mat; 另外就是,tnn::Mat通过指针赋值的方式,似乎并不是deepcopy,这么说,emmm,rvm的tnn版本里的处理,确实可能有坑... 感谢提醒

以下是tnn::Mat通过指针赋值的代码,no-deepcopy

Mat::Mat(DeviceType device_type, MatType mat_type, DimsVector dims, void* data) {
    dims_ = dims;

    data_alloc_ = nullptr;

    device_type_ = device_type;
    mat_type_    = mat_type;
    data_        = data;
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working High Priority TNN
Projects
None yet
Development

No branches or pull requests

2 participants