ときどきの雑記帖 RE* (新南口)
Twilight Zone
ノイエ銀英伝
策謀 第一章観てきた。 前回を切りのいいところまでやってたら 「きつかった」よなあ と感じる内容だった(謎)
ガイエスブルク要塞のアレとかアレとか ミュラーが重傷を負う経緯とかはまあ。
紀伊國屋書店
ポイントカードがなくなっていた (正確にはクレジットカードみたいなプラスチック製カードの 新規発行がなくなりスマホのアプリになった)。
オライリーカレンダー2023
出てた。 さて今年はどの本を買ってもらうことにしようか。
Cobra Maneuver
F/A-18でもコブラ機動ができたとかいう話を目にして 本当かいなと思っていたところに HNでもコブラ機動の話題が出ているのを見かけた (西亭新九郎)。
うぃきぺのページを見ると
The cobra maneuver came to public attention when Soviet test pilot Viktor Pugachev performed it at the Le Bourget Paris air show in 1989 using a Sukhoi Su-27.[3]
Decades prior to Pugachev showing off his cobra, during the early 1960s, the maneuver had been performed by Swedish pilots flying the Saab 35 fighter jet.[15]
え、ドラケン?!
というにも驚いたけど
List of cobra capable aircraft
結構あるんだねえ。ホーネットは見当たらないけど。
Norvig’s Law
なんてのがあったらしい(知らなかった)。
Any technology that surpasses 50% penetration will never double again (in any number of months).
なるほど。
パニーニ?
Panini is a code generation framework for C++ written as a header-only C++17 library : programming GitHub - MrHands/Panini: Code generation library for C++ written in C++17
Panini is a header-only library for generating C++ code written in C++17.
Panini allows you to write small executables for code-generation that you can step through with a debugger while your code is being output. Because the code generation is itself written in C++, you can call the same functions and use the same tools as the rest of your codebase.
rms
- c-intro-and-ref.git - GNU C Language Intro and Reference
- c-intro-and-ref.git - GNU C Language Intro and Reference
ふと気になって バッファオーバーラン とか脆弱性がらみの話に触れているのか気になって ざっと検索してみたがどうも書いていないっぽい?
算術演算のオーバーフローの話は出てくるけど プログラムの脆弱性までは話を広げていないっぽい。
c.texi
@node Arrays of Variable Length
@section Arrays of Variable Length
@cindex array of variable length
@cindex variable-length arrays
In GNU C, you can declare variable-length arrays like any other
arrays, but with a length that is not a constant expression. The
storage is allocated at the point of declaration and deallocated when
the block scope containing the declaration exits. For example:
@example
#include <stdio.h> /* @r{Defines @code{FILE}.} */
#include <string.h> /* @r{Declares @code{str}.} */
FILE *
concat_fopen (char *s1, char *s2, char *mode)
@{
char str[strlen (s1) + strlen (s2) + 1];
strcpy (str, s1);
strcat (str, s2);
return fopen (str, mode);
@}
@end example
そしてsrrl{cpy,cat}やらは使うはずもないわけで (このコード例ではそれ以前の部分を気にすべきだけど)。
そしてこんな話題が。
ざっと読んでみたけど まあそうだよね という感じ?
Is it time to retire C and C++ for Rust in new programs? • The Register
AUGMENTED REGULAR EXPRESSION
シェルスクリプト (bash, ksh, zsh) で正規表現を使う方法のまとめ - Qiita
補足 上記の xgrep は XML ファイルを検索するコマンドの方ではありません。「augmented regular expression」と呼ばれる 正規表現を使用する grep コマンドのようです。AST - AT&T Software Technology に含まれる grep.c を xgrep コマンドの 名前で起動したものではないかと思っています。ソースコードの中には「Augmented regular expression」の他「Approximate regular expressions」という正規表現の名前を見つけたのですが、この 2 つってどのような正規表現なのでしょうか?
というのを見かけたので(ry
リポジトリで REG_AUGMENTED を検索するといくつか見つかって、 たとえば
Extensions to the standard terminology are derived from the AT&T RE implementation, unified under <regex.h> with these modes:
MODE FLAGS ---- ----- BRE 0 basic RE ERE REG_EXTENDED egrep RE with perl (...) extensions ARE REG_AUGMENTED ERE with ! negation, <> word boundaries SRE REG_SHELL sh patterns KRE REG_SHELL|REG_AUGMENTED ksh93 patterns: ! @ ( | & ) { }
というのがあるんだけど もっと詳しいことを知りたいということなのかな。
あるいは
POSIX regex snarfed from Doug McIlroy’s C++. Converted to C by Glenn Fowler. *’d features have been added to Doug’s original code. testre should compile with other regex implementations, but you may need to run with -c to catch non-terminating loops and memory faults.
FEATURE BRE ERE ARE ------- --- --- --- negation NO expr \! expr ! conjunction NO expr \& expr expr & expr NULL subgroups YES NO YES word boundaries* \< expr \> \< expr \> < expr > minimal match* NO REG_MINIMAL REG_MINIMAL shell patterns* REG_SHELL NO NO ksh patterns* NO NO REG_SHELL
これとか。と言っても「negation」とか「conjunction」 とか書かれても具体的な動作はよくわからんか。
ちなみにAugmented regular expressionでググると 50ページくらいある論文が引っかかるんだけど 今回のこれとは関係なさそう (元気が足りないので読んでない)。
- CiteSeerX - Augmented regular expressions: a formalism to describe, recognize, and learn a class of context-sensitive languages
- Augmented regular expressions: a formalism to describe, recognize, and learn a class of context-sensitive languages | Semantic Scholar
- (PDF) Augmented regular expressions: a formalism to describe, recognize, and learn a class of context-sensitive languages | Rene Alquezar - Academia.edu
(中身はどれも同じ?)
approximate regular expressions の方は ast/grep.c at 2016-01-10-beta ・ att/ast ・ GitHub に
"[+agrep?Approximate regular expressions (not implemented.)]"
とあるので 実体としては存在していないような。 こちらもググるといくつか見つかるけど これとは無関係かつ なんらかの合意が取れた「仕様」もなさそう。
GitHub - laurikari/tre: The approximate regex matching library and agrep command line tool.
ところでリポジトリにはTclのregexもあって、 なんでここにと思ったら
This directory contains files copied from the Tcl distribution. There is no original code here.
などと書かれていた。
FORTRAN Compiler on IBM 704
ジャンプテーブル
一連の記事の最初の方で、
MS232 LXD ARGCTR,4 WAS THIS AN ARITH FUNCTION STATEMENT 4F13600
TXL STATEC,4,0 4F13601
CAL FSTYPE YES, UPDATE FUNCTION TYPE AND 4F13602
ADD L(1) COMPLETE FORSUB ENTRY BY ASSIGNING 4F13603
LXD BK,1 TYPE NUMBER. 4F13604
STA FORSUB-1,1 X 4F13605
ORS ARERAS ALSO SAVE FOR LATER REFERENCE. 4F13606
TRA STATEC 4F13607
TRA MS230 ENDMK 4F13608
TRA MS260 ( 4F13609
TRA MS210 , 4F13610
TRA MS220 ) 4F13611
MSERR= TSX DIAG,4 = 4F13612
TRA MS250 - 4F13613
TRA MS250 / 4F13614
TRA MS200 , 4F13615
TRA MS250 + 4F13616
MS240 ALS 30 * SAVE * 4F13617
TRBLKA BSS 0 4F13618
や
MS260 ALS 30 ( TO SYMBOL WORD 4F13630
SLW E+2 X 4F13631
TRA LATXL GO PERFORM LEVEL ANALYSIS FOR ( 4F13632
TRA MS300 ENDMK 4F13633
TRA MS320 ( 4F13634
TRA MS300 , 4F13635
TRA MS300 ) 4F13636
TRA MS310 = 4F13637
TRA MS300 - 4F13638
TRA MS300 / 4F13639
TSX DIAG,4 . 4F13640
TRA MS300 + 4F13641
MS300 PXD ,0 * CLEAR 4F13642
TRBLKB BSS 0 BASE ADDRESS FOR TAGGED TRANSFER. 4F13643
のようなTRA XXXX
命令の連続がわからんという話を書いているのだけど
ようやく謎が解けた😄
「天の声」が言ったようにこれはジャンプテーブルで合っていたのだけど、 だとしても、テーブルの先頭(と思われる個所)に ラベルがついていないのに疑問を持っていたのね。
(今回ようやく気がついた)ポイントはテーブルの先頭が基準なのではなく、 テーブルの末尾が基準だったということ。 上のコードでいえばMS240やMS300が基準になっていて、 そこから上(番地の若い方)にテーブルが伸びている。 従ってテーブルの先頭にはラベルがない。
上記のジャンプテーブルのどこを使うかを特定するために もうひとつCTESTというテーブルを使っている。 CTESTはこういうテーブルで
REM COMMON/2-CONSTANTS USED BY SECTION ONE= 4F10306
REM 4F10307
TEN OCT 12 (1010) - CTEST-1I 4F10308
ENDMK OCT 77 111111 - CTEST-I0 4F10309
OPEN OCT 74 ( - CTEST-9 4F10310
COMMA OCT 73 , - CTEST-8 4F10311
CLOS OCT 34 ) - CTEST-7 4F10312
EQUAL OCT 13 = - CTEST-6 4F10313
11Z OCT 40 - - CTEST-5 4F10314
SLASH OCT 61 / - CTEST-4 4F10315
POINT OCT 33 . - CTEST-3 4F10316
12Z OCT 20 + - CTEST-2 4F10317
STAR OCT 54 * - CTEST-1 4F10318
CTEST BSS 0 ADDRESS USED FOR INDEXING ABOVE. 4F10319
やっぱり最後尾にラベルがついている。 そしてこう参照している
MS050 LXA L(10),4 PREPARE TO TEST FOR PUNCTUATION. 4F13495
MS051 CAS CTEST,4 4F13496
TRA MS052 X 4F13497
TRA MS090 CHAR IS SOME PUNCTUATION. 4F13498
MS052 TIX MS051,4,1 X 4F13499
MS060 ALS 36,2 POSITION CHAR FOR BUILDING SYMBOL. 4F13500
ORS G ADD CHAR TO THOSE IN G. 4F13501
TXI MS061,2,6 UPDATE POSITIONING TAG. 4F13502
MS061 TSX C0190,4 GET NEXT CHAR. 4F13503
MS070 LXA L(10),4 PREPARE TO TEST FOR PUNCTUATION. 4F13504
MS071 CAS CTEST,4 X 4F13505
TRA MS072 X 4F13506
TRA MS091 CHAR IS SOME PUNCTUATION. 4F13507
MS072 TIX MS071,4,1 X 4F13508
この中の
MS051 CAS CTEST,4 4F13496
TRA MS052 X 4F13497
TRA MS090 CHAR IS SOME PUNCTUATION. 4F13498
MS052 TIX MS051,4,1 X 4F13499
や
MS071 CAS CTEST,4 X 4F13505
TRA MS072 X 4F13506
TRA MS091 CHAR IS SOME PUNCTUATION. 4F13507
MS072 TIX MS071,4,1 X 4F13508
がテーブルから目的のエントリを探している部分。
TIX
という命令は
http://bitsavers.org/pdf/mit/computer_center/Coding_for_the_MIT-IBM_704_Computer_Oct57.pdf
のp.46にあるように
Transfer on Index
TIX A,K,NThe action of this instruction depends upon C(IRK). If C(IRK)>N, then it decrements IRK by N and transfers control to A. Symbolically; if C(IRK) >N, then C(IRK)-N → C(IRK) and A·→ C(ILC). However, if C(IRK)<=N, it does not change C(IRK) and it does not transfer control; it goes on to the next instruction in sequence without changing anything
指定されたインデックスレジスターの値によって その値を変えた上で指定アドレスにジャンプしたり次の命令に移ったり。
p.47にはこんな例が載っている。
LXA COUNT,1
LOOP LDQ VECTA+3,1
FMP VECTB+3,1
FAD ANSWER
STO ANSWER
TIX LOOP,1,1
HPR
COUNT PZE 3
ANSWER
前述のMS050を含むコードを もう少し範囲を広げてみると
MS050 LXA L(10),4 PREPARE TO TEST FOR PUNCTUATION. 4F13495
MS051 CAS CTEST,4 4F13496
TRA MS052 X 4F13497
TRA MS090 CHAR IS SOME PUNCTUATION. 4F13498
MS052 TIX MS051,4,1 X 4F13499
MS060 ALS 36,2 POSITION CHAR FOR BUILDING SYMBOL. 4F13500
ORS G ADD CHAR TO THOSE IN G. 4F13501
TXI MS061,2,6 UPDATE POSITIONING TAG. 4F13502
MS061 TSX C0190,4 GET NEXT CHAR. 4F13503
MS070 LXA L(10),4 PREPARE TO TEST FOR PUNCTUATION. 4F13504
MS071 CAS CTEST,4 X 4F13505
TRA MS072 X 4F13506
TRA MS091 CHAR IS SOME PUNCTUATION. 4F13507
MS072 TIX MS071,4,1 X 4F13508
TXL MS060,2,18 IF THIS IS CHAR I, 2 /R 3 GO BUILD G. 4F13509
CAS L(F) IS THIS AN F ENDING FUNCTION NAME. 4F13510
TRA MS073 X 4F13511
TRA MS080 MAYBE, GO LOOK AT NEXT CHAR. 4F13512
MS073 TXL MS060,2,36 TEST FOR UNDER 7 CHARS. 4F13513
MS074 TSX DIAG,4 BUILD G, 7TH CHAR IS ERROR. 4F13514
MS080 TSX C0190,4 GET NEXT CHAR. 4F13515
CAS OPEN TEST FOR (. 4F13516
TRA MS081 X 4F13517
TRA MS092 YES, THIS IS A FUNCTION NAME. 4F13518
MS081 STO FIRSTC NO, SAVE CURRENT CHAR. 4F13519
CAL L(F) ADD F TO CONTENTS OF G, 4F13520
ALS 36,2 X 4F13521
ORS G X 4F13522
TXH MS074,2,36 TEST FOR 7TH CHAR, YES IS ERROR, 4F13523
CLA FIRSTC RESTORE CURRENT CHAR. 4F13524
TXI MS070,2,6 UPDATE POSITIONING TAG, 4F13525
MS090 STZ CHSAVE CLEAR 4F13526
TRA TRBLKA,4 4F13527
MS091 SLW CHSAVE OP IS IN NEXT ELEMENT, SAVE, 4F13528
CAL BLANK ADD BLANK TO CHARS IN G. 4F13529
ALS 36,2 X 4F13530
ORS G X 4F13531
LDQ G MOVE G TO E+2 AND TO G+1, 4F13532
STQ E+2 X 4F13533
STQ G+1 X 4F13534
TRA TRBLKB,4 NOW BRANCH TO INDIVIDUAL ROUTINE 4F13535
TIX命令を使ったループで求めたインデックスレジスター4の値を使って
TRA TRBLKA,4
やTRA TRBLKB,4
で実際にテーブルをひいてジャンプを実行している。