From 9f4a8fe033f498f7e774a11003d064b56afb6997 Mon Sep 17 00:00:00 2001 From: Michael Hohn Date: Thu, 20 Mar 2025 11:19:57 -0700 Subject: [PATCH] Add some source<->CFG node annotations --- cfg.dot/cpp/cfg-annotated.dot | 214 ++++++ cfg.dot/cpp/cfg-annotated.pdf | Bin 0 -> 39309 bytes cfg.dot/cpp/cfg-annotated.svg | 1272 +++++++++++++++++++++++++++++++++ readme-low-level.org | 54 +- 4 files changed, 1529 insertions(+), 11 deletions(-) create mode 100644 cfg.dot/cpp/cfg-annotated.dot create mode 100644 cfg.dot/cpp/cfg-annotated.pdf create mode 100644 cfg.dot/cpp/cfg-annotated.svg diff --git a/cfg.dot/cpp/cfg-annotated.dot b/cfg.dot/cpp/cfg-annotated.dot new file mode 100644 index 0000000..4f3893b --- /dev/null +++ b/cfg.dot/cpp/cfg-annotated.dot @@ -0,0 +1,214 @@ +digraph { + compound=true; + 0[label="ExprStmt (0)"; ]; + 1[label="call to memcpy (1)"; ]; + 2[label="input (2)"; ]; + 3[label="0 (3)"; ]; + 4[label="access to array (4)"; ]; + 5[label="ptr (5)"; ]; + 6[label="buf (6)"; ]; + 7[label="input (7)"; ]; + 8[label="1 (8)"; ]; + 9[label="access to array (9)"; ]; + 10[label="ptr (10)"; ]; + 11[label="buf (11)"; ]; + 12[label="input (12)"; ]; + 13[label="1 (13)"; ]; + 14[label="access to array (14)"; ]; + 15[label="ptr (15)"; ]; + 16[label="size (16)"; ]; + 17[label="ExprStmt (17)"; ]; + 18[label="call to copy_mem_nested (18)"; ]; + 19[label="input (19)"; ]; + 20[label="if (...) ... (20)"; ]; + 21[label="input_types (21)"; ]; + 22[label="call to DYN_INPUT_TYPE (22)"; ]; + 23[label="1 (23)"; ]; + 24[label="1 (24)"; ]; + 25[label="... != ... (25)"; ]; + 26[label="{ ... } (26)"; ]; + 27[label="ExprStmt (27)"; ]; + 28[label="call to memcpy (28)"; ]; + 29[label="input (29)"; ]; + 30[label="0 (30)"; ]; + 31[label="access to array (31)"; ]; + 32[label="ptr (32)"; ]; + 33[label="buf (33)"; ]; + 34[label="input (34)"; ]; + 35[label="1 (35)"; ]; + 36[label="access to array (36)"; ]; + 37[label="ptr (37)"; ]; + 38[label="buf (38)"; ]; + 39[label="input (39)"; ]; + 40[label="1 (40)"; ]; + 41[label="access to array (41)"; ]; + 42[label="ptr (42)"; ]; + 43[label="size (43)"; ]; + 44[label="ExprStmt (44)"; ]; + 45[label="call to copy_mem_nested (45)"; ]; + 46[label="input (46)"; ]; + 47[label="if (...) ... (47)"; ]; + 48[label="call to DYN_INPUT_TYPE (48)"; ]; + 49[label="1 (49)"; ]; + 50[label="1 (50)"; ]; + 51[label="100 (51)"; ]; + 52[label="... == ... (52)"; ]; + 53[label="ExprStmt (53)"; ]; + 54[label="call to memcpy (54)"; ]; + 55[label="input (55)"; ]; + 56[label="0 (56)"; ]; + 57[label="access to array (57)"; ]; + 58[label="ptr (58)"; ]; + 59[label="buf (59)"; ]; + 60[label="input (60)"; ]; + 61[label="1 (61)"; ]; + 62[label="access to array (62)"; ]; + 63[label="ptr (63)"; ]; + 64[label="buf (64)"; ]; + 65[label="input (65)"; ]; + 66[label="1 (66)"; ]; + 67[label="access to array (67)"; ]; + 68[label="ptr (68)"; ]; + 69[label="size (69)"; ]; + 70[label="{ ... } (70)"; ]; + 71[label="if (...) ... (71)"; ]; + 72[label="input_types (72)"; ]; + 73[label="call to DYN_INPUT_TYPE (73)"; ]; + 74[label="1 (74)"; ]; + 75[label="1 (75)"; ]; + 76[label="... != ... (76)"; ]; + 77[label="return ... (77)"; ]; + 78[label="1 (78)"; ]; + 79[label="{ ... } (79)"; ]; + 80[label="ExprStmt (80)"; ]; + 81[label="call to memcpy (81)"; ]; + 82[label="input (82)"; ]; + 83[label="0 (83)"; ]; + 84[label="access to array (84)"; ]; + 85[label="ptr (85)"; ]; + 86[label="buf (86)"; ]; + 87[label="input (87)"; ]; + 88[label="1 (88)"; ]; + 89[label="access to array (89)"; ]; + 90[label="ptr (90)"; ]; + 91[label="buf (91)"; ]; + 92[label="input (92)"; ]; + 93[label="1 (93)"; ]; + 94[label="access to array (94)"; ]; + 95[label="ptr (95)"; ]; + 96[label="size (96)"; ]; + 97[label="ExprStmt (97)"; ]; + 98[label="call to copy_mem_nested (98)"; ]; + 99[label="input (99)"; ]; + 100[label="return ... (100)"; ]; + 101[label="0 (101)"; ]; + 102[label="{ ... } (102)"; ]; + 103[label="copy_mem (103)"; ]; + + 0 -> 2[]; + 1 -> 17[]; + 2 -> 3[]; + 3 -> 4[]; + 4 -> 5[]; + 5 -> 6[]; + 6 -> 7[]; + 7 -> 8[]; + 8 -> 9[]; + 9 -> 10[]; + 10 -> 11[]; + 11 -> 12[]; + 12 -> 13[]; + 13 -> 14[]; + 14 -> 15[]; + 15 -> 16[]; + 16 -> 1[]; + 17 -> 19[]; + 18 -> 20[]; + 19 -> 18[]; + 20 -> 21[]; + 21 -> 23[]; + 22 -> 25[]; + 23 -> 24[]; + 24 -> 22[]; + 25 -> 26[]; + 25 -> 27[]; + 26 -> 27[]; + 27 -> 29[]; + 28 -> 44[]; + 29 -> 30[]; + 30 -> 31[]; + 31 -> 32[]; + 32 -> 33[]; + 33 -> 34[]; + 34 -> 35[]; + 35 -> 36[]; + 36 -> 37[]; + 37 -> 38[]; + 38 -> 39[]; + 39 -> 40[]; + 40 -> 41[]; + 41 -> 42[]; + 42 -> 43[]; + 43 -> 28[]; + 44 -> 46[]; + 45 -> 47[]; + 46 -> 45[]; + 47 -> 49[]; + 48 -> 51[]; + 49 -> 50[]; + 50 -> 48[]; + 51 -> 52[]; + 52 -> 70[]; + 52 -> 71[]; + 53 -> 55[]; + 54 -> 71[]; + 55 -> 56[]; + 56 -> 57[]; + 57 -> 58[]; + 58 -> 59[]; + 59 -> 60[]; + 60 -> 61[]; + 61 -> 62[]; + 62 -> 63[]; + 63 -> 64[]; + 64 -> 65[]; + 65 -> 66[]; + 66 -> 67[]; + 67 -> 68[]; + 68 -> 69[]; + 69 -> 54[]; + 70 -> 53[]; + 71 -> 72[]; + 72 -> 74[]; + 73 -> 76[]; + 74 -> 75[]; + 75 -> 73[]; + 76 -> 79[]; + 76 -> 80[]; + 77 -> 78[]; + 78 -> 103[]; + 79 -> 77[]; + 80 -> 82[]; + 81 -> 97[]; + 82 -> 83[]; + 83 -> 84[]; + 84 -> 85[]; + 85 -> 86[]; + 86 -> 87[]; + 87 -> 88[]; + 88 -> 89[]; + 89 -> 90[]; + 90 -> 91[]; + 91 -> 92[]; + 92 -> 93[]; + 93 -> 94[]; + 94 -> 95[]; + 95 -> 96[]; + 96 -> 81[]; + 97 -> 99[]; + 98 -> 100[]; + 99 -> 98[]; + 100 -> 101[]; + 101 -> 103[]; + 102 -> 0[]; +} diff --git a/cfg.dot/cpp/cfg-annotated.pdf b/cfg.dot/cpp/cfg-annotated.pdf new file mode 100644 index 0000000000000000000000000000000000000000..69e738e6f8904c10497685bea1c758d8e70d4dfb GIT binary patch literal 39309 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�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 + + + + + + + + +0 + +ExprStmt (0) + + + +2 + +input (2) + + + +0->2 + + + + + +1 + +call to memcpy (1) + + + +17 + +ExprStmt (17) + + + +1->17 + + + + + +3 + +0 (3) + + + +2->3 + + + + + +4 + +access to array (4) + + + +3->4 + + + + + +5 + +ptr (5) + + + +4->5 + + + + + +6 + +buf (6) + + + +5->6 + + + + + +7 + +input (7) + + + +6->7 + + + + + +8 + +1 (8) + + + +7->8 + + + + + +9 + +access to array (9) + + + +8->9 + + + + + +10 + +ptr (10) + + + +9->10 + + + + + +11 + +buf (11) + + + +10->11 + + + + + +12 + +input (12) + + + +11->12 + + + + + +13 + +1 (13) + + + +12->13 + + + + + +14 + +access to array (14) + + + +13->14 + + + + + +15 + +ptr (15) + + + +14->15 + + + + + +16 + +size (16) + + + +15->16 + + + + + +16->1 + + + + + +19 + +input (19) + + + +17->19 + + + + + +18 + +call to copy_mem_nested (18) + + + +20 + +if (...) ... (20) + + + +18->20 + + + + + +19->18 + + + + + +21 + +input_types (21) + + + +20->21 + + + + + +23 + +1 (23) + + + +21->23 + + + + + +22 + +call to DYN_INPUT_TYPE (22) + + + +25 + +... != ... (25) + + + +22->25 + + + + + +24 + +1 (24) + + + +23->24 + + + + + +24->22 + + + + + +26 + +{ ... } (26) + + + +25->26 + + + + + +27 + +ExprStmt (27) + + + +25->27 + + + + + +26->27 + + + + + +29 + +input (29) + + + +27->29 + + + + + +28 + +call to memcpy (28) + + + +44 + +ExprStmt (44) + + + +28->44 + + + + + +30 + +0 (30) + + + +29->30 + + + + + +31 + +access to array (31) + + + +30->31 + + + + + +32 + +ptr (32) + + + +31->32 + + + + + +33 + +buf (33) + + + +32->33 + + + + + +34 + +input (34) + + + +33->34 + + + + + +35 + +1 (35) + + + +34->35 + + + + + +36 + +access to array (36) + + + +35->36 + + + + + +37 + +ptr (37) + + + +36->37 + + + + + +38 + +buf (38) + + + +37->38 + + + + + +39 + +input (39) + + + +38->39 + + + + + +40 + +1 (40) + + + +39->40 + + + + + +41 + +access to array (41) + + + +40->41 + + + + + +42 + +ptr (42) + + + +41->42 + + + + + +43 + +size (43) + + + +42->43 + + + + + +43->28 + + + + + +46 + +input (46) + + + +44->46 + + + + + +45 + +call to copy_mem_nested (45) + + + +47 + +if (...) ... (47) + + + +45->47 + + + + + +46->45 + + + + + +49 + +1 (49) + + + +47->49 + + + + + +48 + +call to DYN_INPUT_TYPE (48) + + + +51 + +100 (51) + + + +48->51 + + + + + +50 + +1 (50) + + + +49->50 + + + + + +50->48 + + + + + +52 + +... == ... (52) + + + +51->52 + + + + + +70 + +{ ... } (70) + + + +52->70 + + + + + +71 + +if (...) ... (71) + + + +52->71 + + + + + +53 + +ExprStmt (53) + + + +55 + +input (55) + + + +53->55 + + + + + +54 + +call to memcpy (54) + + + +54->71 + + + + + +56 + +0 (56) + + + +55->56 + + + + + +57 + +access to array (57) + + + +56->57 + + + + + +58 + +ptr (58) + + + +57->58 + + + + + +59 + +buf (59) + + + +58->59 + + + + + +60 + +input (60) + + + +59->60 + + + + + +61 + +1 (61) + + + +60->61 + + + + + +62 + +access to array (62) + + + +61->62 + + + + + +63 + +ptr (63) + + + +62->63 + + + + + +64 + +buf (64) + + + +63->64 + + + + + +65 + +input (65) + + + +64->65 + + + + + +66 + +1 (66) + + + +65->66 + + + + + +67 + +access to array (67) + + + +66->67 + + + + + +68 + +ptr (68) + + + +67->68 + + + + + +69 + +size (69) + + + +68->69 + + + + + +69->54 + + + + + +70->53 + + + + + +72 + +input_types (72) + + + +71->72 + + + + + +74 + +1 (74) + + + +72->74 + + + + + +73 + +call to DYN_INPUT_TYPE (73) + + + +76 + +... != ... (76) + + + +73->76 + + + + + +75 + +1 (75) + + + +74->75 + + + + + +75->73 + + + + + +79 + +{ ... } (79) + + + +76->79 + + + + + +80 + +ExprStmt (80) + + + +76->80 + + + + + +77 + +return ... (77) + + + +78 + +1 (78) + + + +77->78 + + + + + +103 + +copy_mem (103) + + + +78->103 + + + + + +79->77 + + + + + +82 + +input (82) + + + +80->82 + + + + + +81 + +call to memcpy (81) + + + +97 + +ExprStmt (97) + + + +81->97 + + + + + +83 + +0 (83) + + + +82->83 + + + + + +84 + +access to array (84) + + + +83->84 + + + + + +85 + +ptr (85) + + + +84->85 + + + + + +86 + +buf (86) + + + +85->86 + + + + + +87 + +input (87) + + + +86->87 + + + + + +88 + +1 (88) + + + +87->88 + + + + + +89 + +access to array (89) + + + +88->89 + + + + + +90 + +ptr (90) + + + +89->90 + + + + + +91 + +buf (91) + + + +90->91 + + + + + +92 + +input (92) + + + +91->92 + + + + + +93 + +1 (93) + + + +92->93 + + + + + +94 + +access to array (94) + + + +93->94 + + + + + +95 + +ptr (95) + + + +94->95 + + + + + +96 + +size (96) + + + +95->96 + + + + + +96->81 + + + + + +99 + +input (99) + + + +97->99 + + + + + +98 + +call to copy_mem_nested (98) + + + +100 + +return ... (100) + + + +98->100 + + + + + +99->98 + + + + + +101 + +0 (101) + + + +100->101 + + + + + +101->103 + + + + + +102 + +{ ... } (102) + + + +102->0 + + + + + diff --git a/readme-low-level.org b/readme-low-level.org index feb641c..39278ab 100644 --- a/readme-low-level.org +++ b/readme-low-level.org @@ -96,23 +96,55 @@ #+ATTR_HTML: :width 100% [[./cfg.dot/cpp/ast-cfg-hybrid.svg]] -* Hybrid portion of source code - The part of the source code corresponding to the hybrid portion, with space for - adding edges: +* CFG with numbered nodes + The CFG with node numbering is inlined here. For better viewing, open the + pdf ([[./cfg.dot/cpp/cfg-annotated.pdf]]) separately. + #+ATTR_HTML: :width 100% + [[./cfg.dot/cpp/cfg-annotated.svg]] + + As before, this graph is rendered via dot: + #+BEGIN_SRC sh + dot -Tpdf < cfg.dot/cpp/cfg-annotated.dot > cfg.dot/cpp/cfg-annotated.pdf + dot -Tsvg < cfg.dot/cpp/cfg-annotated.dot > cfg.dot/cpp/cfg-annotated.svg + + # View the graph + open -a skim cfg.dot/cpp/cfg-annotated.pdf + + #+END_SRC + + +* Source Annotated with CFG Nodes + The CFG entries + #+BEGIN_SRC text + 0[label="ExprStmt (0)"; ]; + 1[label="call to memcpy (1)"; ]; + 2[label="input (2)"; ]; + 3[label="0 (3)"; ]; + 4[label="access to array (4)"; ]; + 5[label="ptr (5)"; ]; + 6[label="buf (6)"; ]; + 7[label="input (7)"; ]; + 8[label="1 (8)"; ]; + 9[label="access to array (9)"; ]; + 10[label="ptr (10)"; ]; + 11[label="buf (11)"; ]; + #+END_SRC + are located in the source code as follows #+BEGIN_SRC c++ int copy_mem(unsigned int unused, dyn_input_t *input, - unsigned int input_types) { + unsigned int input_types) { + 0 + + memcpy(input[0].ptr.buf, input[1].ptr.buf, + 1 2 3 7 8 + 4 5 6 9 10 11 + + input[1].ptr.size); - memcpy(input[0].ptr.buf, input[1].ptr.buf, - - - input[1].ptr.size); - - - copy_mem_nested(input); + copy_mem_nested(input); ...; }