Try   HackMD

symbolic execution

在論文最後的report 中,嘗試去添加 path constraint ,得以進一步讓使用者更清晰的顯示 colect table 里相同 stmt 分支 模糊的地帶
因為 gimpler ir 有可能會有相同的 gimple stmt 名稱
可能要等最終論文發表後才可以公布我目前的程式碼,我的論文主要是實做一個靜態分析器去檢測memory leak ,pthread resource leak 等等相關研究,因為論文目標 可能 不用 smt solver 就可以得出較好的結果,這邊紀錄一下 smt & sat 的一些概念。

版权声明:本文为CSDN博主「swy_swy_swy」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/swy_swy_swy/article/details/104889142
原文链接:https://blog.csdn.net/swy_swy_swy/article/details/104979621
原文链接:https://blog.csdn.net/swy_swy_swy/article/details/105019684

一些概念的補充
https://etd.lis.nsysu.edu.tw/ETD-db/ETD-search-c/getfile?URN=etd-1031111-020007&filename=etd-1031111-020007.pdf

https://blog.csdn.net/as604049322/article/details/120279521
在這一篇文章中有紀錄z3-solver 一連串的範例我這邊來稍微整理一下。

https://blog.csdn.net/qq_37400312/article/details/108962459
AND OR IF 一些補充

https://arabelatso.github.io/2018/06/14/Z3 API in Python/

這邊針對約束的部分去研究我們跳過前的一些數學的例子,
針對數獨這個部份去拆解

from z3 import * # 9x9 整数变量矩阵 X = [[Int(f"x_{i}_{j}") for j in range(9)] for i in range(9)] #print (X) # 每个单元格在 1,2,3,...8,9 中包含一个值 cells_c = [And(1 <= X[i][j], X[i][j] <= 9) for i in range(9) for j in range(9)] #print (cells_c) # 每行每个数字最多出现一次 rows_c = [Distinct(X[i]) for i in range(9)] #print (rows_c) # 每列每个数字最多出现一次 cols_c = [Distinct([X[i][j] for i in range(9)]) for j in range(9)] # 每个 3x3 方格每个数字最多出现一次 sq_c = [Distinct([X[3*i0 + i][3*j0 + j] for i in range(3) for j in range(3)]) for i0 in range(3) for j0 in range(3)] # 数独完整约束条件 sudoku_c = cells_c + rows_c + cols_c + sq_c board = [ [0, 0, 0, 6, 0, 0, 0, 3, 0], [5, 0, 0, 0, 0, 0, 6, 0, 0], [0, 9, 0, 0, 0, 5, 0, 0, 0], [0, 0, 4, 0, 1, 0, 0, 0, 6], [0, 0, 0, 4, 0, 3, 0, 0, 0], [8, 0, 0, 0, 9, 0, 5, 0, 0], [0, 0, 0, 7, 0, 0, 0, 4, 0], [0, 0, 5, 0, 0, 0, 0, 0, 8], [0, 3, 0, 0, 0, 8, 0, 0, 0] ] def solveSudoku(board: list): board_c = [If(board[i][j] == 0, True, X[i][j] == board[i][j]) for i in range(9) for j in range(9)] path = 'output.txt' f = open(path, 'w') s = Solver() s.add(sudoku_c + board_c) if s.check() == sat: m = s.model() print(str(m)) f.write(str(m)) f.write(str(sudoku_c + board_c)) f.close() r = [[m[X[i][j]].as_long() for j in range(9)] for i in range(9)] return r print (solveSudoku(board))

我們詳細拆解其實就是去建立每一個規則

And(x_0_0 >= 1, x_0_0 <= 9), And(x_0_1 >= 1, x_0_1 <= 9), And(x_0_2 >= 1, x_0_2 <= 9), And(x_0_3 >= 1, x_0_3 <= 9), And(x_0_4 >= 1, x_0_4 <= 9), And(x_0_5 >= 1, x_0_5 <= 9), And(x_0_6 >= 1, x_0_6 <= 9), And(x_0_7 >= 1, x_0_7 <= 9), And(x_0_8 >= 1, x_0_8 <= 9), And(x_1_0 >= 1, x_1_0 <= 9), And(x_1_1 >= 1, x_1_1 <= 9), And(x_1_2 >= 1, x_1_2 <= 9), And(x_1_3 >= 1, x_1_3 <= 9), And(x_1_4 >= 1, x_1_4 <= 9), And(x_1_5 >= 1, x_1_5 <= 9), And(x_1_6 >= 1, x_1_6 <= 9), And(x_1_7 >= 1, x_1_7 <= 9), And(x_1_8 >= 1, x_1_8 <= 9), And(x_2_0 >= 1, x_2_0 <= 9), And(x_2_1 >= 1, x_2_1 <= 9), And(x_2_2 >= 1, x_2_2 <= 9), And(x_2_3 >= 1, x_2_3 <= 9), And(x_2_4 >= 1, x_2_4 <= 9), And(x_2_5 >= 1, x_2_5 <= 9), And(x_2_6 >= 1, x_2_6 <= 9), And(x_2_7 >= 1, x_2_7 <= 9), And(x_2_8 >= 1, x_2_8 <= 9), And(x_3_0 >= 1, x_3_0 <= 9), And(x_3_1 >= 1, x_3_1 <= 9), And(x_3_2 >= 1, x_3_2 <= 9), And(x_3_3 >= 1, x_3_3 <= 9), And(x_3_4 >= 1, x_3_4 <= 9), And(x_3_5 >= 1, x_3_5 <= 9), And(x_3_6 >= 1, x_3_6 <= 9), And(x_3_7 >= 1, x_3_7 <= 9), And(x_3_8 >= 1, x_3_8 <= 9), And(x_4_0 >= 1, x_4_0 <= 9), And(x_4_1 >= 1, x_4_1 <= 9), And(x_4_2 >= 1, x_4_2 <= 9), And(x_4_3 >= 1, x_4_3 <= 9), And(x_4_4 >= 1, x_4_4 <= 9), And(x_4_5 >= 1, x_4_5 <= 9), And(x_4_6 >= 1, x_4_6 <= 9), And(x_4_7 >= 1, x_4_7 <= 9), And(x_4_8 >= 1, x_4_8 <= 9), And(x_5_0 >= 1, x_5_0 <= 9), And(x_5_1 >= 1, x_5_1 <= 9), And(x_5_2 >= 1, x_5_2 <= 9), And(x_5_3 >= 1, x_5_3 <= 9), And(x_5_4 >= 1, x_5_4 <= 9), And(x_5_5 >= 1, x_5_5 <= 9), And(x_5_6 >= 1, x_5_6 <= 9), And(x_5_7 >= 1, x_5_7 <= 9), And(x_5_8 >= 1, x_5_8 <= 9), And(x_6_0 >= 1, x_6_0 <= 9), And(x_6_1 >= 1, x_6_1 <= 9), And(x_6_2 >= 1, x_6_2 <= 9), And(x_6_3 >= 1, x_6_3 <= 9), And(x_6_4 >= 1, x_6_4 <= 9), And(x_6_5 >= 1, x_6_5 <= 9), And(x_6_6 >= 1, x_6_6 <= 9), And(x_6_7 >= 1, x_6_7 <= 9), And(x_6_8 >= 1, x_6_8 <= 9), And(x_7_0 >= 1, x_7_0 <= 9), And(x_7_1 >= 1, x_7_1 <= 9), And(x_7_2 >= 1, x_7_2 <= 9), And(x_7_3 >= 1, x_7_3 <= 9), And(x_7_4 >= 1, x_7_4 <= 9), And(x_7_5 >= 1, x_7_5 <= 9), And(x_7_6 >= 1, x_7_6 <= 9), And(x_7_7 >= 1, x_7_7 <= 9), And(x_7_8 >= 1, x_7_8 <= 9), And(x_8_0 >= 1, x_8_0 <= 9), And(x_8_1 >= 1, x_8_1 <= 9), And(x_8_2 >= 1, x_8_2 <= 9), And(x_8_3 >= 1, x_8_3 <= 9), And(x_8_4 >= 1, x_8_4 <= 9), And(x_8_5 >= 1, x_8_5 <= 9), And(x_8_6 >= 1, x_8_6 <= 9), And(x_8_7 >= 1, x_8_7 <= 9), And(x_8_8 >= 1, x_8_8 <= 9), 
Distinct(x_0_0,
         x_0_1,
         x_0_2,
         x_0_3,
         x_0_4,
         x_0_5,
         x_0_6,
         x_0_7,
         x_0_8), Distinct(x_1_0,
         x_1_1,
         x_1_2,
         x_1_3,
         x_1_4,
         x_1_5,
         x_1_6,
         x_1_7,
         x_1_8), Distinct(x_2_0,
         x_2_1,
         x_2_2,
         x_2_3,
         x_2_4,
         x_2_5,
         x_2_6,
         x_2_7,
         x_2_8), Distinct(x_3_0,
         x_3_1,
         x_3_2,
         x_3_3,
         x_3_4,
         x_3_5,
         x_3_6,
         x_3_7,
         x_3_8), Distinct(x_4_0,
         x_4_1,
         x_4_2,
         x_4_3,
         x_4_4,
         x_4_5,
         x_4_6,
         x_4_7,
         x_4_8), Distinct(x_5_0,
         x_5_1,
         x_5_2,
         x_5_3,
         x_5_4,
         x_5_5,
         x_5_6,
         x_5_7,
         x_5_8), Distinct(x_6_0,
         x_6_1,
         x_6_2,
         x_6_3,
         x_6_4,
         x_6_5,
         x_6_6,
         x_6_7,
         x_6_8), Distinct(x_7_0,
         x_7_1,
         x_7_2,
         x_7_3,
         x_7_4,
         x_7_5,
         x_7_6,
         x_7_7,
         x_7_8), Distinct(x_8_0,
         x_8_1,
         x_8_2,
         x_8_3,
         x_8_4,
         x_8_5,
         x_8_6,
         x_8_7,
         x_8_8), Distinct(x_0_0,
         x_1_0,
         x_2_0,
         x_3_0,
         x_4_0,
         x_5_0,
         x_6_0,
         x_7_0,
         x_8_0), Distinct(x_0_1,
         x_1_1,
         x_2_1,
         x_3_1,
         x_4_1,
         x_5_1,
         x_6_1,
         x_7_1,
         x_8_1), Distinct(x_0_2,
         x_1_2,
         x_2_2,
         x_3_2,
         x_4_2,
         x_5_2,
         x_6_2,
         x_7_2,
         x_8_2), Distinct(x_0_3,
         x_1_3,
         x_2_3,
         x_3_3,
         x_4_3,
         x_5_3,
         x_6_3,
         x_7_3,
         x_8_3), Distinct(x_0_4,
         x_1_4,
         x_2_4,
         x_3_4,
         x_4_4,
         x_5_4,
         x_6_4,
         x_7_4,
         x_8_4), Distinct(x_0_5,
         x_1_5,
         x_2_5,
         x_3_5,
         x_4_5,
         x_5_5,
         x_6_5,
         x_7_5,
         x_8_5), Distinct(x_0_6,
         x_1_6,
         x_2_6,
         x_3_6,
         x_4_6,
         x_5_6,
         x_6_6,
         x_7_6,
         x_8_6), Distinct(x_0_7,
         x_1_7,
         x_2_7,
         x_3_7,
         x_4_7,
         x_5_7,
         x_6_7,
         x_7_7,
         x_8_7), Distinct(x_0_8,
         x_1_8,
         x_2_8,
         x_3_8,
         x_4_8,
         x_5_8,
         x_6_8,
         x_7_8,
         x_8_8), Distinct(x_0_0,
         x_0_1,
         x_0_2,
         x_1_0,
         x_1_1,
         x_1_2,
         x_2_0,
         x_2_1,
         x_2_2), Distinct(x_0_3,
         x_0_4,
         x_0_5,
         x_1_3,
         x_1_4,
         x_1_5,
         x_2_3,
         x_2_4,
         x_2_5), Distinct(x_0_6,
         x_0_7,
         x_0_8,
         x_1_6,
         x_1_7,
         x_1_8,
         x_2_6,
         x_2_7,
         x_2_8), Distinct(x_3_0,
         x_3_1,
         x_3_2,
         x_4_0,
         x_4_1,
         x_4_2,
         x_5_0,
         x_5_1,
         x_5_2), Distinct(x_3_3,
         x_3_4,
         x_3_5,
         x_4_3,
         x_4_4,
         x_4_5,
         x_5_3,
         x_5_4,
         x_5_5), Distinct(x_3_6,
         x_3_7,
         x_3_8,
         x_4_6,
         x_4_7,
         x_4_8,
         x_5_6,
         x_5_7,
         x_5_8), Distinct(x_6_0,
         x_6_1,
         x_6_2,
         x_7_0,
         x_7_1,
         x_7_2,
         x_8_0,
         x_8_1,
         x_8_2), Distinct(x_6_3,
         x_6_4,
         x_6_5,
         x_7_3,
         x_7_4,
         x_7_5,
         x_8_3,
         x_8_4,
         x_8_5), Distinct(x_6_6,
         x_6_7,
         x_6_8,
         x_7_6,
         x_7_7,
         x_7_8,
         x_8_6,
         x_8_7,
         x_8_8),

這邊比較模糊的地帶是這裡

If(True, True, x_0_0 == 0), If(True, True, x_0_1 == 0), If(True, True, x_0_2 == 0), If(False, True, x_0_3 == 6), If(True, True, x_0_4 == 0), If(True, True, x_0_5 == 0), If(True, True, x_0_6 == 0), If(False, True, x_0_7 == 3), If(True, True, x_0_8 == 0), If(False, True, x_1_0 == 5), If(True, True, x_1_1 == 0), If(True, True, x_1_2 == 0), If(True, True, x_1_3 == 0), If(True, True, x_1_4 == 0), If(True, True, x_1_5 == 0), If(False, True, x_1_6 == 6), If(True, True, x_1_7 == 0), If(True, True, x_1_8 == 0), If(True, True, x_2_0 == 0), If(False, True, x_2_1 == 9), If(True, True, x_2_2 == 0), If(True, True, x_2_3 == 0), If(True, True, x_2_4 == 0), If(False, True, x_2_5 == 5), If(True, True, x_2_6 == 0), If(True, True, x_2_7 == 0), If(True, True, x_2_8 == 0), If(True, True, x_3_0 == 0), If(True, True, x_3_1 == 0), If(False, True, x_3_2 == 4), If(True, True, x_3_3 == 0), If(False, True, x_3_4 == 1), If(True, True, x_3_5 == 0), If(True, True, x_3_6 == 0), If(True, True, x_3_7 == 0), If(False, True, x_3_8 == 6), If(True, True, x_4_0 == 0), If(True, True, x_4_1 == 0), If(True, True, x_4_2 == 0), If(False, True, x_4_3 == 4), If(True, True, x_4_4 == 0), If(False, True, x_4_5 == 3), If(True, True, x_4_6 == 0), If(True, True, x_4_7 == 0), If(True, True, x_4_8 == 0), If(False, True, x_5_0 == 8), If(True, True, x_5_1 == 0), If(True, True, x_5_2 == 0), If(True, True, x_5_3 == 0), If(False, True, x_5_4 == 9), If(True, True, x_5_5 == 0), If(False, True, x_5_6 == 5), If(True, True, x_5_7 == 0), If(True, True, x_5_8 == 0), If(True, True, x_6_0 == 0), If(True, True, x_6_1 == 0), If(True, True, x_6_2 == 0), If(False, True, x_6_3 == 7), If(True, True, x_6_4 == 0), If(True, True, x_6_5 == 0), If(True, True, x_6_6 == 0), If(False, True, x_6_7 == 4), If(True, True, x_6_8 == 0), If(True, True, x_7_0 == 0), If(True, True, x_7_1 == 0), If(False, True, x_7_2 == 5), If(True, True, x_7_3 == 0), If(True, True, x_7_4 == 0), If(True, True, x_7_5 == 0), If(True, True, x_7_6 == 0), If(True, True, x_7_7 == 0), If(False, True, x_7_8 == 8), If(True, True, x_8_0 == 0), If(False, True, x_8_1 == 3), If(True, True, x_8_2 == 0), If(True, True, x_8_3 == 0), If(True, True, x_8_4 == 0), If(False, True, x_8_5 == 8), If(True, True, x_8_6 == 0), If(True, True, x_8_7 == 0), If(True, True, x_8_8 == 0)]

最終 output ,可以看到 規則是最後一個的也就是假設
board_c = [If(board[i][j] == 0,
True,
X[i][j] == board[i][j])
for i in range(9) for j in range(9)]
我們會進行 sat 求解 只是 前提
這邊舉例
board[i][j] == 0
x_i_j = And(x_0_0 >= 1, x_0_0 <= 9)、、那些上述規則
否則的話 X[i][j] == board[i][j]
也就是X[i][j] 的解答只能是滿足 原本就填上去的數字

[x_6_6 = 9,
 x_4_2 = 7,
 x_1_8 = 7,
 x_3_1 = 2,
 x_0_5 = 9,
 x_2_8 = 1,
 x_4_1 = 5,
 x_7_5 = 4,
 x_6_5 = 2,
 x_8_2 = 9,
 x_5_2 = 3,
 x_4_7 = 1,
 x_6_0 = 1,
 x_7_3 = 9,
 x_7_6 = 1,
 x_0_0 = 7,
 x_4_4 = 8,
 x_6_8 = 3,
 x_4_6 = 2,
 x_2_4 = 7,
 x_5_3 = 2,
 x_3_7 = 8,
 x_5_7 = 7,
 x_1_5 = 1,
 x_0_2 = 1,
 x_2_3 = 8,
 x_8_7 = 5,
 x_3_5 = 7,
 x_6_4 = 5,
 x_1_3 = 3,
 x_3_6 = 3,
 x_6_2 = 8,
 x_8_0 = 4,
 x_3_0 = 9,
 x_8_6 = 7,
 x_4_8 = 9,
 x_1_7 = 9,
 x_7_7 = 6,
 x_8_3 = 1,
 x_2_6 = 4,
 x_7_0 = 2,
 x_0_8 = 5,
 x_5_8 = 4,
 x_0_1 = 4,
 x_0_4 = 2,
 x_5_5 = 6,
 x_2_2 = 6,
 x_4_0 = 6,
 x_8_8 = 2,
 x_6_1 = 6,
 x_2_0 = 3,
 x_3_3 = 5,
 x_7_1 = 7,
 x_1_4 = 4,
 x_7_4 = 3,
 x_8_4 = 6,
 x_0_6 = 8,
 x_2_7 = 2,
 x_1_2 = 2,
 x_5_1 = 1,
 x_1_1 = 8,
 x_8_5 = 8,
 x_8_1 = 3,
 x_7_8 = 8,
 x_7_2 = 5,
 x_6_7 = 4,
 x_6_3 = 7,
 x_5_6 = 5,
 x_5_4 = 9,
 x_5_0 = 8,
 x_4_5 = 3,
 x_4_3 = 4,
 x_3_8 = 6,
 x_3_4 = 1,
 x_3_2 = 4,
 x_2_5 = 5,
 x_2_1 = 9,
 x_1_6 = 6,
 x_1_0 = 5,
 x_0_7 = 3,
 x_0_3 = 6]

整個可以把它理解是在對 這個 x_x_y = ans 去求解