boostorg / boostorg/program_options

Confusing behavior when order of long/short options are swapped

Open
#62 0 comments 0 reactions 0 assignees View on GitHub
Dominant language
C++
Stars
136
Forks
117
PR merge metrics
No merged PRs in 30d

Description

Adding an option like this:

```cpp
desc.add_options()( "h,help", "Print help and exit" );
```

In a simple test program and then trying to use `--help` results in a confusing error:

```
$ ./prog --help
libc++abi.dylib: terminating with uncaught exception of type boost::exception_detail::clone_impl >: unrecognised option '--help'
```

The [documentation](https://www.boost.org/doc/libs/1_66_0/doc/html/boost/program_options/option_description.html) for `option_description::option_description(const char*, const value_semantic*)` says:

> The 'name' parameter is interpreted by the following rules:
> if there's no "," character in 'name', it specifies long name
> otherwise, the part before "," specifies long name and the part after -- short name.

However, it is easy for new users of this library to think that swapping them is OK.

The reason for this limitation isn't clear to me -- presumably, if one is "long" and the other "short", providing them in either order should be OK, and a simple test can tell which is which. In either case, the error message on misuse is needlessly cryptic and could probably be turned into an error thrown from `option_description::option_description`. This seems reasonable, since using `"h,help"` as the option name results in bad behavior regardless: the resulting executable has options `--h` and `-h`.

Contributor guide

No contributing guide indexed for this repository

Research direction

Start with option_description::option_description(const char*, const value_semantic*) and the documented name-format rules. Reproduce the behavior in the simple test program using "h,help", then determine whether swapped names should be accepted or rejected explicitly. Done means the misuse no longer produces the confusing runtime behavior and the intended behavior is covered by a test.

Written by the indexing model from the issue text.

Assessment

Tech stack
cpp
Domain
cli
Issue type
Bug
Difficulty
5/5
Estimated time
Over a week
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.