Skip to content

Commit

Permalink
Merge pull request #29 from Consensys/succ
Browse files Browse the repository at this point in the history
Succ relation and Souffle AST and parser
  • Loading branch information
cd1m0 authored Mar 9, 2024
2 parents 5fc366e + 0499e67 commit f263a41
Show file tree
Hide file tree
Showing 75 changed files with 6,333 additions and 875 deletions.
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -6,5 +6,7 @@ tmp/
src/gen/translate.ts
src/gen/declarations.ts
src/lib/souffle/value_parser.ts
src/lib/souffle/parser/souffle_parser_gen.js
src/lib/souffle/parser/souffle_value_parser_gen.js
functors/functors.o
functors/libfunctors.so
2,101 changes: 1,411 additions & 690 deletions package-lock.json

Large diffs are not rendered by default.

11 changes: 6 additions & 5 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,14 +11,16 @@
"sol-datalog-cli": "dist/bin/cli.js"
},
"scripts": {
"clean": "rm -rf dist/ && rm -rf src/gen/declarations.ts src/gen/translate.ts",
"clean": "rm -rf dist/ && rm -rf src/gen/declarations.ts src/gen/translate.ts souffle_parser_gen.js souffle_value_parser_gen.js",
"transpile": "tsc",
"gen-translation-modules": "node scripts/gen_translation_modules.js && eslint --fix src/gen/translate.ts src/gen/declarations.ts",
"copy-dl": "cp -r src/lib/analyses dist/lib && cp -r src/lib/detectors dist/lib",
"copy-functors": "cp -r functors dist/",
"build-parser": "tspegjs -o src/lib/souffle/value_parser.ts --custom-header-file src/lib/souffle/value_header.ts --allowed-start-rules Value --cache src/lib/souffle/values.pegjs",
"build-parser": "jison src/lib/souffle/parser/souffle.jison -o src/lib/souffle/parser/souffle_parser_gen.js -m commonjs && cp src/lib/souffle/parser/souffle_parser_gen.js dist/lib/souffle/parser/souffle_parser_gen.js",
"build-expr-parser": "jison src/lib/souffle/parser/souffle_value.jison -o src/lib/souffle/parser/souffle_value_parser_gen.js -m commonjs && cp src/lib/souffle/parser/souffle_value_parser_gen.js dist/lib/souffle/parser/souffle_value_parser_gen.js",
"build-parsers": "npm run build-parser && npm run build-expr-parser",
"build-functors": "./scripts/build_functors.sh",
"build": "npm run clean && npm run gen-translation-modules && npm run build-parser && npm run transpile && chmod a+x dist/bin/cli.js && npm run copy-dl && npm run build-functors && npm run copy-functors",
"build": "npm run clean && npm run gen-translation-modules && npm run transpile && npm run build-parsers && chmod a+x dist/bin/cli.js && npm run copy-dl && npm run build-functors && npm run copy-functors",
"test": "c8 mocha",
"lint": "eslint src/ test/ --ext=ts",
"lint:fix": "eslint src/ test/ --ext=ts --fix",
Expand Down Expand Up @@ -51,8 +53,7 @@
"prettier": "3.2.5",
"ts-node": "^10.9.2",
"typescript": "^5.3.3",
"peggy": "^2.0.1",
"ts-pegjs": "^3.1.0"
"jison": "^0.4.18"
},
"repository": {
"type": "git",
Expand Down
38 changes: 36 additions & 2 deletions scripts/gen_translation_modules.js
Original file line number Diff line number Diff line change
Expand Up @@ -114,7 +114,7 @@ const staticPreamble = `
.decl ContractDefinition_linearizedBaseContracts(parentId: ContractDefinitionId, childId: ContractDefinitionId, idx: number)
.decl ContractDefinition_usedErrors(parentId: ContractDefinitionId, childId: ErrorDefinitionId, idx: number)
.decl ContractDefinition_usedEvents(parentId: ContractDefinitionId, childId: EventDefinitionId, idx: number)
.decl TupleExpression_components(parentId: TupleExpressionId, childId: ExpressionId, idx: number)
.decl TupleExpression_components(parentId: TupleExpressionId, childId: ExpressionId, idx: number, realIdx: number)
.decl FunctionDefinition_modifiers(parentId: FunctionDefinitionId, childId: ModifierInvocationId, idx: number)
.decl FunctionCall_arguments(parentId: FunctionCallId, childId: ExpressionId, idx: number)
.decl TryStatement_clauses(parentId: TryStatementId, childId: TryCatchClauseId, idx: number)
Expand All @@ -127,7 +127,7 @@ const staticPreamble = `
.decl UsingForDirective_functionList(parentId: UsingForDirectiveId, childId: IdentifierPathId, operator: symbol, idx: number)
.decl StructDefinition_members(parentId: StructDefinitionId, childId: VariableDeclarationId, idx: number)
.decl EnumDefinition_members(parentId: EnumDefinitionId, childId: EnumValueId, idx: number)
.decl VariableDeclarationStatement_assignments(parentId: VariableDeclarationStatementId, childId: VariableDeclarationId, idx: number)
.decl VariableDeclarationStatement_assignments(parentId: VariableDeclarationStatementId, childId: VariableDeclarationId, idx: number, realIdx: number)
.decl OverrideSpecifier_overrides(parentId: OverrideSpecifierId, childId: id, idx: number)
.decl FunctionCall_fieldNames(parentId: FunctionCallId, name: symbol, idx: number)
Expand Down Expand Up @@ -739,6 +739,32 @@ function buildFactInvocation(className, constructor, baseName) {
}
`;
}
// Add relations for sparse array arguments
for (let [paramName, ,] of params.slice(2)) {
const canonicalParamName = getCanonicalParamName(className, paramName);
if (
!(
(className === "TupleExpression" && canonicalParamName === "components") ||
(className === "VariableDeclarationStatement" &&
canonicalParamName === "assignments")
)
) {
continue;
}

res += `
for (let realI = 0, i = 0; realI < nd.${canonicalParamName}.length; realI++) {
let t = nd.${canonicalParamName}[realI];
if (t === null || t === undefined) {
continue;
}
res.push(\`${className}_${paramName}(\${nd.id}, \${t}, \${i}, \${realI}).\`);
i++;
}
`;
}

// Add relations for array arguments
for (let [paramName, optional, type] of params.slice(2)) {
Expand All @@ -752,6 +778,14 @@ function buildFactInvocation(className, constructor, baseName) {

const canonicalParamName = getCanonicalParamName(className, paramName);

// Skip sparse arrays. We need special logic for them
if (
(className === "TupleExpression" && canonicalParamName === "components") ||
(className === "VariableDeclarationStatement" && canonicalParamName === "assignments")
) {
continue;
}

const args = [`\${nd.id}`];

if (type === `number[]`) {
Expand Down
2 changes: 1 addition & 1 deletion src/lib/analyses/calltree.dl
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ callsDirectly(caller, callee) :-
ancestor(caller, callId).

.type CallPath = [ head: FunctionDefinitionId, tail: CallPath ]
.functor isSubsequence(CallPath, CallPath):number stateful
.functor isSubsequence(a: CallPath, b: CallPath):number stateful

.decl callsPath(caller: FunctionDefinitionId, callee: FunctionDefinitionId, path: CallPath)

Expand Down
4 changes: 2 additions & 2 deletions src/lib/analyses/cfg/dominate.dl
Original file line number Diff line number Diff line change
Expand Up @@ -76,8 +76,8 @@ dominate(pred, succ) :-
/// TupleExpression
dominate(pred, succ) :-
TupleExpression(tId),
TupleExpression_components(tId, pred, i),
TupleExpression_components(tId, succ, i + 1).
TupleExpression_components(tId, pred, i, _),
TupleExpression_components(tId, succ, i + 1, _).

/// Domination is transitive
dominate(pred, succ) :- dominate(pred, x), dominate(x, succ).
Loading

0 comments on commit f263a41

Please sign in to comment.