Skip to content

Commit 92ac5f6

Browse files
committed
C++: Work around 'getUnconvertedResultExpression' having a result for 'CompareNEInstruction's.
1 parent 578dd1f commit 92ac5f6

File tree

4 files changed

+34
-63
lines changed

4 files changed

+34
-63
lines changed

cpp/ql/lib/semmle/code/cpp/controlflow/IRGuards.qll

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -325,6 +325,15 @@ private class GuardConditionFromBinaryLogicalOperator extends GuardCondition {
325325
}
326326
}
327327

328+
bindingset[e]
329+
pragma[inline_late]
330+
private predicate isBoolean(Expr e) {
331+
e.getUnspecifiedType() instanceof BoolType
332+
or
333+
// In C a comparison operation may have an integer type instead of a boolean type.
334+
e instanceof ComparisonOperation
335+
}
336+
328337
/**
329338
* A Boolean condition in the AST that guards one or more basic blocks and has a corresponding IR
330339
* instruction.
@@ -393,6 +402,26 @@ private class GuardConditionFromIR extends GuardCondition {
393402
exists(Instruction i |
394403
i.getUnconvertedResultExpression() = e and
395404
ir.comparesEq(i.getAUse(), k, areEqual, value)
405+
|
406+
// Consider the following snippet:
407+
// ```
408+
// if(myNumber) { ... }
409+
// ```
410+
// the IR for this looks like:
411+
// ```
412+
// r1(glbal<int>) = VariableAddress[myNumber] :
413+
// r2(int) = Load : &r1
414+
// r3(int) = Constant[0] :
415+
// r4(bool) = CompareNE : r2, r3
416+
// v5(void) = ConditionalBranch : r4
417+
// ```
418+
// In both C and C++, the result of calling `getUnconvertedResultExpression`
419+
// on `r4` is the the `myNumber` expression. So users of this predicate
420+
// would conclude that `myNumber = 1` holds on the true branch (since the
421+
// value of `r4` is guarenteed to be `1` on the true branch).
422+
areEqual = false or
423+
not i instanceof CompareNEInstruction or
424+
isBoolean(e)
396425
)
397426
}
398427

@@ -401,6 +430,11 @@ private class GuardConditionFromIR extends GuardCondition {
401430
i.getUnconvertedResultExpression() = e and
402431
ir.comparesEq(i.getAUse(), k, areEqual, value) and
403432
this.valueControls(block, value)
433+
|
434+
// See the comments on `comparesEq` below for why this is necessary.
435+
areEqual = false or
436+
not i instanceof CompareNEInstruction or
437+
isBoolean(e)
404438
)
405439
}
406440

cpp/ql/test/library-tests/controlflow/guards-ir/tests.expected

Lines changed: 0 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,6 @@ astGuardsCompare
7474
| 18 | call to get != 0 when call to get is true |
7575
| 18 | call to get != 1 when call to get is false |
7676
| 18 | call to get == 0 when call to get is false |
77-
| 18 | call to get == 1 when call to get is true |
7877
| 26 | 0 < x+0 when ... > ... is true |
7978
| 26 | 0 >= x+0 when ... > ... is false |
8079
| 26 | ... > ... != 0 when ... > ... is true |
@@ -245,22 +244,16 @@ astGuardsCompare
245244
| 126 | 1 != 0 when ... && ... is true |
246245
| 126 | 1 != 1 when 1 is false |
247246
| 126 | 1 == 0 when 1 is false |
248-
| 126 | 1 == 1 when 1 is true |
249-
| 126 | 1 == 1 when ... && ... is true |
250247
| 126 | call to test3_condition != 0 when ... && ... is true |
251248
| 126 | call to test3_condition != 0 when call to test3_condition is true |
252249
| 126 | call to test3_condition != 1 when call to test3_condition is false |
253250
| 126 | call to test3_condition == 0 when call to test3_condition is false |
254-
| 126 | call to test3_condition == 1 when ... && ... is true |
255-
| 126 | call to test3_condition == 1 when call to test3_condition is true |
256251
| 131 | b != 0 when b is true |
257252
| 131 | b != 1 when b is false |
258253
| 131 | b == 0 when b is false |
259-
| 131 | b == 1 when b is true |
260254
| 137 | 0 != 0 when 0 is true |
261255
| 137 | 0 != 1 when 0 is false |
262256
| 137 | 0 == 0 when 0 is false |
263-
| 137 | 0 == 1 when 0 is true |
264257
| 146 | ! ... != 0 when ! ... is true |
265258
| 146 | ! ... != 1 when ! ... is false |
266259
| 146 | ! ... == 0 when ! ... is false |
@@ -271,14 +264,10 @@ astGuardsCompare
271264
| 152 | x != 0 when x is true |
272265
| 152 | x != 1 when x is false |
273266
| 152 | x == 0 when x is false |
274-
| 152 | x == 1 when ... && ... is true |
275-
| 152 | x == 1 when x is true |
276267
| 152 | y != 0 when ... && ... is true |
277268
| 152 | y != 0 when y is true |
278269
| 152 | y != 1 when y is false |
279270
| 152 | y == 0 when y is false |
280-
| 152 | y == 1 when ... && ... is true |
281-
| 152 | y == 1 when y is true |
282271
| 156 | ... + ... != x+0 when ... == ... is false |
283272
| 156 | ... + ... == x+0 when ... == ... is true |
284273
| 156 | ... == ... != 0 when ... == ... is true |
@@ -340,7 +329,6 @@ astGuardsCompare
340329
| 181 | x != 0 when x is true |
341330
| 181 | x != 1 when x is false |
342331
| 181 | x == 0 when x is false |
343-
| 181 | x == 1 when x is true |
344332
astGuardsControl
345333
| test.c:7:9:7:13 | ... > ... | false | 10 | 11 |
346334
| test.c:7:9:7:13 | ... > ... | true | 7 | 9 |
@@ -819,34 +807,20 @@ astGuardsEnsure_const
819807
| test.c:126:7:126:7 | 1 | test.c:126:7:126:7 | 1 | != | 0 | 131 | 131 |
820808
| test.c:126:7:126:7 | 1 | test.c:126:7:126:7 | 1 | != | 0 | 131 | 132 |
821809
| test.c:126:7:126:7 | 1 | test.c:126:7:126:7 | 1 | != | 0 | 134 | 123 |
822-
| test.c:126:7:126:7 | 1 | test.c:126:7:126:7 | 1 | == | 1 | 126 | 126 |
823-
| test.c:126:7:126:7 | 1 | test.c:126:7:126:7 | 1 | == | 1 | 126 | 128 |
824-
| test.c:126:7:126:7 | 1 | test.c:126:7:126:7 | 1 | == | 1 | 131 | 131 |
825-
| test.c:126:7:126:7 | 1 | test.c:126:7:126:7 | 1 | == | 1 | 131 | 132 |
826-
| test.c:126:7:126:7 | 1 | test.c:126:7:126:7 | 1 | == | 1 | 134 | 123 |
827810
| test.c:126:7:126:28 | ... && ... | test.c:126:7:126:7 | 1 | != | 0 | 126 | 128 |
828-
| test.c:126:7:126:28 | ... && ... | test.c:126:7:126:7 | 1 | == | 1 | 126 | 128 |
829811
| test.c:126:7:126:28 | ... && ... | test.c:126:12:126:26 | call to test3_condition | != | 0 | 126 | 128 |
830-
| test.c:126:7:126:28 | ... && ... | test.c:126:12:126:26 | call to test3_condition | == | 1 | 126 | 128 |
831812
| test.c:126:12:126:26 | call to test3_condition | test.c:126:12:126:26 | call to test3_condition | != | 0 | 126 | 128 |
832-
| test.c:126:12:126:26 | call to test3_condition | test.c:126:12:126:26 | call to test3_condition | == | 1 | 126 | 128 |
833813
| test.c:131:7:131:7 | b | test.c:131:7:131:7 | b | != | 0 | 131 | 132 |
834-
| test.c:131:7:131:7 | b | test.c:131:7:131:7 | b | == | 1 | 131 | 132 |
835814
| test.c:137:7:137:7 | 0 | test.c:137:7:137:7 | 0 | != | 1 | 142 | 136 |
836815
| test.c:137:7:137:7 | 0 | test.c:137:7:137:7 | 0 | == | 0 | 142 | 136 |
837816
| test.c:146:7:146:8 | ! ... | test.c:146:7:146:8 | ! ... | != | 0 | 146 | 147 |
838817
| test.c:146:7:146:8 | ! ... | test.c:146:7:146:8 | ! ... | == | 1 | 146 | 147 |
839818
| test.c:146:7:146:8 | ! ... | test.c:146:8:146:8 | x | == | 0 | 146 | 147 |
840819
| test.c:152:10:152:10 | x | test.c:152:10:152:10 | x | != | 0 | 151 | 152 |
841820
| test.c:152:10:152:10 | x | test.c:152:10:152:10 | x | != | 0 | 152 | 152 |
842-
| test.c:152:10:152:10 | x | test.c:152:10:152:10 | x | == | 1 | 151 | 152 |
843-
| test.c:152:10:152:10 | x | test.c:152:10:152:10 | x | == | 1 | 152 | 152 |
844821
| test.c:152:10:152:15 | ... && ... | test.c:152:10:152:10 | x | != | 0 | 151 | 152 |
845-
| test.c:152:10:152:15 | ... && ... | test.c:152:10:152:10 | x | == | 1 | 151 | 152 |
846822
| test.c:152:10:152:15 | ... && ... | test.c:152:15:152:15 | y | != | 0 | 151 | 152 |
847-
| test.c:152:10:152:15 | ... && ... | test.c:152:15:152:15 | y | == | 1 | 151 | 152 |
848823
| test.c:152:15:152:15 | y | test.c:152:15:152:15 | y | != | 0 | 151 | 152 |
849-
| test.c:152:15:152:15 | y | test.c:152:15:152:15 | y | == | 1 | 151 | 152 |
850824
| test.c:156:9:156:19 | ... == ... | test.c:156:9:156:19 | ... == ... | != | 0 | 156 | 157 |
851825
| test.c:156:9:156:19 | ... == ... | test.c:156:9:156:19 | ... == ... | == | 1 | 156 | 157 |
852826
| test.c:159:9:159:19 | ... == ... | test.c:159:9:159:19 | ... == ... | != | 0 | 159 | 160 |
@@ -865,10 +839,7 @@ astGuardsEnsure_const
865839
| test.c:181:9:181:9 | x | test.c:181:9:181:9 | x | != | 0 | 186 | 180 |
866840
| test.c:181:9:181:9 | x | test.c:181:9:181:9 | x | != | 1 | 183 | 184 |
867841
| test.c:181:9:181:9 | x | test.c:181:9:181:9 | x | == | 0 | 183 | 184 |
868-
| test.c:181:9:181:9 | x | test.c:181:9:181:9 | x | == | 1 | 181 | 182 |
869-
| test.c:181:9:181:9 | x | test.c:181:9:181:9 | x | == | 1 | 186 | 180 |
870842
| test.cpp:18:8:18:10 | call to get | test.cpp:18:8:18:10 | call to get | != | 0 | 19 | 19 |
871-
| test.cpp:18:8:18:10 | call to get | test.cpp:18:8:18:10 | call to get | == | 1 | 19 | 19 |
872843
| test.cpp:31:7:31:13 | ... == ... | test.cpp:31:7:31:7 | x | != | -1 | 30 | 30 |
873844
| test.cpp:31:7:31:13 | ... == ... | test.cpp:31:7:31:7 | x | != | -1 | 34 | 34 |
874845
| test.cpp:31:7:31:13 | ... == ... | test.cpp:31:7:31:7 | x | == | -1 | 30 | 30 |

cpp/ql/test/library-tests/controlflow/guards/GuardsCompare.expected

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,6 @@
4141
| 18 | call to get != 0 when call to get is true |
4242
| 18 | call to get != 1 when call to get is false |
4343
| 18 | call to get == 0 when call to get is false |
44-
| 18 | call to get == 1 when call to get is true |
4544
| 26 | 0 < x+0 when ... > ... is true |
4645
| 26 | 0 >= x+0 when ... > ... is false |
4746
| 26 | ... > ... != 0 when ... > ... is true |
@@ -186,7 +185,6 @@
186185
| 93 | c != 0 when c is true |
187186
| 93 | c != 1 when c is false |
188187
| 93 | c == 0 when c is false |
189-
| 93 | c == 1 when c is true |
190188
| 94 | 0 != x+0 when ... != ... is true |
191189
| 94 | 0 == x+0 when ... != ... is false |
192190
| 94 | ... != ... != 0 when ... != ... is true |
@@ -199,8 +197,6 @@
199197
| 94 | x == 0+0 when ... != ... is false |
200198
| 99 | f != 0 when f is true |
201199
| 99 | f != 1 when f is false |
202-
| 99 | f == 0 when f is false |
203-
| 99 | f == 1 when f is true |
204200
| 102 | 10 < j+1 when ... < ... is false |
205201
| 102 | 10 >= j+1 when ... < ... is true |
206202
| 102 | ... < ... != 0 when ... < ... is true |
@@ -277,14 +273,10 @@
277273
| 126 | 1 != 0 when ... && ... is true |
278274
| 126 | 1 != 1 when 1 is false |
279275
| 126 | 1 == 0 when 1 is false |
280-
| 126 | 1 == 1 when 1 is true |
281-
| 126 | 1 == 1 when ... && ... is true |
282276
| 126 | call to test3_condition != 0 when ... && ... is true |
283277
| 126 | call to test3_condition != 0 when call to test3_condition is true |
284278
| 126 | call to test3_condition != 1 when call to test3_condition is false |
285279
| 126 | call to test3_condition == 0 when call to test3_condition is false |
286-
| 126 | call to test3_condition == 1 when ... && ... is true |
287-
| 126 | call to test3_condition == 1 when call to test3_condition is true |
288280
| 131 | ... + ... != a+0 when call to __builtin_expect is false |
289281
| 131 | ... + ... == a+0 when call to __builtin_expect is true |
290282
| 131 | ... == ... != 0 when call to __builtin_expect is true |
@@ -299,12 +291,10 @@
299291
| 131 | b != 1 when b is false |
300292
| 131 | b != a+-42 when call to __builtin_expect is false |
301293
| 131 | b == 0 when b is false |
302-
| 131 | b == 1 when b is true |
303294
| 131 | b == a+-42 when call to __builtin_expect is true |
304295
| 131 | call to __builtin_expect != 0 when call to __builtin_expect is true |
305296
| 131 | call to __builtin_expect != 1 when call to __builtin_expect is false |
306297
| 131 | call to __builtin_expect == 0 when call to __builtin_expect is false |
307-
| 131 | call to __builtin_expect == 1 when call to __builtin_expect is true |
308298
| 135 | ... != ... != 0 when call to __builtin_expect is true |
309299
| 135 | ... != ... != 1 when call to __builtin_expect is false |
310300
| 135 | ... != ... == 0 when call to __builtin_expect is false |
@@ -320,11 +310,9 @@
320310
| 135 | call to __builtin_expect != 0 when call to __builtin_expect is true |
321311
| 135 | call to __builtin_expect != 1 when call to __builtin_expect is false |
322312
| 135 | call to __builtin_expect == 0 when call to __builtin_expect is false |
323-
| 135 | call to __builtin_expect == 1 when call to __builtin_expect is true |
324313
| 137 | 0 != 0 when 0 is true |
325314
| 137 | 0 != 1 when 0 is false |
326315
| 137 | 0 == 0 when 0 is false |
327-
| 137 | 0 == 1 when 0 is true |
328316
| 141 | 42 != a+0 when call to __builtin_expect is false |
329317
| 141 | 42 == a+0 when call to __builtin_expect is true |
330318
| 141 | ... == ... != 0 when call to __builtin_expect is true |
@@ -338,7 +326,6 @@
338326
| 141 | call to __builtin_expect != 0 when call to __builtin_expect is true |
339327
| 141 | call to __builtin_expect != 1 when call to __builtin_expect is false |
340328
| 141 | call to __builtin_expect == 0 when call to __builtin_expect is false |
341-
| 141 | call to __builtin_expect == 1 when call to __builtin_expect is true |
342329
| 145 | 42 != a+0 when call to __builtin_expect is true |
343330
| 145 | 42 == a+0 when call to __builtin_expect is false |
344331
| 145 | ... != ... != 0 when call to __builtin_expect is true |
@@ -352,7 +339,6 @@
352339
| 145 | call to __builtin_expect != 0 when call to __builtin_expect is true |
353340
| 145 | call to __builtin_expect != 1 when call to __builtin_expect is false |
354341
| 145 | call to __builtin_expect == 0 when call to __builtin_expect is false |
355-
| 145 | call to __builtin_expect == 1 when call to __builtin_expect is true |
356342
| 146 | ! ... != 0 when ! ... is true |
357343
| 146 | ! ... != 1 when ! ... is false |
358344
| 146 | ! ... == 0 when ! ... is false |
@@ -362,7 +348,6 @@
362348
| 152 | p != 0 when p is true |
363349
| 152 | p != 1 when p is false |
364350
| 152 | p == 0 when p is false |
365-
| 152 | p == 1 when p is true |
366351
| 158 | ! ... != 0 when ! ... is true |
367352
| 158 | ! ... != 1 when ! ... is false |
368353
| 158 | ! ... == 0 when ! ... is false |
@@ -372,7 +357,6 @@
372357
| 164 | s != 0 when s is true |
373358
| 164 | s != 1 when s is false |
374359
| 164 | s == 0 when s is false |
375-
| 164 | s == 1 when s is true |
376360
| 170 | ! ... != 0 when ! ... is true |
377361
| 170 | ! ... != 1 when ! ... is false |
378362
| 170 | ! ... == 0 when ! ... is false |

cpp/ql/test/library-tests/controlflow/guards/GuardsEnsure.expected

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -424,36 +424,24 @@ unary
424424
| test.c:126:7:126:7 | 1 | test.c:126:7:126:7 | 1 | != | 0 | 131 | 131 |
425425
| test.c:126:7:126:7 | 1 | test.c:126:7:126:7 | 1 | != | 0 | 131 | 132 |
426426
| test.c:126:7:126:7 | 1 | test.c:126:7:126:7 | 1 | != | 0 | 134 | 123 |
427-
| test.c:126:7:126:7 | 1 | test.c:126:7:126:7 | 1 | == | 1 | 126 | 126 |
428-
| test.c:126:7:126:7 | 1 | test.c:126:7:126:7 | 1 | == | 1 | 126 | 128 |
429-
| test.c:126:7:126:7 | 1 | test.c:126:7:126:7 | 1 | == | 1 | 131 | 131 |
430-
| test.c:126:7:126:7 | 1 | test.c:126:7:126:7 | 1 | == | 1 | 131 | 132 |
431-
| test.c:126:7:126:7 | 1 | test.c:126:7:126:7 | 1 | == | 1 | 134 | 123 |
432427
| test.c:126:7:126:28 | ... && ... | test.c:126:7:126:7 | 1 | != | 0 | 126 | 128 |
433-
| test.c:126:7:126:28 | ... && ... | test.c:126:7:126:7 | 1 | == | 1 | 126 | 128 |
434428
| test.c:126:7:126:28 | ... && ... | test.c:126:12:126:26 | call to test3_condition | != | 0 | 126 | 128 |
435-
| test.c:126:7:126:28 | ... && ... | test.c:126:12:126:26 | call to test3_condition | == | 1 | 126 | 128 |
436429
| test.c:126:12:126:26 | call to test3_condition | test.c:126:12:126:26 | call to test3_condition | != | 0 | 126 | 128 |
437-
| test.c:126:12:126:26 | call to test3_condition | test.c:126:12:126:26 | call to test3_condition | == | 1 | 126 | 128 |
438430
| test.c:131:7:131:7 | b | test.c:131:7:131:7 | b | != | 0 | 131 | 132 |
439-
| test.c:131:7:131:7 | b | test.c:131:7:131:7 | b | == | 1 | 131 | 132 |
440431
| test.c:137:7:137:7 | 0 | test.c:137:7:137:7 | 0 | != | 1 | 142 | 136 |
441432
| test.c:137:7:137:7 | 0 | test.c:137:7:137:7 | 0 | == | 0 | 142 | 136 |
442433
| test.c:146:7:146:8 | ! ... | test.c:146:7:146:8 | ! ... | != | 0 | 146 | 147 |
443434
| test.c:146:7:146:8 | ! ... | test.c:146:7:146:8 | ! ... | == | 1 | 146 | 147 |
444435
| test.c:146:7:146:8 | ! ... | test.c:146:8:146:8 | x | == | 0 | 146 | 147 |
445436
| test.c:152:8:152:8 | p | test.c:152:8:152:8 | p | != | 0 | 152 | 154 |
446-
| test.c:152:8:152:8 | p | test.c:152:8:152:8 | p | == | 1 | 152 | 154 |
447437
| test.c:158:8:158:9 | ! ... | test.c:158:8:158:9 | ! ... | != | 0 | 158 | 160 |
448438
| test.c:158:8:158:9 | ! ... | test.c:158:8:158:9 | ! ... | == | 1 | 158 | 160 |
449439
| test.c:158:8:158:9 | ! ... | test.c:158:9:158:9 | p | == | 0 | 158 | 160 |
450440
| test.c:164:8:164:8 | s | test.c:164:8:164:8 | s | != | 0 | 164 | 166 |
451-
| test.c:164:8:164:8 | s | test.c:164:8:164:8 | s | == | 1 | 164 | 166 |
452441
| test.c:170:8:170:9 | ! ... | test.c:170:8:170:9 | ! ... | != | 0 | 170 | 172 |
453442
| test.c:170:8:170:9 | ! ... | test.c:170:8:170:9 | ! ... | == | 1 | 170 | 172 |
454443
| test.c:170:8:170:9 | ! ... | test.c:170:9:170:9 | s | == | 0 | 170 | 172 |
455444
| test.cpp:18:8:18:10 | call to get | test.cpp:18:8:18:10 | call to get | != | 0 | 19 | 19 |
456-
| test.cpp:18:8:18:10 | call to get | test.cpp:18:8:18:10 | call to get | == | 1 | 19 | 19 |
457445
| test.cpp:31:7:31:13 | ... == ... | test.cpp:31:7:31:7 | x | != | -1 | 30 | 30 |
458446
| test.cpp:31:7:31:13 | ... == ... | test.cpp:31:7:31:7 | x | != | -1 | 34 | 34 |
459447
| test.cpp:31:7:31:13 | ... == ... | test.cpp:31:7:31:7 | x | == | -1 | 30 | 30 |
@@ -477,9 +465,7 @@ unary
477465
| test.cpp:74:10:74:10 | i | test.cpp:74:10:74:10 | i | >= | 0 | 75 | 77 |
478466
| test.cpp:74:10:74:10 | i | test.cpp:74:10:74:10 | i | >= | 11 | 78 | 79 |
479467
| test.cpp:93:6:93:6 | c | test.cpp:93:6:93:6 | c | != | 0 | 93 | 94 |
480-
| test.cpp:93:6:93:6 | c | test.cpp:93:6:93:6 | c | == | 1 | 93 | 94 |
481468
| test.cpp:99:6:99:6 | f | test.cpp:99:6:99:6 | f | != | 0 | 99 | 100 |
482-
| test.cpp:99:6:99:6 | f | test.cpp:99:6:99:6 | f | == | 1 | 99 | 100 |
483469
| test.cpp:105:6:105:14 | ... != ... | test.cpp:105:6:105:14 | ... != ... | != | 0 | 105 | 106 |
484470
| test.cpp:105:6:105:14 | ... != ... | test.cpp:105:6:105:14 | ... != ... | == | 1 | 105 | 106 |
485471
| test.cpp:111:6:111:14 | ... != ... | test.cpp:111:6:111:14 | ... != ... | != | 0 | 111 | 112 |
@@ -495,20 +481,16 @@ unary
495481
| test.cpp:125:14:125:17 | call to safe | test.cpp:125:14:125:17 | call to safe | != | 1 | 125 | 125 |
496482
| test.cpp:125:14:125:17 | call to safe | test.cpp:125:14:125:17 | call to safe | == | 0 | 125 | 125 |
497483
| test.cpp:131:6:131:21 | call to __builtin_expect | test.cpp:131:6:131:21 | call to __builtin_expect | != | 0 | 131 | 132 |
498-
| test.cpp:131:6:131:21 | call to __builtin_expect | test.cpp:131:6:131:21 | call to __builtin_expect | == | 1 | 131 | 132 |
499484
| test.cpp:131:6:131:21 | call to __builtin_expect | test.cpp:131:23:131:33 | ... == ... | != | 0 | 131 | 132 |
500485
| test.cpp:131:6:131:21 | call to __builtin_expect | test.cpp:131:23:131:33 | ... == ... | == | 1 | 131 | 132 |
501486
| test.cpp:135:6:135:21 | call to __builtin_expect | test.cpp:135:6:135:21 | call to __builtin_expect | != | 0 | 135 | 136 |
502-
| test.cpp:135:6:135:21 | call to __builtin_expect | test.cpp:135:6:135:21 | call to __builtin_expect | == | 1 | 135 | 136 |
503487
| test.cpp:135:6:135:21 | call to __builtin_expect | test.cpp:135:23:135:33 | ... != ... | != | 0 | 135 | 136 |
504488
| test.cpp:135:6:135:21 | call to __builtin_expect | test.cpp:135:23:135:33 | ... != ... | == | 1 | 135 | 136 |
505489
| test.cpp:141:6:141:21 | call to __builtin_expect | test.cpp:141:6:141:21 | call to __builtin_expect | != | 0 | 141 | 142 |
506-
| test.cpp:141:6:141:21 | call to __builtin_expect | test.cpp:141:6:141:21 | call to __builtin_expect | == | 1 | 141 | 142 |
507490
| test.cpp:141:6:141:21 | call to __builtin_expect | test.cpp:141:23:141:23 | a | == | 42 | 141 | 142 |
508491
| test.cpp:141:6:141:21 | call to __builtin_expect | test.cpp:141:23:141:29 | ... == ... | != | 0 | 141 | 142 |
509492
| test.cpp:141:6:141:21 | call to __builtin_expect | test.cpp:141:23:141:29 | ... == ... | == | 1 | 141 | 142 |
510493
| test.cpp:145:6:145:21 | call to __builtin_expect | test.cpp:145:6:145:21 | call to __builtin_expect | != | 0 | 145 | 146 |
511-
| test.cpp:145:6:145:21 | call to __builtin_expect | test.cpp:145:6:145:21 | call to __builtin_expect | == | 1 | 145 | 146 |
512494
| test.cpp:145:6:145:21 | call to __builtin_expect | test.cpp:145:23:145:23 | a | != | 42 | 145 | 146 |
513495
| test.cpp:145:6:145:21 | call to __builtin_expect | test.cpp:145:23:145:29 | ... != ... | != | 0 | 145 | 146 |
514496
| test.cpp:145:6:145:21 | call to __builtin_expect | test.cpp:145:23:145:29 | ... != ... | == | 1 | 145 | 146 |

0 commit comments

Comments
 (0)