boostorg / boostorg/program_options
basic_command_line_parser::options() may store address of temporary
- 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