だいせんじがけだらなよさ

7 min read

こんにちは、無能です。
最近結局Go触るならばCを学んだ方が良いのでは?と思い逆にGo, Rustであまり考えなくても良いメモリ処理周りってどうなっていたっけという過去の挫折から学び始めているのはあるのですがふと、SCPの並列処理Verのmscpのソースコード眺めていて思ったのだが戻り値として-1を返している理由が気になった。

$ grep -r 'return \-1' ./* | sort | uniq
grep: warning: stray \ before -
./libssh/doc/guided_tour.dox:                return -1;
./libssh/doc/guided_tour.dox:            return -1;
./libssh/doc/guided_tour.dox:        return -1;
./libssh/examples/keygen.c:     return -1;
./libssh/examples/knownhosts.c:                return -1;
./libssh/examples/knownhosts.c:            return -1;
./libssh/examples/knownhosts.c:        return -1;
./libssh/examples/libssh_scp.c:                    return -1;
./libssh/examples/libssh_scp.c:                return -1;
./libssh/examples/libssh_scp.c:            return -1;
./libssh/examples/libssh_scp.c:        return -1;
./libssh/examples/libssh_scp.c:    return -1;
./libssh/examples/samplesftp.c:            return -1;
./libssh/examples/samplesftp.c:        return -1;
./libssh/examples/scp_download.c:                         return -1;
./libssh/examples/scp_download.c:                 return -1;
./libssh/examples/scp_download.c:         return -1;
./libssh/examples/scp_download.c:        return -1;
./libssh/examples/ssh_X11_client.c:                     return -1;
./libssh/examples/ssh_X11_client.c:             return -1;
./libssh/examples/ssh_X11_client.c:     return -1;
./libssh/examples/ssh_client.c:            return -1;
./libssh/examples/ssh_client.c:        return -1;
./libssh/examples/ssh_server.c:        return -1;
./libssh/examples/sshd_direct-tcpip.c:        return -1;
./libssh/examples/sshnetcat.c:          return -1;
./libssh/examples/sshnetcat.c:      return -1;
./libssh/examples/sshnetcat.c:    return -1;
./libssh/src/agent.c:      return -1;
./libssh/src/agent.c:    return -1;
./libssh/src/agent.c:  return -1;
./libssh/src/auth.c:            return -1;
./libssh/src/auth.c:        return -1;
./libssh/src/base64.c:                             if(!ptr) return -1; \

ふと思えば、実行結果の戻り値として二桁を見たことが無い気がして
-1を使っている理由が書かれているのがヤフー知恵袋の2008年くらいの回答で見つけたがあまりまともな回答ではなく以下の日立が出しているuCosminexus Interschemaというアプリケーションサーバ、ミドルウェア製品くらいしかみつからなかった。
C言語の出口関数の定義

3 -1 変換に失敗した ユーザ組み込み関数に渡された文字列の文字コード ユーザ組み込み関数に渡された文字列に終端NULLを付加したものです。

で、return -1を最後に与えて戻り値を確認すると、255になる

alleycat:[haturatu]:~/git/cmem$ ./a
格納した文字列 : Hi, My sweet hearts
alleycat:[haturatu]:~/git/cmem$ echo $?
255

Goの場合

これは、Goでos.Exit(-1)を与えても同じだったけれど、なんとも254になったりするパターンがあって何故だろうとなった。 一応、戻り値としては0と1、2、それ以外は全て-1を返して-1で動的にエラーコードを返すことによって他の動作に問題起きないような例外エラーとして扱っているのだろうか?
割とこの手の情報少なくて、Go言語でゴリゴリに先陣切って開発進んでいる技術としたらGo-Ethereumだと思うけれど、これもよく見ると

:~/git/go-ethereum$ grep -r "return \-1"
grep: warning: stray \ before -
crypto/secp256k1/libsecp256k1/src/java/org/bitcoin/Secp256k1Context.java:     if(!enabled) return -1; //sanity check
crypto/secp256k1/libsecp256k1/src/num_gmp_impl.h:        return -1;
crypto/secp256k1/libsecp256k1/src/field_10x26_impl.h:            return -1;
crypto/secp256k1/libsecp256k1/src/ecdsa_impl.h:        return -1;
crypto/secp256k1/libsecp256k1/src/ecdsa_impl.h:        return -1;
crypto/secp256k1/libsecp256k1/src/ecdsa_impl.h:        return -1;
crypto/secp256k1/libsecp256k1/src/ecdsa_impl.h:        return -1;
crypto/secp256k1/libsecp256k1/src/ecdsa_impl.h:        return -1;
crypto/secp256k1/libsecp256k1/src/ecdsa_impl.h:        return -1;
crypto/secp256k1/libsecp256k1/src/ecdsa_impl.h:            return -1;
crypto/secp256k1/libsecp256k1/src/ecdsa_impl.h:        return -1;
crypto/secp256k1/libsecp256k1/src/field_5x52_impl.h:            return -1;
crypto/secp256k1/libsecp256k1/src/gen_context.c:        return -1;
crypto/signify/signify_fuzz.go:         return -1
trie/iterator.go:               return -1
trie/iterator.go:               return -1
event/event.go: return -1
event/feed.go:  return -1
common/prque/lazyqueue.go:      return -1
triedb/pathdb/database_test.go: return -1
cmd/devp2p/nodesetcmd.go:                               return -1, errors.New("-limit requires an argument")
cmd/devp2p/nodesetcmd.go:                               return -1, fmt.Errorf("invalid -limit %q", args[i+1])
cmd/devp2p/nodeset.go:                  return -1
cmd/devp2p/dns_route53.go:                      return -1
accounts/abi/bind/bind.go:                              return -1
core/state/snapshot/iterator_fast.go:           return -1
core/state/snapshot/iterator_fast.go:           return -1
p2p/protocol.go:                        return -1
p2p/enode/node.go:                      return -1

よく見ると、ほとんどはライブラリの中で呼び出しているし膨大なコードの中で上記だけ。公開鍵暗号実装ソースのおそらくどっかから持ってきたソースな気がするから実質的にはGo-Ethreumのコードではない気がする。

もう一つ、昔から開発進んでいたものだとHugoがある。

:~/git/hugo$ grep -r "return \-1"
grep: warning: stray \ before -
compare/compare_strings.go:             return -1
htesting/test_helpers.go:                       return -1
htesting/test_helpers.go:       return -1
hugolib/filesystems/basefs_test.go:             return -1, nil, err
common/hreflect/helpers.go:             return -1
common/herrors/error_locator_test.go:           return -1
common/herrors/error_locator_test.go:           return -1
common/herrors/error_locator_test.go:           return -1
common/herrors/error_locator_test.go:           return -1
common/herrors/error_locator.go:        return -1
common/herrors/error_locator.go:        return -1
common/herrors/error_locator.go:                return -1
common/herrors/file_error.go:                   return -1
common/herrors/file_error.go:           return -1, ""
common/herrors/file_error.go:   return -1, -1
common/hugo/version.go:                 return -1
common/hugo/version.go:                 return -1
common/hugo/version.go:                 return -1
common/hugo/version.go:                 return -1
common/hugo/version.go:                 return -1
common/hugo/version.go:         return -1
common/hugo/version.go: return -1
common/paths/pathparser.go:             return -1
identity/finder.go:     return -1
resources/page/permalinks.go:                                   return -1
resources/page/pages_sort.go:           return -1, -1
resources/page/pages_sort.go:           return -1, -1
resources/page/pages_sort.go:           return -1, -1
resources/page/pages_sort.go:           return -1, -1
resources/page/pages_sort_search.go:    return -1
resources/page/pages_sort_search.go:            return -1
resources/page/pagination.go:           return -1, errors.New("too many arguments, 'pager size' is currently the only option")
resources/page/pagination.go:           return -1, errors.New(("'pager size' must be a positive integer"))
resources/images/image.go:              return -1
tpl/collections/where.go:       return -1, errors.New("unable to convert value to float")
tpl/collections/where.go:       return -1, errors.New("unable to convert value to int")
tpl/transform/transform.go:             return -1
tpl/internal/go_templates/htmltemplate/transition.go:   return -1
tpl/internal/go_templates/htmltemplate/transition.go:                   return -1, errorf(ErrBadHTML, nil, 0, "%q in attribute name: %.32q", s[j:j+1], s)
tpl/internal/go_templates/fmtsort/sort.go:              return -1 // No good answer possible, but don't return 0: they're not equal.
tpl/internal/go_templates/fmtsort/sort.go:                      return -1
tpl/internal/go_templates/fmtsort/sort.go:              return -1, true
tpl/tplimpl/template.go:                                return -1
tpl/tplimpl/template.go:                        return -1
tpl/tplimpl/shortcodes.go:      return -1
parser/pageparser/pagelexer.go:         return -1
parser/pageparser/pagelexer.go:         return -1
parser/pageparser/pagelexer.go:                                 return -1
parser/pageparser/pagelexer.go:         return -1
parser/pageparser/pagelexer.go:         return -1
parser/pageparser/pagelexer.go: return -1

Cで書かれているbashの場合を見てみる

そして、bashがわかりやすい0, 1等以外の戻り値を返すのでbashのソースを見てみると

alleycat:[haturatu]:~/git/bash$ echo $?
130
alleycat:[haturatu]:~/git/bash$ a
bash: a: コマンドが見つかりません
alleycat:[haturatu]:~/git/bash$ echo $?
127

これなら、return 130とかありそうだけど

alleycat:[haturatu]:~/git/bash$ grep -r "return [0-9]" | awk '{print $2" " $3}' | sort | uniq | grep ^r
grep: .git/objects/pack/pack-715759b749131276aa4809bba44f79c13feb23ec.pack: binary file matches
return 0
return 0,
return 0.
return 0.0;
return 0;
return 0L;
return 1
return 1,
return 1-no_line_editing;
return 1.
return 10;
return 11;
return 12;
return 13;
return 14;
return 16
return 1;
return 2
return 2;
return 2;;
return 3
return 3;
return 4
return 42
return 4;
return 5
return 5;
return 6;
return 7
return 7;
return 8;
return 99999;
return 9;
alleycat:[haturatu]:~/git/bash$ grep -r "return -[0-9]" | awk '{print $2" " $3}' | sort | uniq | grep ^r
return -1
return -1.
return -1/EINVAL
return -1;
return -25
return -2;

なかった。厳密に言えばgrep -r "return " | grep -oP "return.*" | sort | uniq | grep "[0-9]" の方がもっと抽出出来るだろうけど長すぎたので上記で勘弁してほしい。
となるとやはり動的にエラーコードを生成しているようにしか思えないな。

こんなしょうもない事調べているのは、デバッグ周りが地獄化しそうなので事前にリサーチしておこうということと、Goが簡単になった言語とは言えどC言語からは逃げられないようだ。

だいせんじがけだらなよさ

ひさしぶりに、加藤和彦のアルバムを聴いていたらだいせんじがけだらなよさという曲名が気になって調べたらカルメンマキのカバーらしい。
そして元ネタは寺山修司らしい。
『さよならだけが人生ならば』 と 『だいせんじがけだらなよさ』 詩:寺山修司 歌:カルメン・マキ 1969年

さよならだけが人生ならば また来る春は何だろう
はるかなはるかな地の果てに咲いている野の百合何だろう
さよならだけが人生ならば めぐり会う日は何だろう
やさしいやさしい夕焼と ふたりの愛は何だろう
さよならだけが人生ならば 建てた我が家なんだろう
さみしいさみしい平原に ともす灯りは何だろう
さよならだけが人生ならば 人生なんか いりません。
寺山修司 『さよならだけが人生ならば』

さみしくなると言ってみる ひとりぼっちのおまじない
わかれた人の思い出を わすれるためのおまじない
だいせんじがけだらなよさ だいせんじがけだらなよさ
さかさに読むとあの人が おしえてくれた歌になる
さよならだけがじんせいだ
さよならだけがじんせいだ
寺山修司 『だいせんじがけだらなよさ』

このちっぽけな感じがより哀愁漂いますね。
元いた加藤和彦のザ・フォーククルセイダーズはこの日本文学があったからこそなのかも、しれませんね。

PGP --- Contact --- Machines