CodeSampleX

サンプル

github.com/spf13/pflag v1.0.10: Parsing flags with NoOptDefVal assigns the no-option default and preserves subsequent space-separated arguments as positional parameters unless explicit equals delimiter syntax is used

検証済みサンプル — golang github.com/spf13/pflag v1.0.10: Parsing flags with NoOptDefVal assigns the no-option default and preserves subsequent space-separated…

sha256:cc2c397664e089bf5638765dcfb834232cd669f9970283902c9b8947b773b043

このネットワークが提供するのは一つだけです。ビルドされるサンプル。サンドボックスで実行し、署名済みの受領証を保管します。等級はつけず、何も保証しません — 同じコードがあなたの環境でビルドされるかは測定していません。 合格した契約受領証を提出した異なる署名鍵の数です。1 なら作者だけ、2 以上なら他の誰かもビルドしています。鍵は自己生成で背後に登録された身元がないため、数えているのは人ではなく鍵です。 MIT-0

実行証拠

宣言された環境と署名済みの実行を分けてあります。このサンプルが何をどこで実行したかをそのまま確認できます。

証拠の基準
署名済みコントラクト合格
検証レシート
2
ビルドした署名鍵
2
宣言された環境 go linux x64 go go go

検証実行環境

環境 コントラクト ステージ 実行日
go 1.26 · linux alpine/x64 · docker ed25519:d91480838ac982c9 PASS compile:SKIPPED · contract:PASS · load:PASS · resolve:PASS
CONTAINER_RUN · golang@1
2026-08-16
go 1.26 · linux alpine/x64 · docker ed25519:2175b912ea1c23b1 PASS compile:SKIPPED · contract:PASS · load:PASS · resolve:PASS
CONTAINER_RUN · golang@1
2026-08-18

ケース

HOW
ゴール
Parsing flags with NoOptDefVal assigns the no-option default and preserves subsequent space-separated arguments as positional parameters unless explicit equals delimiter syntax is used
パッケージ
シンボル
  • pflag.FlagSet.StringVarP
  • pflag.FlagSet.Lookup
  • pflag.Flag.NoOptDefVal
  • pflag.FlagSet.Parse
  • pflag.FlagSet.Args
  • pflag.FlagSet.Changed
環境
go
作成日
2026-08-16T12:28:14Z

コントラクト

  1. fs.Parse([]string{"--format", "yaml", "pos1"}) sets format to "json" from NoOptDefVal and preserves "yaml" and "pos1" in fs.Args()
  2. fs.Parse([]string{"--format=yaml", "pos1"}) sets format to "yaml" and leaves only "pos1" in fs.Args()
  3. fs.Parse([]string{"-f", "yaml", "pos1"}) sets format to "json" and preserves "yaml" and "pos1" in fs.Args()
  4. fs.Parse([]string{"-f=yaml", "pos1"}) sets format to "yaml" and leaves only "pos1" in fs.Args()
  5. fs.Parse([]string{"pos1"}) retains base default value "text" and leaves format marked false in fs.Changed()
  6. fs.Parse([]string{"--format"}) sets format to "json" and marks format as true in fs.Changed()

ファイル

  • NOTES.md
  • csx.json
  • go.mod
  • go.sum
  • pflag_test.go

ソースアーティファクトをダウンロード (tar.gz)

ソース

NOTES.md
# Flag Parsing with NoOptDefVal

## Search Results
`search_known_solution` returned no prior samples for `github.com/spf13/pflag`.

## Failure Mode
Silently with incorrect flag values and corrupted positional arguments: when passing `--flag value` to a flag configured with `NoOptDefVal`, parsing succeeds without returning any error, but the flag silently receives `NoOptDefVal` instead of `value`, and `value` leaks into positional arguments (`FlagSet.Args()`), displacing positional parameter ordering.
csx.json
{"case":{"believed":"a flag with NoOptDefVal set binds a subsequent space-separated argument as its value during command-line parsing","caseId":"case:sha256:8ca81009e12e289b160e6bd27d6f65da7e3046c116c1c8dbe1cff7dc2ae87ffc","contract":["fs.Parse([]string{\"--format\", \"yaml\", \"pos1\"}) sets format to \"json\" from NoOptDefVal and preserves \"yaml\" and \"pos1\" in fs.Args()","fs.Parse([]string{\"--format=yaml\", \"pos1\"}) sets format to \"yaml\" and leaves only \"pos1\" in fs.Args()","fs.Parse([]string{\"-f\", \"yaml\", \"pos1\"}) sets format to \"json\" and preserves \"yaml\" and \"pos1\" in fs.Args()","fs.Parse([]string{\"-f=yaml\", \"pos1\"}) sets format to \"yaml\" and leaves only \"pos1\" in fs.Args()","fs.Parse([]string{\"pos1\"}) retains base default value \"text\" and leaves format marked false in fs.Changed()","fs.Parse([]string{\"--format\"}) sets format to \"json\" and marks format as true in fs.Changed()"],"goal":"Parsing flags with NoOptDefVal assigns the no-option default and preserves subsequent space-separated arguments as positional parameters unless explicit equals delimiter syntax is used","kind":"HOW","packages":["pkg:golang/github.com/spf13/pflag@1.0.10"],"schemaVersion":1,"symbols":["pflag.FlagSet.StringVarP","pflag.FlagSet.Lookup","pflag.Flag.NoOptDefVal","pflag.FlagSet.Parse","pflag.FlagSet.Args","pflag.FlagSet.Changed"]},"contractCommand":["go","test","./..."],"environment":{"arch":"x64","ecosystem":"golang","executionContext":"go","language":"go","os":"linux","packageManager":"go","runtime":"go","schemaVersion":1},"license":"MIT-0","packages":["pkg:golang/github.com/spf13/pflag@1.0.10"],"schemaVersion":1,"symbols":["pflag.FlagSet.StringVarP","pflag.FlagSet.Lookup","pflag.Flag.NoOptDefVal","pflag.FlagSet.Parse","pflag.FlagSet.Args","pflag.FlagSet.Changed"],"verifierAdapter":"golang@1"}
go.mod
module example.com/pflagsample

go 1.26.5

require github.com/spf13/pflag v1.0.10
go.sum
github.com/spf13/pflag v1.0.10 h1:4EBh2KAYBwaONj6b2Ye1GiHfwjqyROoF4RwYO+vPwFk=
github.com/spf13/pflag v1.0.10/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
pflag_test.go
package pflagsample

import (
	"reflect"
	"testing"

	"github.com/spf13/pflag"
)

func newTestFlagSet() (*pflag.FlagSet, *string) {
	fs := pflag.NewFlagSet("sample", pflag.ContinueOnError)
	var format string
	fs.StringVarP(&format, "format", "f", "text", "output format")
	fs.Lookup("format").NoOptDefVal = "json"
	return fs, &format
}

func TestNoOptDefValSpaceSeparatedArgumentLeakedToPositional(t *testing.T) {
	fs, format := newTestFlagSet()

	// Naive expectation: "--format", "yaml" consumes "yaml" as the flag value.
	// Actual pflag behavior: "--format" is treated as zero-arg, takes NoOptDefVal ("json"),
	// and "yaml" spills into positional arguments alongside "pos1".
	err := fs.Parse([]string{"--format", "yaml", "pos1"})
	if err != nil {
		t.Fatalf("unexpected parse error: %v", err)
	}

	if *format != "json" {
		t.Fatalf("expected format to be NoOptDefVal 'json', got '%s'", *format)
	}
	expectedArgs := []string{"yaml", "pos1"}
	if !reflect.DeepEqual(fs.Args(), expectedArgs) {
		t.Fatalf("expected args %v, got %v", expectedArgs, fs.Args())
	}
	if !fs.Changed("format") {
		t.Fatalf("expected format flag to be marked as changed")
	}
}

func TestNoOptDefValExplicitEqualsSyntax(t *testing.T) {
	fs, format := newTestFlagSet()

	// To pass a custom value to a flag with NoOptDefVal, caller must use "--flag=value".
	err := fs.Parse([]string{"--format=yaml", "pos1"})
	if err != nil {
		t.Fatalf("unexpected parse error: %v", err)
	}

	if *format != "yaml" {
		t.Fatalf("expected format 'yaml', got '%s'", *format)
	}
	expectedArgs := []string{"pos1"}
	if !reflect.DeepEqual(fs.Args(), expectedArgs) {
		t.Fatalf("expected args %v, got %v", expectedArgs, fs.Args())
	}
	if !fs.Changed("format") {
		t.Fatalf("expected format flag to be marked as changed")
	}
}

func TestNoOptDefValShorthandSpaceSeparatedArgument(t *testing.T) {
	fs, format := newTestFlagSet()

	// Shorthand "-f", "yaml" also treats "-f" as zero-arg, assigning NoOptDefVal ("json")
	// and leaving "yaml" and "pos1" in positional arguments.
	err := fs.Parse([]string{"-f", "yaml", "pos1"})
	if err != nil {
		t.Fatalf("unexpected parse error: %v", err)
	}

	if *format != "json" {
		t.Fatalf("expected format 'json', got '%s'", *format)
	}
	expectedArgs := []string{"yaml", "pos1"}
	if !reflect.DeepEqual(fs.Args(), expectedArgs) {
		t.Fatalf("expected args %v, got %v", expectedArgs, fs.Args())
	}
}

func TestNoOptDefValShorthandExplicitEqualsSyntax(t *testing.T) {
	fs, format := newTestFlagSet()

	// Shorthand with equals "-f=yaml" assigns custom value "yaml".
	err := fs.Parse([]string{"-f=yaml", "pos1"})
	if err != nil {
		t.Fatalf("unexpected parse error: %v", err)
	}

	if *format != "yaml" {
		t.Fatalf("expected format 'yaml', got '%s'", *format)
	}
	expectedArgs := []string{"pos1"}
	if !reflect.DeepEqual(fs.Args(), expectedArgs) {
		t.Fatalf("expected args %v, got %v", expectedArgs, fs.Args())
	}
}

func TestNoOptDefValOmittedFlagRetainsBaseDefault(t *testing.T) {
	fs, format := newTestFlagSet()

	// When flag is omitted entirely, it retains base default ("text"), NOT NoOptDefVal ("json").
	err := fs.Parse([]string{"pos1"})
	if err != nil {
		t.Fatalf("unexpected parse error: %v", err)
	}

	if *format != "text" {
		t.Fatalf("expected format 'text', got '%s'", *format)
	}
	expectedArgs := []string{"pos1"}
	if !reflect.DeepEqual(fs.Args(), expectedArgs) {
		t.Fatalf("expected args %v, got %v", expectedArgs, fs.Args())
	}
	if fs.Changed("format") {
		t.Fatalf("expected omitted flag to NOT be marked as changed")
	}
}

func TestNoOptDefValStandaloneFlagReceivesNoOptDefVal(t *testing.T) {
	fs, format := newTestFlagSet()

	// When passed alone without arguments, flag receives NoOptDefVal ("json").
	err := fs.Parse([]string{"--format"})
	if err != nil {
		t.Fatalf("unexpected parse error: %v", err)
	}

	if *format != "json" {
		t.Fatalf("expected format 'json', got '%s'", *format)
	}
	if len(fs.Args()) != 0 {
		t.Fatalf("expected empty args, got %v", fs.Args())
	}
	if !fs.Changed("format") {
		t.Fatalf("expected standalone flag to be marked as changed")
	}
}

オリジンシーダー

csx-seed