
गुणांक-आधारित अंकगणित का पुनर्निर्माण — डीओबफस्केशन के लिए मिश्रित बूलियन-अंकगणित (MBA) अभिव्यक्ति सरलीकरणकर्ता
Coगुणांक-Bआधारित Rपुनर्निर्माण Aअंकगणित — एक मिश्रित बूलियन-अंकगणित अभिव्यक्ति सरलीकरणकर्ता।
CoBRA उन अभिव्यक्तियों को डीऑब्स्केट करता है जो अंकगणितीय (+, -, *) को बिटवाइज़ (&, |, ^, ~) और शिफ्ट (<<, >>) ऑपरेटरों के साथ मिलाती हैं — यह एक ऐसी तकनीक है जिसका उपयोग सॉफ्टवेयर ऑब्स्केशन में आमतौर पर किया जाता है।
$ cobra-cli --mba "(x&y)+(x|y)"
x + y
$ cobra-cli --mba "((a^b)|(a^c)) + 65469 * ~((a&(b&c))) + 65470 * (a&(b&c))" --bitwidth 16
67 + (a | b | c)
$ cobra-cli --mba "((a^b)&c) | ((a&b)^c)"
c ^ a & b
$ cobra-cli --mba "(x&0xFF)+(x&0xFF00)" --bitwidth 16
x
$ cobra-cli --mba "(x ^ 0x10) + 2 * (x & 0x10)"
16 + x
$ cobra-cli --mba "x << 3"
8 * x
$ cobra-cli --mba "~x"
~x
$ cobra-cli --mba "(x^y)*(x&y) + 3*(x|y)"
(x ^ y) * (x & y) + 3 * (x | y)
$ cobra-cli --mba '-357*(x&~y)*(x&y)+102*(x&~y)*(x&~y)+374*(x&~y)*~(x^y)
-306*(x&~y)*~(x|y)-17*(x&~y)*~(x|~y)-105*~(x|~y)*(x&y)+30*~(x|~y)*(x&~y)
+110*~(x|~y)*~(x^y)-90*~(x|~y)*~(x|y)-5*~(x|~y)*~(x|~y)+34*(x&~y)*~x
-85*(x&~y)*~y+10*~(x|~y)*~x-25*~(x|~y)*~y'
22 * (x & y) + -17 * x + -5 * y
CoBRA अभिव्यक्तियों को सरल करने के लिए एक कार्यसूची-आधारित ऑर्केस्ट्रेटर का उपयोग करता है। प्रत्येक इनपुट एक कार्य आइटम के रूप में कार्यसूची में प्रवेश करता है जिसे एक राज्य प्रकार के साथ टैग किया जाता है। एक शेड्यूलर आइटम की स्थिति, पूर्वापेक्षा निर्भरताओं और एक प्रयास कैश के आधार पर अगला पास चुनता है जो अनावश्यक कार्य को रोकता है।
36 अलग-अलग पास परिवारों में व्यवस्थित हैं: AST प्रसंस्करण, हस्ताक्षर-आधारित तकनीकें, अर्धरेखीय तकनीकें, अपघटन, और लिफ्टिंग। कुछ पास स्थानीय विकल्प या चाइल्ड समाधान उत्पन्न करते हैं जो प्रतियोगिता समूहों द्वारा हल किए जाते हैं; उन समूहों के बाहर, कार्यसूची पहले पूरी तरह से सत्यापित शीर्ष-स्तरीय उम्मीदवार लौटाती है। सभी परिणाम यादृच्छिक इनपुट (डिफ़ॉल्ट) या Z3 समतुल्यता प्रमाण (--verify) के माध्यम से स्पॉट-चेक करके सत्यापित किए जाते हैं।
Input Expression
|
[Worklist Scheduler]
|
Work items flow through state kinds:
|
kFoldedAst ──> AST processing passes
| (classify, lower, rewrite)
|
+──> kSignatureState ──> Signature techniques
| (pattern match, CoB, ANF, polynomial recovery)
|
+──> kSemilinearNormalizedIr ──> Semilinear techniques
| (normalize, recover structure, refine, reconstruct)
|
+──> kCoreCandidate / kRemainderState ──> Decomposition
| (extract core, classify residual, solve)
|
+──> kLiftedSkeleton ──> Lifting
| (virtual variable substitution, outer solve)
|
+──> kCandidateExpr ──> Verification
(spot-check or Z3 proof)
|
Simplified Expression
हस्ताक्षर-आधारित तकनीकें सभी बूलियन इनपुट पर अभिव्यक्ति का मूल्यांकन करके एक हस्ताक्षर वेक्टर प्राप्त करती हैं। एक CoB बटरफ्लाई ट्रांसफॉर्म AND-उत्पाद आधार गुणांक पुनर्प्राप्त करता है। पैटर्न मिलान, ANF और बहुपद पुनर्प्राप्ति विभिन्न जटिलता स्तरों को संभालती है।
अर्धरेखीय तकनीकें स्थिर मास्क वाली अभिव्यक्तियों (जैसे x & 0xFF) को संभालती हैं। अभिव्यक्ति को भारित बिटवाइज़ परमाणुओं में विघटित किया जाता है, फिर संरचना पुनर्प्राप्ति और पद शोधन मध्यवर्ती प्रतिनिधित्व को सरल करते हैं, और बिट-विभाजित OR-असेंबली अंतिम परिणाम का पुनर्निर्माण करती है।
अपघटन बिटवाइज़ उप-अभिव्यक्तियों के गुणनफल वाली मिश्रित अभिव्यक्तियों को लक्षित करता है। एक बहुपद कोर निकाला जाता है, फिर अवशेषों को वर्गीकृत और हल किया जाता है (बहुपद, बूलियन-नल/घोस्ट, या टेम्पलेट फॉलबैक)।
लिफ्टिंग जटिल उप-अभिव्यक्तियों को आभासी चरों से बदलता है, सरलीकृत बाहरी कंकाल को हल करता है, फिर वापस प्रतिस्थापित करता है।
k * f(vars) + c<< को गुणन में विस्तारित किया जाता है, >> को अर्धरेखीय तकनीकों द्वारा सरल किया जाता हैपूर्ण विवरण के लिए BUILD.md देखें जिसमें वैकल्पिक निर्भरताएँ (LLVM, Z3) शामिल हैं।
# Build dependencies (Abseil, Highway; optionally GoogleTest, LLVM, Z3)
cmake -S dependencies -B build-deps -DCMAKE_BUILD_TYPE=Release
cmake --build build-deps
# Build CoBRA
cmake -S . -B build \
-DCMAKE_PREFIX_PATH=$(pwd)/build-deps/install \
-DCMAKE_BUILD_TYPE=Release
cmake --build build
# (Optional) Build and run tests
cmake -S dependencies -B build-deps -DCMAKE_BUILD_TYPE=Release -DCOBRA_BUILD_TESTS=ON
cmake --build build-deps
cmake -S . -B build \
-DCMAKE_PREFIX_PATH=$(pwd)/build-deps/install \
-DCMAKE_BUILD_TYPE=Release \
-DCOBRA_BUILD_TESTS=ON
cmake --build build
ctest --test-dir build --output-on-failure
cmake -S . -B build \
-DCMAKE_PREFIX_PATH=$(pwd)/build-deps/install \
-DCOBRA_BUILD_LLVM_PASS=ON \
-DCMAKE_BUILD_TYPE=Release
cmake --build build
# Basic simplification
cobra-cli --mba "(x&y)+(x|y)"
# Specify bitwidth
cobra-cli --mba "(x&0xFF)+(x&0xFF00)" --bitwidth 16
# Enable Z3 equivalence verification
cobra-cli --mba "(a^b)+(a&b)+(a&b)" --verify
# Verbose output (show intermediate pipeline steps)
cobra-cli --mba "(x&y)+(x|y)" --verbose
| फ़्लैग | डिफ़ॉल्ट | विवरण |
|---|---|---|
--mba <expr> | सरल करने के लिए अभिव्यक्ति | |
--bitwidth <n> | 64 | मॉड्यूलर अंकगणित की चौड़ाई (1-64) |
--max-vars <n> | 16 | अधिकतम चर संख्या |
--verify | बंद | Z3 समतुल्यता जाँच |
--verbose | बंद | पाइपलाइन आंतरिक प्रिंट करें |