util: parseArgs() treats a `-` inside a short option group as the `--` terminator
Les mainteneurs répondent en général sous 1 jour
Évaluation
- Difficulté
- 2/5
- Temps estimé
- 1-3 heures
- Accessibilité débutants
- 75/100
- Type d'issue
- Bug
- Clarté
- Clairement spécifiée
- Activité
- Active
- Stack technique
- javascript, nodejs
- Domaine
- cli
Piste de recherche
Commence par argsToTokens() dans lib/internal/util/parse_args/parse_args.js, où un groupe d'options courtes comme -a-b est développé puis réinséré dans la liste des arguments. Vérifie comment la boucle ordonne le test arg === '--' par rapport au compteur du groupe, afin qu'un -- synthétisé ne soit pas traité comme le véritable terminateur. Exécute la reproduction de l'issue en mode strict et non strict, ainsi qu'avec tokens: true, et confirme que -a-b produit une erreur d'option inconnue et que l'index de chaque token correspond à celui de son argument source. C'est terminé lorsque les tests parseArgs existants passent et que de nouveaux cas couvrent -a-b et -a-.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Description
Version
v28.0.0-pre (main, d2812af0), also v22.20.0
Platform
Linux 7.0.0-38-generic x86_64
Subsystem
util
What steps will reproduce the bug?
const { parseArgs } = require('node:util');
const options = { a: { type: 'boolean' }, b: { type: 'boolean' } };
// Non-strict, with tokens.
const args = ['-a-b', 'pos'];
const { values, positionals, tokens } = parseArgs({
args, options, strict: false, allowPositionals: true, tokens: true,
});
console.log(values, positionals);
for (const token of tokens) {
console.log(token, '-> args[index] =', args[token.index]);
}
// Strict.
for (const arg of ['-a-b', '-a-']) {
try {
parseArgs({ args: [arg], options });
console.log(arg, 'ok');
} catch (err) {
console.log(arg, err.code, '-', err.message);
}
}
How often does it reproduce? Is there a required condition?
Every time. Needs a - character inside a short option group, for example -a-b or -a-.
What is the expected behavior?
- is not a valid option character, so -a-b should be reported the same way as any other unknown short option in a group (compare -ar with r unknown). In strict mode that is ERR_PARSE_ARGS_UNKNOWN_OPTION. With tokens: true, every token's index should point at the argument it came from, as the docs say: "the source argument for a token is args[token.index]".
What do you see instead?
[Object: null prototype] { a: true } [ '-b', 'pos' ]
{ kind: 'option', name: 'a', rawName: '-a', index: 0, value: undefined, inlineValue: undefined } -> args[index] = -a-b
{ kind: 'option-terminator', index: 0 } -> args[index] = -a-b
{ kind: 'positional', index: 1, value: '-b' } -> args[index] = pos
{ kind: 'positional', index: 2, value: 'pos' } -> args[index] = undefined
-a-b ERR_PARSE_ARGS_UNEXPECTED_POSITIONAL - Unexpected argument '-b'. This command does not take positional arguments
-a- ok
-bbecomes a positional instead of an option.- An
option-terminatortoken appears although the user never passed--. - The positional indexes are shifted by one, so
args[token.index]is the wrong argument orundefined. - In strict mode
-a-breports a misleading unexpected-positional error, and-a-is accepted silently.
Additional information
argsToTokens() in lib/internal/util/parse_args/parse_args.js expands a short option group -a-b into -a, --, -b and pushes them back onto the argument list. The loop then checks arg === '--' before it looks at whether the argument came from a group, so the synthesized -- is handled as the real terminator. The group counter (groupCount) already knows the argument was expanded.
For comparison, getopt(3) reports -a-b as invalid option -- '-'.
I have a small fix with tests and can open a PR.
- Langage dominant
- JavaScript
- Étoiles
- 123k
- Forks
- 39.3k
- Merge moyen
- 4 j 11 h
- PR mergées (30 j)
- 237
Préparer son environnement
- Aucun Dockerfile ni fichier Docker Compose
- Propose un modèle de pull request
- Lire le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Autres issues de nodejs/node
-
New test `parallel/test-fs-readfilesync-pipe-short-reads` fails on Linux/riscv64Peut-être pris @jay23606 l’a pris aujourd’hui. Ouverteriscv64
Difficulté 2/5 1-3 heures Accessibilité débutants 73/100
Les mainteneurs répondent en général sous 1 jour
-
http2: content-encoding is incorrectly listed in kSingleValueHeadersPeut-être pris @inoway46 l’a pris il y a 3 jours. Ouverteconfirmed-bug http2
Difficulté 2/5 1-3 heures Accessibilité débutants 74/100
nodejs/node#67151 · 1 commentaire ·
Les mainteneurs répondent en général sous 1 jour
-
util.parseEnv and --env-file keep a leading UTF-8 BOM in the first keyPeut-être pris @helmipradita l’a pris il y a 5 jours. Ouverte
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
Les mainteneurs répondent en général sous 1 jour
-
node:internal/inspector/network_http: `TypeError: Missing dataLength` in event when response uses `setEncoding()`Peut-être à nouveau libre Une pull request pour cette issue a été fermée sans être fusionnée. Ouverte
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
nodejs/node#66551 · 1 commentaire ·
Les mainteneurs répondent en général sous 1 jour
-
[Docs] `process.loadEnvFile()` does not document behaviour when variables already existPeut-être pris @Sepandard l’a pris il y a 39 jours. Ouvertedoc
Difficulté 1/5 Moins d'une heure Accessibilité débutants 90/100
Les mainteneurs répondent en général sous 1 jour
Toutes les issues de nodejs/node
Issues similaires
-
clientV2: Application Info header separators show as missing-character boxes without a CJK fontOuvertebug new-client
Difficulté 1/5 1-3 heures Accessibilité débutants 88/100
NUWCDIVNPT/stig-manager#2285 ·
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 1/5 Moins d'une heure Accessibilité débutants 88/100
Fei2411/DeepSeek-Bot#922 · 1 réaction ·
-
server errored
Difficulté 2/5 1-3 heures Accessibilité débutants 75/100
OpenTermsArchive/contrib-declarations#4273 ·
Les mainteneurs répondent en général sous 1 jour
-
needs-area-label
Difficulté 2/5 1-3 heures Accessibilité débutants 66/100
Les mainteneurs répondent en général sous 2 jours
-
serienstream.toOuverteN: AdGuard for Windows P2: High T: Annoyance
Difficulté 2/5 1-3 heures Accessibilité débutants 61/100
AdguardTeam/AdguardFilters#246310 ·
Les mainteneurs répondent en général sous 1 jour