Skip to content

Commit 1db59c3

Browse files
committed
[TS] Fix CI for the usvm-ts-pbt module
- register usvm-ts-pbt in validateProjectList (the lint job failure) - pin @types/node@22 when building ArkAnalyzer in ci-ts: a transitively hoisted @types/node >= 24 uses TypeScript syntax the AA toolchain cannot parse; both --no-save packages (ohos-typescript is installed --no-save by the AA postinstall script) must go in a single npm install invocation, because every npm install re-resolves the tree and drops previous --no-save additions - run :usvm-ts-pbt:check in the ci-ts job - add detekt baselines for the new module
1 parent f43c77a commit 1db59c3

4 files changed

Lines changed: 122 additions & 1 deletion

File tree

.github/workflows/ci.yml

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,10 +149,16 @@ jobs:
149149
cd $DEST_DIR
150150
151151
npm install
152+
# Transitively hoisted @types/node >= 24 uses TypeScript syntax that the
153+
# ArkAnalyzer toolchain cannot parse; pin a compatible version. Both
154+
# --no-save packages must be installed in one command: each `npm install`
155+
# re-resolves the tree and drops previous --no-save additions
156+
# (ohos-typescript is installed --no-save by the postinstall script).
157+
npm install --no-save @types/node@22 arktools/lib/ohos-typescript-4.9.5-r4-OpenHarmony-v5.0.0-Release.tgz
152158
npm run build
153159
154160
- name: Run TS tests
155-
run: ./gradlew :usvm-ts:check :usvm-ts-dataflow:check
161+
run: ./gradlew :usvm-ts:check :usvm-ts-dataflow:check :usvm-ts-pbt:check
156162

157163
- name: Upload Gradle reports
158164
if: (!cancelled())

build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ tasks.register("validateProjectList") {
2222
project(":usvm-python"),
2323
project(":usvm-ts"),
2424
project(":usvm-ts-dataflow"),
25+
project(":usvm-ts-pbt"),
2526
)
2627

2728
// Gather the actual subprojects from the current root project.
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
<?xml version="1.0" ?>
2+
<SmellBaseline>
3+
<ManuallySuppressedIssues></ManuallySuppressedIssues>
4+
<CurrentIssues>
5+
<ID>ArgumentListWrapping:EtsConcreteInterpreter.kt$EtsConcreteInterpreter.Execution$("cannot set property '${lhv.field.name}' of ${JsSemantics.toStringJs(target)}")</ID>
6+
<ID>ArgumentListWrapping:EtsConcreteInterpreter.kt$EtsConcreteInterpreter.Execution$(JsSemantics.toInt32(eval(left, frame)), JsSemantics.toInt32(eval(right, frame)))</ID>
7+
<ID>ArgumentListWrapping:EtsConcreteInterpreter.kt$EtsConcreteInterpreter.Execution$(eval(left, frame))</ID>
8+
<ID>ArgumentListWrapping:EtsConcreteInterpreter.kt$EtsConcreteInterpreter.Execution$(eval(right, frame))</ID>
9+
<ID>ArgumentListWrapping:EtsConcreteInterpreter.kt$EtsConcreteInterpreter.Execution$(left, frame)</ID>
10+
<ID>ArgumentListWrapping:EtsConcreteInterpreter.kt$EtsConcreteInterpreter.Execution$(op(JsSemantics.toInt32(eval(left, frame)), JsSemantics.toInt32(eval(right, frame))).toDouble())</ID>
11+
<ID>ArgumentListWrapping:EtsConcreteInterpreter.kt$EtsConcreteInterpreter.Execution$(right, frame)</ID>
12+
<ID>ArgumentListWrapping:EtsConcreteInterpreter.kt$EtsConcreteInterpreter.Execution$(target)</ID>
13+
<ID>BracesOnWhenStatements:ConstantMiner.kt$MinedConstants.Companion$when</ID>
14+
<ID>BracesOnWhenStatements:Conversions.kt$when</ID>
15+
<ID>BracesOnWhenStatements:EtsConcreteInterpreter.kt$EtsConcreteInterpreter.Execution$when</ID>
16+
<ID>BracesOnWhenStatements:Generators.kt$InputGenerator$when</ID>
17+
<ID>BracesOnWhenStatements:Intrinsics.kt$Intrinsics$when</ID>
18+
<ID>BracesOnWhenStatements:JsSemantics.kt$JsSemantics$when</ID>
19+
<ID>BracesOnWhenStatements:Main.kt$when</ID>
20+
<ID>BracesOnWhenStatements:PbtPhase.kt$PbtPhase$when</ID>
21+
<ID>EmptyFunctionBlock:CoverageTracker.kt$CoverageTracker${}</ID>
22+
<ID>Filename:ConstantMiner.kt$org.usvm.ts.pbt.gen.ConstantMiner.kt</ID>
23+
<ID>Filename:Generators.kt$org.usvm.ts.pbt.gen.Generators.kt</ID>
24+
<ID>ForbiddenMethodCall:Main.kt$println( " ${m.method}: stmt=%.1f%%, branch=%.1f%% (pbt: %s, symbolic: %s), %d ms".format( m.stmtCoverage * 100, m.branchCoverage * 100, m.pbt?.let { "${it.executions} runs, ${it.failures.size} failures" } ?: "-", m.symbolic?.let { "${it.reached}/${it.targets.size} targets" } ?: "-", m.totalWallMs, ) )</ID>
25+
<ID>ForbiddenMethodCall:Main.kt$println("Analyzing ${methods.size} method(s) in mode $mode...")</ID>
26+
<ID>ForbiddenMethodCall:Main.kt$println("Loading ${files.size} file(s) via ArkAnalyzer...")</ID>
27+
<ID>ForbiddenMethodCall:Main.kt$println("Report written to $out")</ID>
28+
<ID>ForbiddenMethodCall:Main.kt$println("Unknown option: ${args[i]}\n$USAGE")</ID>
29+
<ID>ForbiddenMethodCall:Main.kt$println(USAGE)</ID>
30+
<ID>LoopWithTooManyJumpStatements:PbtPhase.kt$PbtPhase$while</ID>
31+
<ID>MagicNumber:EtsConcreteInterpreter.kt$EtsConcreteInterpreter.Execution$31</ID>
32+
<ID>MagicNumber:Generators.kt$InputGenerator$0.0</ID>
33+
<ID>MagicNumber:Generators.kt$InputGenerator$0.6</ID>
34+
<ID>MagicNumber:Generators.kt$InputGenerator$10</ID>
35+
<ID>MagicNumber:Generators.kt$InputGenerator$100</ID>
36+
<ID>MagicNumber:Generators.kt$InputGenerator$1000</ID>
37+
<ID>MagicNumber:Generators.kt$InputGenerator$1001</ID>
38+
<ID>MagicNumber:Generators.kt$InputGenerator$101</ID>
39+
<ID>MagicNumber:Generators.kt$InputGenerator$11</ID>
40+
<ID>MagicNumber:Generators.kt$InputGenerator$1e6</ID>
41+
<ID>MagicNumber:Generators.kt$InputGenerator$3</ID>
42+
<ID>MagicNumber:Generators.kt$InputGenerator$4</ID>
43+
<ID>MagicNumber:Generators.kt$InputGenerator$5</ID>
44+
<ID>MagicNumber:Generators.kt$InputGenerator$6</ID>
45+
<ID>MagicNumber:Generators.kt$InputGenerator$8</ID>
46+
<ID>MagicNumber:Intrinsics.kt$Intrinsics$9007199254740991.0</ID>
47+
<ID>MagicNumber:JsSemantics.kt$JsSemantics$0xFFFFFFFFL</ID>
48+
<ID>MagicNumber:JsSemantics.kt$JsSemantics$16</ID>
49+
<ID>MagicNumber:JsSemantics.kt$JsSemantics$1e21</ID>
50+
<ID>MagicNumber:JsSemantics.kt$JsSemantics$8</ID>
51+
<ID>MagicNumber:JsSemantics.kt$JsSemantics$9.007199254740992E15</ID>
52+
<ID>MagicNumber:Main.kt$100</ID>
53+
<ID>MagicNumber:Main.kt$20</ID>
54+
<ID>MagicNumber:Main.kt$2_000</ID>
55+
<ID>MagicNumber:PbtPhase.kt$PbtPhase$100</ID>
56+
<ID>MagicNumber:SymbolicPhase.kt$SymbolicPhase$1_000_000</ID>
57+
<ID>MatchingDeclarationName:ConstantMiner.kt$MinedConstants</ID>
58+
<ID>MatchingDeclarationName:Generators.kt$InputGenerator</ID>
59+
<ID>MaxLineLength:EtsConcreteInterpreter.kt$EtsConcreteInterpreter.Execution$)</ID>
60+
<ID>MaxLineLength:EtsConcreteInterpreter.kt$EtsConcreteInterpreter.Execution$throw typeError("cannot set property '${lhv.field.name}' of ${JsSemantics.toStringJs(target)}")</ID>
61+
<ID>MaximumLineLength:EtsConcreteInterpreter.kt$EtsConcreteInterpreter.Execution$ </ID>
62+
<ID>MultiLineIfElse:EtsConcreteInterpreter.kt$EtsConcreteInterpreter.Execution$VNamespace(e.name)</ID>
63+
<ID>MultiLineIfElse:EtsConcreteInterpreter.kt$EtsConcreteInterpreter.Execution$VString(array.value[i.toInt()].toString())</ID>
64+
<ID>MultiLineIfElse:EtsConcreteInterpreter.kt$EtsConcreteInterpreter.Execution$VUndefined</ID>
65+
<ID>MultiLineIfElse:EtsConcreteInterpreter.kt$EtsConcreteInterpreter.Execution$throw UnsupportedFeatureSignal("global ref: ${e.name}")</ID>
66+
<ID>MultiLineIfElse:Generators.kt$InputGenerator$genAny(depth)</ID>
67+
<ID>MultiLineIfElse:Generators.kt$InputGenerator$generate(type.types[random.nextInt(type.types.size)], depth)</ID>
68+
<ID>MultiLineIfElse:Generators.kt$InputGenerator$random.nextDouble(-1e6, 1e6)</ID>
69+
<ID>MultiLineIfElse:Generators.kt$InputGenerator$random.nextInt(-100, 101) + random.nextDouble()</ID>
70+
<ID>MultiLineIfElse:JsSemantics.kt$JsSemantics$d.toLong().toString()</ID>
71+
<ID>MultiLineIfElse:JsSemantics.kt$JsSemantics$java.math.BigDecimal(d).toBigInteger().toString()</ID>
72+
<ID>MultiLineIfElse:PbtPhase.kt$PbtPhase$args</ID>
73+
<ID>NestedBlockDepth:EtsConcreteInterpreter.kt$EtsConcreteInterpreter.Execution$fun runMethod(method: EtsMethod, thisValue: VValue, args: List&lt;VValue&gt;): VValue</ID>
74+
<ID>NestedBlockDepth:EtsConcreteInterpreter.kt$EtsConcreteInterpreter.Execution$private fun assign(lhv: EtsLValue, value: VValue, frame: Frame)</ID>
75+
<ID>NestedBlockDepth:Shrinker.kt$Shrinker$fun shrink(args: List&lt;VValue&gt;, stillFails: (List&lt;VValue&gt;) -&gt; Boolean): List&lt;VValue&gt;</ID>
76+
<ID>NoMultipleSpaces:Generators.kt$InputGenerator$ </ID>
77+
<ID>SwallowedException:EtsConcreteInterpreter.kt$EtsConcreteInterpreter$e: StackOverflowError</ID>
78+
<ID>ThrowsCount:EtsConcreteInterpreter.kt$EtsConcreteInterpreter.Execution$fun evalCall(expr: EtsCallExpr, frame: Frame): VValue</ID>
79+
<ID>ThrowsCount:EtsConcreteInterpreter.kt$EtsConcreteInterpreter.Execution$fun runMethod(method: EtsMethod, thisValue: VValue, args: List&lt;VValue&gt;): VValue</ID>
80+
<ID>ThrowsCount:EtsConcreteInterpreter.kt$EtsConcreteInterpreter.Execution$private fun assign(lhv: EtsLValue, value: VValue, frame: Frame)</ID>
81+
<ID>TooGenericExceptionCaught:SymbolicPhase.kt$SymbolicPhase$e: Throwable</ID>
82+
<ID>UnderscoresInNumericLiterals:Intrinsics.kt$Intrinsics$9007199254740991.0</ID>
83+
<ID>Wrapping:Generators.kt$InputGenerator$;</ID>
84+
<ID>Wrapping:Intrinsics.kt$Intrinsics$(</ID>
85+
<ID>Wrapping:Intrinsics.kt$Intrinsics$;</ID>
86+
</CurrentIssues>
87+
</SmellBaseline>
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
<?xml version="1.0" ?>
2+
<SmellBaseline>
3+
<ManuallySuppressedIssues></ManuallySuppressedIssues>
4+
<CurrentIssues>
5+
<ID>ArgumentListWrapping:ConcreteVsSymbolicDifferentialTest.kt$ConcreteVsSymbolicDifferentialTest$("[$className] compared=${verdict.compared}, skipped=${verdict.skipped}, mismatches=${verdict.mismatches.size}")</ID>
6+
<ID>ArgumentListWrapping:HybridE2eTest.kt$HybridE2eTest$( scene, m, coverage, hints = hints, hintFallback = false, )</ID>
7+
<ID>ArgumentListWrapping:HybridE2eTest.kt$HybridE2eTest$( scene, m, coverage, hints = pbt.typeProfiler.toHints(), )</ID>
8+
<ID>BracesOnWhenStatements:ConcreteVsSymbolicDifferentialTest.kt$ConcreteVsSymbolicDifferentialTest$when</ID>
9+
<ID>CommentSpacing:LoadEts.kt$//-----------------------------------------------------------------------------</ID>
10+
<ID>ForbiddenMethodCall:ConcreteVsSymbolicDifferentialTest.kt$ConcreteVsSymbolicDifferentialTest$println(" MISMATCH: $it")</ID>
11+
<ID>ForbiddenMethodCall:ConcreteVsSymbolicDifferentialTest.kt$ConcreteVsSymbolicDifferentialTest$println("[$className] compared=${verdict.compared}, skipped=${verdict.skipped}, mismatches=${verdict.mismatches.size}")</ID>
12+
<ID>ForbiddenMethodCall:HybridE2eTest.kt$HybridE2eTest$println( "[ablation] with hints: steps=${withHints.steps}, reached=${withHints.reached}, " + "wallMs=${withHints.wallMs}; without: steps=${withoutHints.steps}, " + "reached=${withoutHints.reached}, wallMs=${withoutHints.wallMs}" )</ID>
13+
<ID>ImportOrdering:ConcreteInterpreterDslTest.kt$import org.jacodb.ets.dsl.add import org.jacodb.ets.dsl.and import org.jacodb.ets.dsl.const import org.jacodb.ets.dsl.eqq import org.jacodb.ets.dsl.gt import org.jacodb.ets.dsl.local import org.jacodb.ets.dsl.lt import org.jacodb.ets.dsl.mul import org.jacodb.ets.dsl.neg import org.jacodb.ets.dsl.param import org.jacodb.ets.dsl.program import org.jacodb.ets.dsl.sub import org.jacodb.ets.dsl.toBlockCfg import org.jacodb.ets.dsl.ProgramBuilder import org.jacodb.ets.model.EtsClassSignature import org.jacodb.ets.model.EtsFileSignature import org.jacodb.ets.model.EtsIfStmt import org.jacodb.ets.model.EtsMethod import org.jacodb.ets.model.EtsMethodImpl import org.jacodb.ets.model.EtsMethodParameter import org.jacodb.ets.model.EtsMethodSignature import org.jacodb.ets.model.EtsScene import org.jacodb.ets.model.EtsStmt import org.jacodb.ets.model.EtsUnknownType import org.jacodb.ets.utils.toEtsBlockCfg import org.junit.jupiter.api.Assertions.assertEquals import org.junit.jupiter.api.Assertions.assertTrue import org.junit.jupiter.api.Test</ID>
14+
<ID>MaxLineLength:ConcreteVsSymbolicDifferentialTest.kt$ConcreteVsSymbolicDifferentialTest$println("[$className] compared=${verdict.compared}, skipped=${verdict.skipped}, mismatches=${verdict.mismatches.size}")</ID>
15+
<ID>MaximumLineLength:ConcreteVsSymbolicDifferentialTest.kt$ConcreteVsSymbolicDifferentialTest$ </ID>
16+
<ID>MultiLineIfElse:ConcreteVsSymbolicDifferentialTest.kt$ConcreteVsSymbolicDifferentialTest$compared++</ID>
17+
<ID>MultiLineIfElse:ConcreteVsSymbolicDifferentialTest.kt$ConcreteVsSymbolicDifferentialTest$mismatches += "$ctx: concrete threw ${result.value}, symbolic returned ${test.returnValue}"</ID>
18+
<ID>NestedBlockDepth:ConcreteVsSymbolicDifferentialTest.kt$ConcreteVsSymbolicDifferentialTest$private fun runDifferential(resourcePath: String, className: String): Verdict</ID>
19+
<ID>NoMultipleSpaces:JsSemanticsTest.kt$JsSemanticsTest$ </ID>
20+
<ID>SwallowedException:ConcreteVsSymbolicDifferentialTest.kt$ConcreteVsSymbolicDifferentialTest$e: Throwable</ID>
21+
<ID>UnderscoresInNumericLiterals:HybridE2eTest.kt$HybridE2eTest$49382.0</ID>
22+
<ID>UnderscoresInNumericLiterals:JsSemanticsTest.kt$JsSemanticsTest$4294967295.0</ID>
23+
<ID>UnderscoresInNumericLiterals:JsSemanticsTest.kt$JsSemanticsTest$4294967295L</ID>
24+
<ID>Wrapping:ConcreteVsSymbolicDifferentialTest.kt$ConcreteVsSymbolicDifferentialTest$(</ID>
25+
<ID>Wrapping:ConcreteVsSymbolicDifferentialTest.kt$ConcreteVsSymbolicDifferentialTest$;</ID>
26+
</CurrentIssues>
27+
</SmellBaseline>

0 commit comments

Comments
 (0)