From 92d605aa7afa226982155bf1dcc2418e03be1d3a Mon Sep 17 00:00:00 2001 From: Michael Hohn Date: Mon, 17 Mar 2025 19:13:24 -0700 Subject: [PATCH] Add CFG of the copy_mem() function --- cfg.dot/cpp/print-cfg.dot | 213 +++++++++++++++++++++++++++++++++++ cfg.dot/cpp/print-cfg.pdf | Bin 0 -> 35937 bytes {solutions => graphs}/ast.ql | 0 graphs/cfg.ql | 81 +++++++++++++ graphs/qlpack.yml | 6 + readme-low-level.org | 30 ++++- 6 files changed, 329 insertions(+), 1 deletion(-) create mode 100644 cfg.dot/cpp/print-cfg.dot create mode 100644 cfg.dot/cpp/print-cfg.pdf rename {solutions => graphs}/ast.ql (100%) create mode 100644 graphs/cfg.ql create mode 100644 graphs/qlpack.yml diff --git a/cfg.dot/cpp/print-cfg.dot b/cfg.dot/cpp/print-cfg.dot new file mode 100644 index 0000000..598aba8 --- /dev/null +++ b/cfg.dot/cpp/print-cfg.dot @@ -0,0 +1,213 @@ +digraph { + compound=true; + 0[label="ExprStmt"; ]; + 1[label="call to memcpy"; ]; + 2[label="input"; ]; + 3[label="0"; ]; + 4[label="access to array"; ]; + 5[label="ptr"; ]; + 6[label="buf"; ]; + 7[label="input"; ]; + 8[label="1"; ]; + 9[label="access to array"; ]; + 10[label="ptr"; ]; + 11[label="buf"; ]; + 12[label="input"; ]; + 13[label="1"; ]; + 14[label="access to array"; ]; + 15[label="ptr"; ]; + 16[label="size"; ]; + 17[label="ExprStmt"; ]; + 18[label="call to copy_mem_nested"; ]; + 19[label="input"; ]; + 20[label="if (...) ... "; ]; + 21[label="input_types"; ]; + 22[label="call to DYN_INPUT_TYPE"; ]; + 23[label="1"; ]; + 24[label="1"; ]; + 25[label="... != ..."; ]; + 26[label="{ ... }"; ]; + 27[label="ExprStmt"; ]; + 28[label="call to memcpy"; ]; + 29[label="input"; ]; + 30[label="0"; ]; + 31[label="access to array"; ]; + 32[label="ptr"; ]; + 33[label="buf"; ]; + 34[label="input"; ]; + 35[label="1"; ]; + 36[label="access to array"; ]; + 37[label="ptr"; ]; + 38[label="buf"; ]; + 39[label="input"; ]; + 40[label="1"; ]; + 41[label="access to array"; ]; + 42[label="ptr"; ]; + 43[label="size"; ]; + 44[label="ExprStmt"; ]; + 45[label="call to copy_mem_nested"; ]; + 46[label="input"; ]; + 47[label="if (...) ... "; ]; + 48[label="call to DYN_INPUT_TYPE"; ]; + 49[label="1"; ]; + 50[label="1"; ]; + 51[label="100"; ]; + 52[label="... == ..."; ]; + 53[label="ExprStmt"; ]; + 54[label="call to memcpy"; ]; + 55[label="input"; ]; + 56[label="0"; ]; + 57[label="access to array"; ]; + 58[label="ptr"; ]; + 59[label="buf"; ]; + 60[label="input"; ]; + 61[label="1"; ]; + 62[label="access to array"; ]; + 63[label="ptr"; ]; + 64[label="buf"; ]; + 65[label="input"; ]; + 66[label="1"; ]; + 67[label="access to array"; ]; + 68[label="ptr"; ]; + 69[label="size"; ]; + 70[label="{ ... }"; ]; + 71[label="if (...) ... "; ]; + 72[label="input_types"; ]; + 73[label="call to DYN_INPUT_TYPE"; ]; + 74[label="1"; ]; + 75[label="1"; ]; + 76[label="... != ..."; ]; + 77[label="return ..."; ]; + 78[label="1"; ]; + 79[label="{ ... }"; ]; + 80[label="ExprStmt"; ]; + 81[label="call to memcpy"; ]; + 82[label="input"; ]; + 83[label="0"; ]; + 84[label="access to array"; ]; + 85[label="ptr"; ]; + 86[label="buf"; ]; + 87[label="input"; ]; + 88[label="1"; ]; + 89[label="access to array"; ]; + 90[label="ptr"; ]; + 91[label="buf"; ]; + 92[label="input"; ]; + 93[label="1"; ]; + 94[label="access to array"; ]; + 95[label="ptr"; ]; + 96[label="size"; ]; + 97[label="ExprStmt"; ]; + 98[label="call to copy_mem_nested"; ]; + 99[label="input"; ]; + 100[label="return ..."; ]; + 101[label="0"; ]; + 102[label="{ ... }"; ]; + 103[label="copy_mem"; ]; + 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/print-cfg.pdf b/cfg.dot/cpp/print-cfg.pdf new file mode 100644 index 0000000000000000000000000000000000000000..61c9fd7118f763d23847e44fdd9f4ffe71d4cdec GIT binary patch literal 35937 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
*$vLQ_6?nlL8>23kA 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 mid + // n1 = mid.getAPredecessor() and + // // mid -> n2 + // allSuccessors3(distance-1, mid, n2) + // --- right-to-left recursion + // n1 -> mid + distance < 12 and + allSuccessors3(distance - 1, n1, mid) and + // mid -> n2 + mid = n2.getAPredecessor() + ) +} + +predicate allSuccessors1(ControlFlowNode n1, ControlFlowNode n2) { + // n1.getASuccessor*() = n2 and + n1 = n2 + or + // n2 = n1.getASuccessor() + exists(ControlFlowNode mid | + allSuccessors1(n1, mid) and + n2 = mid.getASuccessor() + ) +} + +query predicate nodes(ControlFlowNode n1, string key, string value) { + exists(ControlFlowNode startFrom | + (edges(n1, _) or edges(_, n1)) and + ( + if startFrom.getASuccessor*() = n1 + then ( + key = "color" and value = "red" + or + key = "line" and value = n1.getLocation().getStartLine().toString() + ) else ( + key = "color" and value = "black" + or + key = "line" and value = n1.getLocation().getStartLine().toString() + ) + ) + ) +} + +// query predicate edgesDist(ControlFlowNode n1, ControlFlowNode n2, int distance) { +// distance = 12 and +// // allSuccessors3(distance, n1, n2) and +// n1.(Function).hasName("copy_mem") and +// n2 = n1.getASuccessor+() +// } + +query predicate edges(ControlFlowNode n1, ControlFlowNode n2) { + exists(ControlFlowNode t1, ControlFlowNode t2 | + t1.(Function).hasName("copy_mem") and + t2 = t1.(Function).getEntryPoint() and + n1 = t2.getASuccessor*() and + n1 = n2.getAPredecessor() + ) + } diff --git a/graphs/qlpack.yml b/graphs/qlpack.yml new file mode 100644 index 0000000..2d86d73 --- /dev/null +++ b/graphs/qlpack.yml @@ -0,0 +1,6 @@ +--- +library: false +name: graphs +version: 0.0.1 +dependencies: + codeql/cpp-all: 0.6.1 diff --git a/readme-low-level.org b/readme-low-level.org index 01980cf..1ffb68c 100644 --- a/readme-low-level.org +++ b/readme-low-level.org @@ -1,4 +1,4 @@ -* Some low-level codeql +* CodeQL AST in dot and pdf #+BEGIN_SRC sh # Produce ast in dot format codeql database analyze \ @@ -22,3 +22,31 @@ # 3280 880 73% 1 file #+END_SRC +* CodeQL CFG in dot and pdf + XX: The whole control flow graph is very large, so the query narrows it to the + function of interest, + #+BEGIN_SRC c++ + int copy_mem(unsigned int unused, dyn_input_t *input, + unsigned int input_types) {...} + + #+END_SRC + from [[./tests-common/test_part1.c]] + + #+BEGIN_SRC sh + # Produce CFG in dot format + codeql database analyze \ + --format=dot --output=cfg.dot \ + -j8 -v --ram=16000 \ + --rerun \ + -- \ + cpp-dataflow-part1-database \ + graphs/cfg.ql + + + # Convert dot to pdf + dot -Tpdf < cfg.dot/cpp/print-cfg.dot > cfg.dot/cpp/print-cfg.pdf + + # View the graph + open cfg.dot/cpp/print-cfg.pdf + #+END_SRC +