boostorg / boostorg/local_function
an example/test uses a dangling reference
- Ngôn ngữ chính
- C++
- Star
- 11
- Fork
- 28
- Chỉ số merge pull request
- Không có pull request nào được merge trong 30 ngày
Mô tả
libs/local_function/test/return_assign.cpp uses a dangling reference:
```c++
#include
#include
#include
#include
//[return_assign
void call1(boost::function f) { BOOST_TEST(f(1) == 5); }
void call0(boost::function f) { BOOST_TEST(f() == 5); }
boost::function linear(const int& slope) {
int BOOST_LOCAL_FUNCTION(const bind& slope,
int x, default 1, int y, default 2) {
return x + slope * y;
} BOOST_LOCAL_FUNCTION_NAME(lin)
boost::function f = lin; // Assign to local variable.
BOOST_TEST(f(1, 2) == 5);
call1(lin); // Pass to other functions.
call0(lin);
return lin; // Return.
}
void call(void) {
boost::function f = linear(2); // create temporary, bind reference to temporary
BOOST_TEST(f(1, 2) == 5); // !!!!!!!!!!!!!!!!!!!!!!!! use the reference
}
//]
int main(void) {
call();
return boost::report_errors();
}
```
changing the target from temporary to local variable can let the test fail:
```c++
#include
#include
#include
#include
//[return_assign
void call1(boost::function f) { BOOST_TEST(f(1) == 5); }
void call0(boost::function f) { BOOST_TEST(f() == 5); }
boost::function linear(const int& slope) {
int BOOST_LOCAL_FUNCTION(const bind & slope,
int x, default 1, int y, default 2) {
return x + slope * y;
} BOOST_LOCAL_FUNCTION_NAME(lin)
boost::function f = lin; // Assign to local variable.
BOOST_TEST(f(1, 2) == 5);
call1(lin); // Pass to other functions.
call0(lin);
return lin; // Return.
}
void call1(void) {
boost::function f = linear(2);
BOOST_TEST(f(1, 2) == 5); // !!!!!!!!!!!!!!!!!!!!!!!! test passed, although dangling reference
}
void call2(void) {
int a = 2;
boost::function f = linear(a);
a = 3;
BOOST_TEST(f(1, 2) == 5); // !!!!!!!!!!!!!!!!!!!!!!!! test failed
}
//]
int main(void) {
call1();
call2();
return boost::report_errors();
}
```
Hướng dẫn đóng góp
Chưa lập chỉ mục được hướng dẫn đóng góp cho kho mã nguồn này
Hướng nghiên cứu
Bắt đầu với libs/local_function/test/return_assign.cpp và chạy test hiện có để so sánh trường hợp đối tượng tạm thời với trường hợp biến cục bộ. Truy vết cách boost::function được trả về giữ lại tham chiếu đã liên kết, sau đó xác định hành vi test an toàn dự kiến; công việc được hoàn thành khi ví dụ không còn dựa vào một dangling reference và trường hợp Lifetime liên quan được bao phủ chính xác.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Đánh giá
- Công nghệ
- cpp
- Lĩnh vực
- testing
- Loại issue
- Lỗi
- Độ khó
- 4/5
- Thời gian dự kiến
- 3-5 ngày
- Mức độ hoạt động
- Đình trệ
- Độ rõ ràng
- Cần làm rõ
- Mức phù hợp với người mới
- 35/100