ときどきの雑記帖 RE* (新南口)
Tokyo Dreamer
R
プログラミング言語「R」に脆弱性、任意のコード実行の可能性 | TECH+(テックプラス)
ふむふむと読み進めたら
脆弱性の影響を受ける製品およびバージョンは次のとおり。
- R 1.4.0から4.4.0より前のバージョン
で
脆弱性を修正した製品およびバージョンは次のとおり。
- R 4.4.0
マジで。 4.3.xも放置なんか。
国会図書館
そう言えば前回行ってからどのくらい経っているのだっけ (3年行かないとexpireしてしまう)
日傘
気温はまだそれほどでもないけど 夏至との日数を考えると紫外線はけっこうあるからか ちらほら日傘をさす人を見かけるように
SORT
MS-DOS 4.0がオープンソースになったというのでソースを見てみたら普通のコマンドまで当然のようにアセンブリで書かれているし、sortコマンドなんかは、逆順にソートするときはこのJAE命令はJBEにパッチされるから注意!とか書いてあって自己書き換えコードだった。
— Rui Ueyama (@rui314) May 1, 2024
というのを見かけたので(ry
DOS4のリポジトリでSORTコマンド関連のファイルがあるのはここ MS-DOS/v4.0/src/CMD/SORT at main · microsoft/MS-DOS で、ソースコードを見ていくと問題の場所はここか
MS-DOS/v4.0/src/CMD/SORT/SORT.ASM at main · microsoft/MS-DOS
;---------------------------
; NOTE! jae is patched to a jbe if file is to be sorted in reverse!
;---------------------------
CODE_PATCH label byte
JAE INNER_SORT_LOOP ;if this one wasn't better then go again
MOV BX,SI ;it was better, save header
JMP INNER_SORT_LOOP ;and scan again
END_INNER_SORT_LOOP:
MOV SI,BX ;SI is now the best person
CMP SI,DI ;check best for current
JZ END_INSERT ;best equals current, all done
書き換えているのはここ、
MS-DOS/v4.0/src/CMD/SORT/SORT.ASM at main · microsoft/MS-DOS
;----------------------------------
;- If user said /R, then patch code
;----------------------------------
cmp bx,offset rev_sw ;AN000; If user specified /R
jne check_column ;AN000;
mov cs:code_patch,072h ;AN000; Sleazy patch to make reverse order sort
jmp parse_loop ;AN000; Look for another parm
新刊近刊
脳に収まるコードの書き方
【新刊】書影は後日出ると思いますが、新刊『脳に収まるコードの書き方 ―複雑さを避け持続可能にするための経験則とテクニック』が6/18に発売になります!!
— Ryutaro YOSHIBA (@ryuzee) May 1, 2024
脳に優しくて開発を持続可能にする考え方を1つのサンプルプロジェクトをベースに解説してます!!https://t.co/4qTw3kOWh5
awk
OTA
- delete ARGV · Issue #229 · onetrueawk/awk
- Store the Cell containing ARGV instead of the ARGV table itself. by millert · Pull Request #230 · onetrueawk/awk
この二つはさておき、Arnoldがひとつpull requestを出していて
Remove g++ compilation warnings. by arnoldrobbins · Pull Request #231 · onetrueawk/awk
The big change here is that C++ doesn’t (yet, I guess) like C’s indexed array initializers. I fixed some other warnings along the way.
とのこと。実際のパッチ を見ると
FORTRAN Compiler on IBM 704
IF
IFもそうなんだけど、
TXI ARITH,0
で算術式の処理ルーチンに飛ぶ前に ソースコードのCALL
をなにやら書き換えているのはなんなんだろう?
のつづき。
IF文を処理する部分
REM C0300/ CALLS=-C0190X,C0190,C0390,TEST..,DIAG,C0180,TET00, 4F11928
REM STATEB. 4F11929
REM C0300 PROCESSES IF STATEMENTS. 4F11930
C0300 LXD EIFNO,4 PLACE THE CURRENT INTERNAL FORMULA 4F11931
PXD ,4 NUMBER IN THE DECREMENT OF 1C 4F11932
SSM WITH SIGN SET TO MINUS 4F11933
STO 1C FOR FUTURE TIFGO ENTRY. 4F11934
TSX C0190X,4 * SET CHCTR AND FWA TO BEGIN SCAN. 4F11935
TSX C0190,4 * OBTAIN IN AC THE 1ST NB CHAR (I). 4F11936
LDQ L(X) REPLACE THE CHARACTER I 4F11937
TSX C0390,4 * WITH THE CHARACTER X. 4F11938
LDQ L(10) REPALCE THE CHARACTER F 4F11939
TSX C0390,4 * WITH THE CHARACTER 001010. 4F11940
TSX TESTE0,4 * IF NOT LPAREN -- THEN ERROR. 4F11941
LDQ AEQUAL REPLACE THE CHARACTER LPARAN 4F11942
TSX C0390,4 * WITH THE CHARACTER EQUAL. 4F11943
LXA L(1),2 SET XR2 FOR COUNTING PARENTHESES. 4F11944
TRA *+2 4F11945
C0302 TSX C0190,4 * MAKE SURE THAT NEXT NB CHARACTER 4F11946
CAS ENDMK IS NOT AN ENDMARK. 4F11947
TRA ERR77P * MACHINE ERROR, GO TO DIAGNOSTIC. 4F11948
TSX DIAG,4 * PROGRAM ERROR, GO TO DIAGNOSTIC. 4F11949
CAS ALPAR IF IT IS A LPAREN, 4F11950
TXI C0303,0 THEN ADD 1 TO PAREN COUNT, AND 4F11951
TXI C0302,2,1 GO EXAMINE NEXT CHARACTER. 4F11952
C0303 SUB ARPAR IF IT IS A RPAREN, 4F11953
TNZ C0302 THE TEST PAREN COUNT, AND IF IT 4F11954
TIX C0302,2,1 CAN NOT BE REDUCED,MATE IS FOUND. 4F11955
LDQ ENDMK SO REPLACE THE CHARACTER RPAREN 4F11956
TSX C0390,4 * WITH THE CHARACTER ENDMK. 4F11957
TSX C0180,2 * BINARY EQUIVALENT OF BETA 1. 4F11958
TSX TESTG0,4 * THIS SHOULD BE FOLLOWED BY A COMMA.4F11959
CLA 1G MOVE BETA1 4F11960
STA 1C TO ADDRESS OF 1C. 4F11961
TSX C0190,4 * AND PROCEED TO FORM 4F11962
TSX C0180,2 * THE BINARY EQUIVALENT OF BETA 2. 4F11963
TSX TESTG0,4 * THIS SHOULD BE FOLLWED BY A COMMA. 4F11964
CLA 1G MOVE BETA2 4F11965
ALS 18 TO DECR PART 4F11966
STO 1C+1 OF 1C+1. 4F11967
TSX C0190,4 * AND PROCEED TO FORM 4F11968
TSX C0180,2 * THE BINARY EQUIVALENT OF BETA 3. 4F11969
TSX TESTD0,4 * THIS SHOULD BE FOLLOWED BY ENDMARK.4F11970
CLA 1G MOVE BETA3 4F11971
STA 1C+1 TO ADDRESS OF 1C+1. 4F11972
TXI ARITH,0 * EXIT TO ARITH FOR FINAL PROCESSING.4F11973
REM END OF PROGRAM C0300. 4F11974
を読み返してみてようやく気がついたのだけど、
IF(A-B)5,6,7
というIF文をX_=A-B
という代入文にすり替え書き換え
(実際には=
の手前は8進で12というものだけどたぶん非表示文字なので_
で代替)た上で
算術式の解析ルーチンを呼び出しているのねこれ。
だからSTATE Dでここで書き換えた名前かどうかの判定をして
処理に切り替えがあると。
算術IF文の飛び先(この例では5,6,7
)は
書き換えの後、ARITHに飛ぶまでの間で解析して
ワークエリア1C
と1C+1
に結果を置いている
(ここも後で参照している)
もう一つの
CALL文はというと
REM C3300/ CALLS=C0390,C0190X,C0190,TEST..,ARITH,SUBX00. 4F12381
REM C3300 PROCESSES CALL STATEMENTS. 4F12382
C3300 TSX C0190,4 * IF 1ST CHARACTER OF NAME IS 4F12383
TSX TESTH0,4 * NUMERIC, THEN GO TO THE DIAGNOSTIC.4F12384
TSX C0160,2 * COLLECT THF REST OF THE NAME, WHICH4F12385
TSX TESTC0,4 * SHD BE FOLLOWED BY LPAREN OR ENDMK.4F12386
TZE C3301 IF LPAREN, THEN CHANGE CALL TO A 4F12387
TSX C0190X,4 * PSEUDO-ARITHMETIC FORMULA (Z10=). 4F12388
TSX C0190,4 * PICKUP THE CHARACTER C, 4F12389
LDQ L(Z) AND 4F12390
TSX C0390,4 * REPLACE C WITH Z. 4F12391
LDQ L(10) AND 4F12392
TSX C0390,4 * REPLACE A WITH TEN. 4F12393
LDQ EQUAL AND 4F12394
TSX C0390,4 * REPLACE FIRST L WITH =. 4F12395
LDQ BLANK AND 4F12396
TSX C0390,4 * REPLACE SECOND L WITH BLANK. 4F12397
CLA EIFNO PUT 1ST IFN OF THIS CALL IN CALLNM 4F12398
ARS 18 FOR LATER TABLE ENTRY OF 4F12399
STA CALLNM FIRST / LAST NUMBERS OF CALLS. 4F12400
TXI ARITH,0 * THEN EXIT TO ARITH TO PROCESS. 4F12401
CALL SUB(A,B,C)
というものを
Z_= SUB(A,B,C)
に置き換え書き換えてARITHにジャンプ。
IF、CALLともにそこから流れ流れてSTATE Dで
ES0160 LDQ LEFT+2 S(I)=S(0) 4F15595
LGL 12 4F15596
CAS IFSYM IS THIS AN IF STATEMENT 4F15597
TRA ES0200 4F15598
TRA ES1500 4F15599
ES0200 CAS CALLER IS THIS A CALL STATEMENT 4F15600
TRA ES0210 4F15601
TRA ES1520 4F15602
ES0210 CAS SAPSYM 4F15603
TRA ES0220 4F15604
TRA ES1710 4F15605
という具合に書き換えたものかどうかの判定をしているのだけど
- IFSYM
- CALLER
- SAPSYM
最後のSAPSYMがどこから出てきたものなのかわからない。 定義は
SAPSYM OCT 6212 4F10354
IFSYM OCT 6712 4F10355
CALLER OCT 7112 4F10356
とIFやCALLのものと並んでいるのだけど、その二つのような書き換えを行っている気配がない。
そもそもSAP
ってナニ?
という疑問はさておき先ほどの分岐先がどうなっているかというと
ES1500 TSX TET00,1 * GO TO PROGRAM TET TO ENTER 1C,1C+1 4F15722
PZE 2 INTO TIFGO TABLE (TABLE 2). 4F15723
TRA ES1530 4F15724
*
*
ES1520 LXD EIFNO,4 4F15725
SXD CALLNM,4 PREPARE ENTRY FOR TABLE OF CALL FIRST AND 4F15726
TSX TET00,1 LAST IFN NUMBERS. 4F15727
16 4F15728
*
ES1530 SLT 2 4F15729
TRA ES1590 EXIT TO FETCH STATE A 4F15730
*
TSX CIT00,C COMPILE LLS 37 4F15731
L(0) 4F15732
L(STQ) 4F15733
X( 4F15734
L(0) 4F15735
TSX CIT00,4 4F15736
L(0) 4F15737
L(CLA) 4F15738
X( 4F15739
L(0) 4F15740
*
ES1590 CLA FNSW 4F15741
TZE MTR000 4F15742
*
CLA F-1 4F15743
SUB 5BLANS 4F15744
TZE MTR000 4F15745
*
CLS EIFNO 4F15746
STO EIFNO 4F15747
TSX TET00,A 4F15748
HTR 0 4F15749
CLS EIFNO 4F15750
STO EIFNO 4F15751
TRA MTR000 4F15752
また合流していたりする(このパターン多い)
χより始めよ
論理式って φ、ψ、χ と書いていくものだけど、大昔に板書しながら「なんでカイから始めないんだろうね」と言ったところまったくウケなかったので、今は黙々とφから書き始めている。
— ayustate (@ayustate) April 27, 2024
拡張子
.cpp にするか .cc にするか .c++ にするか .cxx にするか .C にするかの基準はファイル作ってる時の指先の気分としか……ごめんなさい嘘です .cpp にしたことしかありません (既存プロジェクトが別のルールだったときを除く)。
— yoh2 (@yoh2_sdj) July 13, 2023
なんでこんなに異なる流派があるんだよ。
— yoh2 (@yoh2_sdj) July 13, 2023
.ccはよくわかんないけど、.Cも.c++もDOSでは使えなかったので DOS上のコンパイラーはcppを使うようになった。ようなかすかな記憶。
operator precedence
エッ、C++ の & って == より弱いのですか!? そんな……https://t.co/Wg0JhAT8NQ https://t.co/BR6e2mYqkr
— ながたかな@固定ツイートにお歌あります (@ngtkana) April 26, 2024
C/C++ の & や | は最弱に近いので、こいつらを含む式ではとにかく括弧でくくる習慣を付けておかないと、わけのわからないバグで悩むことになるのですよね(実際やらかしている) https://t.co/CDJoMDzJAn
— 魔法少女くにゅくにゅ a.k.a. 椚座 淳介 (@kunukunu) April 26, 2024
ビット演算系はゴミみたいな優先順位なんだよな。&&とは違う。どうしてそういう優先順位にしたかはわからんけど。 https://t.co/pCMOeRueqK
— Takashi Kawasaki (@espresso3389) April 26, 2024
C 言語史が理由ですね。かつて bit AND と論理 AND がともに & と書かれていた(if 文のカッコの中だと & が論理 AND に解釈される、みたいな仕様だった)時代に書かれたコードに、丸かっこを付けなおさずに済むよう優先順位を決めた、という経緯だったはず https://t.co/7RfXWXb0Ra
— はすじょい (hsjoihs)@ゲムマ2024春【G14】 (@hsjoihs) April 26, 2024
「歴史的理由」というのは知っていたのだけど dmrのこれは知らなかった。
> Early C had no separate operators for & and && or | and ||. [...] Instead it used the notion [...] of "truth-value context": where a Boolean value was expected, after "if" and "while" and so forth, the & and | operators were interpreted as && and ||https://t.co/CvLVbdvXct
— はすじょい (hsjoihs)@ゲムマ2024春【G14】 (@hsjoihs) April 26, 2024
ところで The Development of the C Languageにも こういう記述があるですね
Rapid changes continued after the language had been named, for example the introduction of the && and || operators. In BCPL and B, the evaluation of expressions depends on context: within if and other conditional statements that compare an expression’s value with zero, these languages place a special interpretation on the and (&) and or (|) operators. In ordinary contexts, they operate bitwise, but in the B statement
if (e1 & e2) ...
the compiler must evaluate e1 and if it is non-zero, evaluate e2, and if it too is non-zero, elaborate the statement dependent on the if. The requirement descends recursively on & and | operators within e1 and e2. The short-circuit semantics of the Boolean operators in such `truth-value’ context seemed desirable, but the overloading of the operators was difficult to explain and use. At the suggestion of Alan Snyder, I introduced the && and || operators to make the mechanism more explicit.
Their tardy introduction explains an infelicity of C’s precedence rules. In B one writes
if (a==b & c) ...
to check whether a equals b and c is non-zero; in such a conditional expression it is better that & have lower precedence than ==. In converting from B to C, one wants to replace & by && in such a statement; to make the conversion less painful, we decided to keep the precedence of the & operator the same relative to ==, and merely split the precedence of && slightly from &. Today, it seems that it would have been preferable to move the relative precedences of & and ==, and thereby simplify a common C idiom: to test a masked value against another value, one must write
if ((a&mask) == b) ...
where the inner parentheses are required but easily forgotten.
迷い猫オーバーラン
𝚌𝚑𝚊𝚛 𝚘𝚖𝚞𝚛𝚒𝚌𝚎 [𝟷𝟶] ;
— シャポコ🌵 (@shapoco) April 27, 2024
𝚜𝚝𝚛𝚌𝚙𝚢 (𝚘𝚖𝚞𝚛𝚒𝚌𝚎, "ちゃーはん") ; https://t.co/XK9KD8H8bJ