boostorg / boostorg/program_options

basic_command_line_parser::options() may store address of temporary

Đang mở
#73 0 bình luận 0 reaction 0 người được giao Xem trên GitHub
Ngôn ngữ chính
C++
Star
136
Fork
117
Chỉ số merge pull request
Không có pull request nào được merge trong 30 ngày

Mô tả

Hi,

I've stambled accross a bug in my application about unrecognized options. After several minutes and checks I've realized it comes from Boost Program_Options because the `basic_command_line_parser::options` function store the address of a const-reference passed as argument. And since temporaries can bind to const-reference the library did use a dangling pointer.

It is not mentioned in the [documentation](https://www.boost.org/doc/libs/1_69_0/doc/html/boost/program_options/basic_command_line_parser.html) that user must specify a valid reference.

I propose that options() and positional() make a copy (as it's backward compatible) or to take a non-const reference as it explains correctly the ownership to the caller (but not backward compatible)

Example of code that may reproduce the bug:

```cpp
#include

namespace po = boost::program_options;

po::options_description create()
{
po::options_description desc;

desc.add_options()
("verbose", po::bool_switch());

return desc;
}

int main(int argc, char** argv)
{
po::variables_map vm;
po::store(po::command_line_parser(argc, argv).options(create()).run(), vm);
po::notify(vm);
}
```

Offending code https://github.com/boostorg/program_options/blob/develop/include/boost/program_options/detail/parsers.hpp#L37

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 include/boost/program_options/detail/parsers.hpp tại dòng được trích dẫn và chạy ví dụ được cung cấp, trong đó truyền một đối tượng tạm thời từ create() đến options(). So sánh các cách tiếp cận được đề xuất là sao chép và tham chiếu không const cho options() và positional(), sau đó xác minh rằng hành vi được chọn không còn cho phép một dangling reference hoặc ghi rõ ràng về thời gian tồn tại bắt buộ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
cli
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
Khá rõ ràng
Mức phù hợp với người mới
48/100

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.