Skip to content

Commit 06523fd

Browse files
l46kokcopybara-github
authored andcommitted
Internal Changes
PiperOrigin-RevId: 951556122
1 parent 077d9a9 commit 06523fd

2 files changed

Lines changed: 24 additions & 5 deletions

File tree

verifier/src/main/java/dev/cel/verifier/CelAstToZ3Translator.java

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -297,7 +297,10 @@ private TranslatedValue translateList(CelExpr celExpr, CelAbstractSyntaxTree ast
297297
}
298298

299299
Expr<?> result = typeSystem.wrapList(listRef);
300-
return TranslatedValue.propagateStrict(ctx, typeSystem, result, celExpr, elementsTv);
300+
boolean hasOptionals = !createList.optionalIndices().isEmpty();
301+
BoolExpr baseTaint = hasOptionals ? ctx.mkTrue() : ctx.mkFalse();
302+
return TranslatedValue.propagateStrict(
303+
ctx, typeSystem, result, Optional.of(celExpr), baseTaint, elementsTv);
301304
}
302305

303306
private TranslatedValue translateMap(CelExpr celExpr, CelAbstractSyntaxTree ast) {
@@ -331,7 +334,11 @@ private TranslatedValue translateMap(CelExpr celExpr, CelAbstractSyntaxTree ast)
331334
typeConstraints.add(ctx.mkEq(typeSystem.getMapKeys(mapRef), keysSeq));
332335

333336
Expr<?> result = typeSystem.wrapMap(mapRef);
334-
return TranslatedValue.propagateStrict(ctx, typeSystem, result, celExpr, elementsTv);
337+
boolean hasOptionals =
338+
createMap.entries().stream().anyMatch(CelExpr.CelMap.Entry::optionalEntry);
339+
BoolExpr baseTaint = hasOptionals ? ctx.mkTrue() : ctx.mkFalse();
340+
return TranslatedValue.propagateStrict(
341+
ctx, typeSystem, result, Optional.of(celExpr), baseTaint, elementsTv);
335342
}
336343

337344
private TranslatedValue translateStruct(CelExpr celExpr, CelAbstractSyntaxTree ast) {
@@ -396,7 +403,11 @@ private TranslatedValue translateStruct(CelExpr celExpr, CelAbstractSyntaxTree a
396403
typeConstraints.add(ctx.mkEq(typeSystem.getMsgPresence(msgRef), msgPresence));
397404

398405
Expr<?> result = typeSystem.wrapMessage(msgRef);
399-
return TranslatedValue.propagateStrict(ctx, typeSystem, result, celExpr, elementsTv);
406+
boolean hasOptionals =
407+
createStruct.entries().stream().anyMatch(CelExpr.CelStruct.Entry::optionalEntry);
408+
BoolExpr baseTaint = hasOptionals ? ctx.mkTrue() : ctx.mkFalse();
409+
return TranslatedValue.propagateStrict(
410+
ctx, typeSystem, result, Optional.of(celExpr), baseTaint, elementsTv);
400411
}
401412

402413
private Expr<?> getDefaultValueForType(CelType type) {
@@ -644,6 +655,12 @@ private <T> T withScope(String varName, TranslatedValue value, Supplier<T> actio
644655
private TranslatedValue translateComprehension(CelExpr celExpr, CelAbstractSyntaxTree ast) {
645656
CelComprehension comp = celExpr.comprehension();
646657
CelExpr iterRangeExpr = comp.iterRange();
658+
if (iterRangeExpr.exprKind().getKind() == ExprKind.Kind.IDENT) {
659+
TranslatedValue boundTv = symbolTable.get(iterRangeExpr.ident().name());
660+
if (boundTv != null) {
661+
iterRangeExpr = boundTv.celExpr().orElse(iterRangeExpr);
662+
}
663+
}
647664
List<IterationElement> iterationElements = new ArrayList<>();
648665
List<BoolExpr> taints = new ArrayList<>();
649666
List<Expr<?>> allRangeElems = new ArrayList<>();

verifier/src/test/java/dev/cel/verifier/CelVerifierZ3ImplTest.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
import dev.cel.common.ast.CelExpr.CelCall;
4343
import dev.cel.common.types.ListType;
4444
import dev.cel.common.types.MapType;
45+
import dev.cel.common.types.OptionalType;
4546
import dev.cel.common.types.ProtoMessageTypeProvider;
4647
import dev.cel.common.types.SimpleType;
4748
import dev.cel.common.types.StructTypeReference;
@@ -87,6 +88,7 @@ public final class CelVerifierZ3ImplTest {
8788
.addVar("y", SimpleType.INT)
8889
.addVar("a", SimpleType.BOOL)
8990
.addVar("b", SimpleType.BOOL)
91+
.addVar("opt_var", OptionalType.create(SimpleType.INT))
9092
.addVar("role", SimpleType.STRING)
9193
.addVar("country", SimpleType.STRING)
9294
.addVar("port", SimpleType.INT)
@@ -1250,8 +1252,8 @@ private enum EquivalenceInconclusiveTestCase {
12501252
"size(int_list) == 6 ? int_list.map(x, 2.0) : [1.0]"),
12511253
TRUNCATION_DIVERGENCE_DIFFERENT_BYTES(
12521254
"size(int_list) == 6 ? int_list.map(x, b'a') : [b'a']",
1253-
"size(int_list) == 6 ? int_list.map(x, b'b') : [b'a']");
1254-
1255+
"size(int_list) == 6 ? int_list.map(x, b'b') : [b'a']"),
1256+
OPTIONAL_DIFFERENT_VALUES("[1, ?opt_var]", "[1]");
12551257
final String exprA;
12561258
final String exprB;
12571259

0 commit comments

Comments
 (0)