mirror of
https://github.com/hohn/codeql-workshop-dataflow-c.git
synced 2025-12-16 18:43:03 +01:00
Add AST printed in dot format and converted to pdf
This commit is contained in:
committed by
=Michael Hohn
parent
7fbd43def7
commit
75f0ec79bd
114
ast.dot/cpp/print-ast.dot
Normal file
114
ast.dot/cpp/print-ast.dot
Normal file
@@ -0,0 +1,114 @@
|
|||||||
|
digraph {
|
||||||
|
compound=true;
|
||||||
|
0[label="[IfStmt] if (...) ... "; ];
|
||||||
|
1[label="[VariableAccess] input_types"; ];
|
||||||
|
2[label="[FunctionCall] call to DYN_INPUT_TYPE"; ];
|
||||||
|
3[label="[Literal] 2"; ];
|
||||||
|
4[label="[CStyleCast] (unsigned int)..."; ];
|
||||||
|
5[label="[Literal] 1"; ];
|
||||||
|
6[label="[CStyleCast] (unsigned int)..."; ];
|
||||||
|
7[label="[EQExpr] ... == ..."; ];
|
||||||
|
8[label="[ExprStmt] ExprStmt"; ];
|
||||||
|
9[label="[FunctionCall] call to memcpy"; ];
|
||||||
|
10[label="[VariableAccess] input"; ];
|
||||||
|
11[label="[Literal] 1"; ];
|
||||||
|
12[label="[ArrayExpr] access to array"; ];
|
||||||
|
13[label="[ValueFieldAccess] ptr"; ];
|
||||||
|
14[label="[ValueFieldAccess] buf"; ];
|
||||||
|
15[label="[VariableAccess] input"; ];
|
||||||
|
16[label="[Literal] 0"; ];
|
||||||
|
17[label="[ArrayExpr] access to array"; ];
|
||||||
|
18[label="[ValueFieldAccess] val"; ];
|
||||||
|
19[label="[AddressOfExpr] & ..."; ];
|
||||||
|
20[label="[CStyleCast] (const void *)..."; ];
|
||||||
|
21[label="[SizeofExprOperator] sizeof(<expr>)"; ];
|
||||||
|
22[label="[VariableAccess] input"; ];
|
||||||
|
23[label="[Literal] 0"; ];
|
||||||
|
24[label="[ArrayExpr] access to array"; ];
|
||||||
|
25[label="[ValueFieldAccess] val"; ];
|
||||||
|
26[label="[ParenthesisExpr] (...)"; ];
|
||||||
|
27[label="[ReturnStmt] return ..."; ];
|
||||||
|
28[label="[Literal] 0"; ];
|
||||||
|
29[label="[BlockStmt] { ... }"; ];
|
||||||
|
30[label="[ExprStmt] ExprStmt"; ];
|
||||||
|
31[label="[FunctionCall] call to memcpy"; ];
|
||||||
|
32[label="[VariableAccess] input"; ];
|
||||||
|
33[label="[Literal] 1"; ];
|
||||||
|
34[label="[ArrayExpr] access to array"; ];
|
||||||
|
35[label="[ValueFieldAccess] ptr"; ];
|
||||||
|
36[label="[ValueFieldAccess] buf"; ];
|
||||||
|
37[label="[VariableAccess] input"; ];
|
||||||
|
38[label="[Literal] 0"; ];
|
||||||
|
39[label="[ArrayExpr] access to array"; ];
|
||||||
|
40[label="[ValueFieldAccess] val"; ];
|
||||||
|
41[label="[AddressOfExpr] & ..."; ];
|
||||||
|
42[label="[CStyleCast] (const void *)..."; ];
|
||||||
|
43[label="[SizeofExprOperator] sizeof(<expr>)"; ];
|
||||||
|
44[label="[VariableAccess] input"; ];
|
||||||
|
45[label="[Literal] 0"; ];
|
||||||
|
46[label="[ArrayExpr] access to array"; ];
|
||||||
|
47[label="[ValueFieldAccess] val"; ];
|
||||||
|
48[label="[ParenthesisExpr] (...)"; ];
|
||||||
|
49[label="[ReturnStmt] return ..."; ];
|
||||||
|
50[label="[Literal] 1"; ];
|
||||||
|
51[label="[BlockStmt] { ... }"; ];
|
||||||
|
52[label="[Parameter] input"; ];
|
||||||
|
53[label="[Parameter] input_types"; ];
|
||||||
|
54[];
|
||||||
|
55[label="[TopLevelFunction] int write_val_to_mem(dyn_input_t*, unsigned int)"; ];
|
||||||
|
0 -> 7[label="getCondition()"; ];
|
||||||
|
2 -> 3[label="getArgument(0)"; ];
|
||||||
|
7 -> 1[label="getLeftOperand()"; ];
|
||||||
|
8 -> 9[label="getExpr()"; ];
|
||||||
|
9 -> 14[label="getArgument(0)"; ];
|
||||||
|
12 -> 10[label="getArrayBase()"; ];
|
||||||
|
13 -> 12[label="getQualifier()"; ];
|
||||||
|
14 -> 13[label="getQualifier()"; ];
|
||||||
|
17 -> 15[label="getArrayBase()"; ];
|
||||||
|
18 -> 17[label="getQualifier()"; ];
|
||||||
|
19 -> 18[label="getOperand()"; ];
|
||||||
|
21 -> 25[label="getExprOperand()"; ];
|
||||||
|
24 -> 22[label="getArrayBase()"; ];
|
||||||
|
25 -> 24[label="getQualifier()"; ];
|
||||||
|
27 -> 28[label="getExpr()"; ];
|
||||||
|
29 -> 8[label="getStmt(0)"; ];
|
||||||
|
30 -> 31[label="getExpr()"; ];
|
||||||
|
31 -> 36[label="getArgument(0)"; ];
|
||||||
|
34 -> 32[label="getArrayBase()"; ];
|
||||||
|
35 -> 34[label="getQualifier()"; ];
|
||||||
|
36 -> 35[label="getQualifier()"; ];
|
||||||
|
39 -> 37[label="getArrayBase()"; ];
|
||||||
|
40 -> 39[label="getQualifier()"; ];
|
||||||
|
41 -> 40[label="getOperand()"; ];
|
||||||
|
43 -> 47[label="getExprOperand()"; ];
|
||||||
|
46 -> 44[label="getArrayBase()"; ];
|
||||||
|
47 -> 46[label="getQualifier()"; ];
|
||||||
|
49 -> 50[label="getExpr()"; ];
|
||||||
|
51 -> 0[label="getStmt(0)"; ];
|
||||||
|
55 -> 54[label="<params>"; ];
|
||||||
|
54 -> 52[label="getParameter(0)"; ];
|
||||||
|
0 -> 29[label="getThen()"; ];
|
||||||
|
2 -> 5[label="getArgument(1)"; ];
|
||||||
|
7 -> 2[label="getRightOperand()"; ];
|
||||||
|
9 -> 19[label="getArgument(1)"; ];
|
||||||
|
12 -> 11[label="getArrayOffset()"; ];
|
||||||
|
17 -> 16[label="getArrayOffset()"; ];
|
||||||
|
21 -> 26[label="getExprOperand().getFullyConverted()"; ];
|
||||||
|
24 -> 23[label="getArrayOffset()"; ];
|
||||||
|
29 -> 27[label="getStmt(1)"; ];
|
||||||
|
31 -> 41[label="getArgument(1)"; ];
|
||||||
|
34 -> 33[label="getArrayOffset()"; ];
|
||||||
|
39 -> 38[label="getArrayOffset()"; ];
|
||||||
|
43 -> 48[label="getExprOperand().getFullyConverted()"; ];
|
||||||
|
46 -> 45[label="getArrayOffset()"; ];
|
||||||
|
51 -> 30[label="getStmt(1)"; ];
|
||||||
|
55 -> 51[label="getEntryPoint()"; ];
|
||||||
|
54 -> 53[label="getParameter(1)"; ];
|
||||||
|
2 -> 4[label="getArgument(0).getFullyConverted()"; ];
|
||||||
|
9 -> 21[label="getArgument(2)"; ];
|
||||||
|
31 -> 43[label="getArgument(2)"; ];
|
||||||
|
51 -> 49[label="getStmt(2)"; ];
|
||||||
|
2 -> 6[label="getArgument(1).getFullyConverted()"; ];
|
||||||
|
9 -> 20[label="getArgument(1).getFullyConverted()"; ];
|
||||||
|
31 -> 42[label="getArgument(1).getFullyConverted()"; ];
|
||||||
|
}
|
||||||
BIN
ast.dot/cpp/print-ast.pdf
Normal file
BIN
ast.dot/cpp/print-ast.pdf
Normal file
Binary file not shown.
24
readme-low-level.org
Normal file
24
readme-low-level.org
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
* Some low-level codeql
|
||||||
|
#+BEGIN_SRC sh
|
||||||
|
# Produce ast in dot format
|
||||||
|
codeql database analyze \
|
||||||
|
--format=dot --output=ast.dot \
|
||||||
|
-- cpp-dataflow-part1-database solutions/ast.ql
|
||||||
|
|
||||||
|
# Convert dot to pdf
|
||||||
|
dot -Tpdf < ast.dot/cpp/print-ast.dot > ast.dot/cpp/print-ast.pdf
|
||||||
|
|
||||||
|
# View the graph
|
||||||
|
open ast.dot/cpp/print-ast.pdf
|
||||||
|
|
||||||
|
|
||||||
|
# This comes from
|
||||||
|
unzip -v cpp-dataflow-part1-database/src.zip
|
||||||
|
# Archive: cpp-dataflow-part1-database/src.zip
|
||||||
|
# Length Method Size Cmpr Date Time CRC-32 Name
|
||||||
|
# -------- ------ ------- ---- ---------- ----- -------- ----
|
||||||
|
# 3280 Defl:N 880 73% 03-17-2025 08:59 8057b2ea Users/hohn/local/codeql-workshop-dataflow-c/tests-common/test_part1.c
|
||||||
|
# -------- ------- --- -------
|
||||||
|
# 3280 880 73% 1 file
|
||||||
|
#+END_SRC
|
||||||
|
|
||||||
12
solutions/ast.ql
Normal file
12
solutions/ast.ql
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
/**
|
||||||
|
* @id cpp/print-ast
|
||||||
|
* @kind graph
|
||||||
|
*/
|
||||||
|
|
||||||
|
import cpp
|
||||||
|
import semmle.code.cpp.PrintAST
|
||||||
|
|
||||||
|
// extend `PrintASTConfiguration` and override `shouldPrintFunction` to hold for only the functions
|
||||||
|
class PrintConfig extends PrintAstConfiguration {
|
||||||
|
override predicate shouldPrintFunction(Function func) { func.hasName("write_val_to_mem") }
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user