Skip to content

Commit 74f9b32

Browse files
committed
Merge branch 'main' into update-from-main
2 parents b305e15 + 2bef82b commit 74f9b32

113 files changed

Lines changed: 2729 additions & 293 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

cpp/ql/lib/semmle/code/cpp/models/implementations/Strcat.qll

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -50,19 +50,18 @@ class StrcatFunction extends TaintFunction, DataFlowFunction, ArrayFunction, Sid
5050
}
5151

5252
override predicate hasTaintFlow(FunctionInput input, FunctionOutput output) {
53-
this.getName() = ["strncat", "wcsncat", "_mbsncat", "_mbsncat_l"] and
54-
input.isParameter(2) and
55-
output.isParameterDeref(0)
56-
or
57-
this.getName() = ["_mbsncat_l", "_mbsnbcat_l"] and
58-
input.isParameter(3) and
59-
output.isParameterDeref(0)
60-
or
61-
input.isParameterDeref(0) and
62-
output.isParameterDeref(0)
63-
or
64-
input.isParameterDeref(1) and
65-
output.isParameterDeref(0)
53+
(
54+
this.getName() = ["strncat", "wcsncat", "_mbsncat", "_mbsncat_l"] and
55+
input.isParameter(2)
56+
or
57+
this.getName() = ["_mbsncat_l", "_mbsnbcat_l"] and
58+
input.isParameter(3)
59+
or
60+
input.isParameterDeref(0)
61+
or
62+
input.isParameterDeref(1)
63+
) and
64+
(output.isParameterDeref(0) or output.isReturnValueDeref())
6665
}
6766

6867
override predicate hasArrayInput(int param) {

cpp/ql/test/library-tests/dataflow/DefaultTaintTracking/annotate_sinks_only/defaulttainttracking.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ int main() {
1919

2020
char untainted_buf[100] = "";
2121
char buf[100] = "VAR = ";
22-
sink(strcat(buf, getenv("VAR"))); // $ ast MISSING: ir
22+
sink(strcat(buf, getenv("VAR"))); // $ ast,ir
2323

2424
sink(buf); // $ ast,ir
2525
sink(untainted_buf); // the two buffers would be conflated if we added flow through all partial chi inputs

cpp/ql/test/library-tests/dataflow/dataflow-tests/dataflow-consistency.expected

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,4 +87,7 @@ postWithInFlow
8787
| test.cpp:465:3:465:4 | * ... [post update] | PostUpdateNode should not be the target of local flow. |
8888
| test.cpp:465:4:465:4 | p [inner post update] | PostUpdateNode should not be the target of local flow. |
8989
| test.cpp:470:22:470:22 | x [inner post update] | PostUpdateNode should not be the target of local flow. |
90+
| test.cpp:499:3:499:4 | * ... [post update] | PostUpdateNode should not be the target of local flow. |
91+
| test.cpp:499:4:499:4 | p [inner post update] | PostUpdateNode should not be the target of local flow. |
92+
| test.cpp:505:35:505:35 | x [inner post update] | PostUpdateNode should not be the target of local flow. |
9093
viableImplInCallContextTooLarge

cpp/ql/test/library-tests/dataflow/dataflow-tests/test.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -494,3 +494,14 @@ void regression_with_phi_flow(int clean1) {
494494
x = source();
495495
}
496496
}
497+
498+
int intOutparamSourceMissingReturn(int *p) {
499+
*p = source();
500+
// return deliberately omitted to test IR dataflow behavior
501+
}
502+
503+
void viaOutparamMissingReturn() {
504+
int x = 0;
505+
intOutparamSourceMissingReturn(&x);
506+
sink(x); // $ ast MISSING: ir
507+
}

cpp/ql/test/library-tests/dataflow/dataflow-tests/true_upon_entry.cpp

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,31 +5,31 @@ int source();
55
void sink(...);
66
bool random();
77

8-
int test1() {
8+
void test1() {
99
int x = source();
1010
for (int i = 0; i < 10; i++) {
1111
x = 0;
1212
}
1313
sink(x); // $ SPURIOUS: ir
1414
}
1515

16-
int test2(int iterations) {
16+
void test2(int iterations) {
1717
int x = source();
1818
for (int i = 0; i < iterations; i++) {
1919
x = 0;
2020
}
2121
sink(x); // $ ast,ir
2222
}
2323

24-
int test3() {
24+
void test3() {
2525
int x = 0;
2626
for (int i = 0; i < 10; i++) {
2727
x = source();
2828
}
2929
sink(x); // $ ast,ir
3030
}
3131

32-
int test4() {
32+
void test4() {
3333
int x = source();
3434
for (int i = 0; i < 10; i++) {
3535
if (random())
@@ -39,7 +39,7 @@ int test4() {
3939
sink(x); // $ ast,ir
4040
}
4141

42-
int test5() {
42+
void test5() {
4343
int x = source();
4444
for (int i = 0; i < 10; i++) {
4545
if (random())
@@ -49,15 +49,15 @@ int test5() {
4949
sink(x); // $ ast,ir
5050
}
5151

52-
int test6() {
52+
void test6() {
5353
int y;
5454
int x = source();
5555
for (int i = 0; i < 10 && (y = 1); i++) {
5656
}
5757
sink(x); // $ ast,ir
5858
}
5959

60-
int test7() {
60+
void test7() {
6161
int y;
6262
int x = source();
6363
for (int i = 0; i < 10 && (y = 1); i++) {
@@ -66,7 +66,7 @@ int test7() {
6666
sink(x); // $ SPURIOUS: ir
6767
}
6868

69-
int test8() {
69+
void test8() {
7070
int x = source();
7171
// It appears to the analysis that the condition can exit after `i < 10`
7272
// without having assigned to `x`. That is an effect of how the
@@ -78,29 +78,29 @@ int test8() {
7878
sink(x); // $ SPURIOUS: ast,ir
7979
}
8080

81-
int test9() {
81+
void test9() {
8282
int y;
8383
int x = source();
8484
for (int i = 0; (y = 1) && i < 10; i++) {
8585
}
8686
sink(x); // $ ast,ir
8787
}
8888

89-
int test10() {
89+
void test10() {
9090
int x = source();
9191
for (int i = 0; (x = 1) && i < 10; i++) {
9292
}
9393
sink(x); // no flow
9494
}
9595

96-
int test10(int b, int d) {
96+
void test10(int b, int d) {
9797
int i = 0;
9898
int x = source();
9999
if (b)
100100
goto L;
101101
for (; i < 10; i += d) {
102102
x = 0;
103-
L:
103+
L: ;
104104
}
105105
sink(x); // $ ir MISSING: ast
106106
}

cpp/ql/test/library-tests/dataflow/taint-tests/localTaint.expected

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81882,6 +81882,7 @@
8188281882
| taint.cpp:172:10:172:15 | Unary | taint.cpp:172:10:172:15 | Convert | |
8188381883
| taint.cpp:172:10:172:15 | Unary | taint.cpp:172:10:172:15 | buffer | |
8188481884
| taint.cpp:172:10:172:15 | buffer | taint.cpp:172:3:172:8 | call to strcat | |
81885+
| taint.cpp:172:10:172:15 | buffer | taint.cpp:172:3:172:8 | call to strcat indirection | TAINT |
8188581886
| taint.cpp:172:10:172:15 | buffer | taint.cpp:172:10:172:15 | Unary | |
8188681887
| taint.cpp:172:10:172:15 | buffer | taint.cpp:172:10:172:15 | strcat output argument | TAINT |
8188781888
| taint.cpp:172:10:172:15 | buffer | taint.cpp:173:8:173:13 | Unary | |
@@ -81910,11 +81911,13 @@
8191081911
| taint.cpp:172:18:172:24 | VariableAddress indirection | taint.cpp:172:18:172:24 | VariableAddress indirection | TAINT |
8191181912
| taint.cpp:172:18:172:24 | VariableAddress indirection | taint.cpp:172:18:172:24 | tainted | |
8191281913
| taint.cpp:172:18:172:24 | VariableAddress indirection | taint.cpp:172:18:172:24 | tainted indirection | |
81914+
| taint.cpp:172:18:172:24 | tainted | taint.cpp:172:3:172:8 | call to strcat indirection | TAINT |
8191381915
| taint.cpp:172:18:172:24 | tainted | taint.cpp:172:10:172:15 | strcat output argument | TAINT |
8191481916
| taint.cpp:172:18:172:24 | tainted | taint.cpp:172:18:172:24 | Address | TAINT |
8191581917
| taint.cpp:172:18:172:24 | tainted | taint.cpp:172:18:172:24 | Load | |
8191681918
| taint.cpp:172:18:172:24 | tainted | taint.cpp:172:18:172:24 | Unary | |
8191781919
| taint.cpp:172:18:172:24 | tainted indirection | taint.cpp:172:3:172:8 | call to strcat | TAINT |
81920+
| taint.cpp:172:18:172:24 | tainted indirection | taint.cpp:172:3:172:8 | call to strcat indirection | TAINT |
8191881921
| taint.cpp:172:18:172:24 | tainted indirection | taint.cpp:172:10:172:15 | strcat output argument | TAINT |
8191981922
| taint.cpp:172:18:172:24 | tainted indirection | taint.cpp:172:18:172:24 | Convert indirection | |
8192081923
| taint.cpp:172:18:172:24 | tainted indirection | taint.cpp:172:18:172:24 | Load indirection | |
@@ -87306,6 +87309,7 @@
8730687309
| taint.cpp:561:9:561:13 | VariableAddress indirection | taint.cpp:561:9:561:13 | dest1 indirection | |
8730787310
| taint.cpp:561:9:561:13 | VariableAddress indirection | taint.cpp:561:9:561:13 | dest1 indirection | |
8730887311
| taint.cpp:561:9:561:13 | dest1 | taint.cpp:561:2:561:7 | call to strcat | |
87312+
| taint.cpp:561:9:561:13 | dest1 | taint.cpp:561:2:561:7 | call to strcat indirection | TAINT |
8730987313
| taint.cpp:561:9:561:13 | dest1 | taint.cpp:561:9:561:13 | strcat output argument | TAINT |
8731087314
| taint.cpp:561:9:561:13 | dest1 | taint.cpp:562:7:562:11 | dest1 indirection | |
8731187315
| taint.cpp:561:9:561:13 | dest1 indirection | taint.cpp:561:2:561:7 | call to strcat | TAINT |
@@ -87335,12 +87339,14 @@
8733587339
| taint.cpp:561:16:561:21 | VariableAddress indirection | taint.cpp:561:16:561:21 | source | |
8733687340
| taint.cpp:561:16:561:21 | VariableAddress indirection | taint.cpp:561:16:561:21 | source indirection | |
8733787341
| taint.cpp:561:16:561:21 | source | taint.cpp:560:63:560:68 | Address | |
87342+
| taint.cpp:561:16:561:21 | source | taint.cpp:561:2:561:7 | call to strcat indirection | TAINT |
8733887343
| taint.cpp:561:16:561:21 | source | taint.cpp:561:9:561:13 | strcat output argument | TAINT |
8733987344
| taint.cpp:561:16:561:21 | source | taint.cpp:561:16:561:21 | Address | TAINT |
8734087345
| taint.cpp:561:16:561:21 | source | taint.cpp:561:16:561:21 | Load | |
8734187346
| taint.cpp:561:16:561:21 | source | taint.cpp:561:16:561:21 | Unary | |
8734287347
| taint.cpp:561:16:561:21 | source indirection | taint.cpp:560:63:560:68 | Load indirection | |
8734387348
| taint.cpp:561:16:561:21 | source indirection | taint.cpp:561:2:561:7 | call to strcat | TAINT |
87349+
| taint.cpp:561:16:561:21 | source indirection | taint.cpp:561:2:561:7 | call to strcat indirection | TAINT |
8734487350
| taint.cpp:561:16:561:21 | source indirection | taint.cpp:561:9:561:13 | strcat output argument | TAINT |
8734587351
| taint.cpp:561:16:561:21 | source indirection | taint.cpp:561:16:561:21 | Convert indirection | |
8734687352
| taint.cpp:561:16:561:21 | source indirection | taint.cpp:561:16:561:21 | Load indirection | |
@@ -87387,6 +87393,7 @@
8738787393
| taint.cpp:564:9:564:13 | VariableAddress indirection | taint.cpp:564:9:564:13 | dest2 indirection | |
8738887394
| taint.cpp:564:9:564:13 | VariableAddress indirection | taint.cpp:564:9:564:13 | dest2 indirection | |
8738987395
| taint.cpp:564:9:564:13 | dest2 | taint.cpp:564:2:564:7 | call to strcat | |
87396+
| taint.cpp:564:9:564:13 | dest2 | taint.cpp:564:2:564:7 | call to strcat indirection | TAINT |
8739087397
| taint.cpp:564:9:564:13 | dest2 | taint.cpp:564:9:564:13 | strcat output argument | TAINT |
8739187398
| taint.cpp:564:9:564:13 | dest2 | taint.cpp:565:7:565:11 | dest2 indirection | |
8739287399
| taint.cpp:564:9:564:13 | dest2 indirection | taint.cpp:564:2:564:7 | call to strcat | TAINT |
@@ -87416,12 +87423,14 @@
8741687423
| taint.cpp:564:16:564:20 | VariableAddress indirection | taint.cpp:564:16:564:20 | clean | |
8741787424
| taint.cpp:564:16:564:20 | VariableAddress indirection | taint.cpp:564:16:564:20 | clean indirection | |
8741887425
| taint.cpp:564:16:564:20 | clean | taint.cpp:560:50:560:54 | Address | |
87426+
| taint.cpp:564:16:564:20 | clean | taint.cpp:564:2:564:7 | call to strcat indirection | TAINT |
8741987427
| taint.cpp:564:16:564:20 | clean | taint.cpp:564:9:564:13 | strcat output argument | TAINT |
8742087428
| taint.cpp:564:16:564:20 | clean | taint.cpp:564:16:564:20 | Address | TAINT |
8742187429
| taint.cpp:564:16:564:20 | clean | taint.cpp:564:16:564:20 | Load | |
8742287430
| taint.cpp:564:16:564:20 | clean | taint.cpp:564:16:564:20 | Unary | |
8742387431
| taint.cpp:564:16:564:20 | clean indirection | taint.cpp:560:50:560:54 | Load indirection | |
8742487432
| taint.cpp:564:16:564:20 | clean indirection | taint.cpp:564:2:564:7 | call to strcat | TAINT |
87433+
| taint.cpp:564:16:564:20 | clean indirection | taint.cpp:564:2:564:7 | call to strcat indirection | TAINT |
8742587434
| taint.cpp:564:16:564:20 | clean indirection | taint.cpp:564:9:564:13 | strcat output argument | TAINT |
8742687435
| taint.cpp:564:16:564:20 | clean indirection | taint.cpp:564:16:564:20 | Convert indirection | |
8742787436
| taint.cpp:564:16:564:20 | clean indirection | taint.cpp:564:16:564:20 | Load indirection | |
@@ -87614,6 +87623,7 @@
8761487623
| taint.cpp:574:36:574:40 | VariableAddress indirection | taint.cpp:574:36:574:40 | dest1 indirection | |
8761587624
| taint.cpp:574:36:574:40 | _mbsncat_l output argument | taint.cpp:575:7:575:11 | dest1 indirection | |
8761687625
| taint.cpp:574:36:574:40 | dest1 | taint.cpp:574:25:574:34 | Call | |
87626+
| taint.cpp:574:36:574:40 | dest1 | taint.cpp:574:25:574:34 | call to _mbsncat_l indirection | TAINT |
8761787627
| taint.cpp:574:36:574:40 | dest1 | taint.cpp:574:36:574:40 | _mbsncat_l output argument | TAINT |
8761887628
| taint.cpp:574:36:574:40 | dest1 | taint.cpp:575:7:575:11 | dest1 indirection | |
8761987629
| taint.cpp:574:36:574:40 | dest1 indirection | taint.cpp:574:25:574:34 | Call | TAINT |
@@ -87636,9 +87646,11 @@
8763687646
| taint.cpp:574:43:574:45 | VariableAddress indirection | taint.cpp:574:43:574:45 | VariableAddress indirection | TAINT |
8763787647
| taint.cpp:574:43:574:45 | VariableAddress indirection | taint.cpp:574:43:574:45 | ptr indirection | |
8763887648
| taint.cpp:574:43:574:45 | VariableAddress indirection | taint.cpp:574:43:574:45 | ptr indirection | |
87649+
| taint.cpp:574:43:574:45 | ptr | taint.cpp:574:25:574:34 | call to _mbsncat_l indirection | TAINT |
8763987650
| taint.cpp:574:43:574:45 | ptr | taint.cpp:574:36:574:40 | _mbsncat_l output argument | TAINT |
8764087651
| taint.cpp:574:43:574:45 | ptr | taint.cpp:580:43:580:45 | ptr indirection | |
8764187652
| taint.cpp:574:43:574:45 | ptr indirection | taint.cpp:574:25:574:34 | Call | TAINT |
87653+
| taint.cpp:574:43:574:45 | ptr indirection | taint.cpp:574:25:574:34 | call to _mbsncat_l indirection | TAINT |
8764287654
| taint.cpp:574:43:574:45 | ptr indirection | taint.cpp:574:36:574:40 | _mbsncat_l output argument | TAINT |
8764387655
| taint.cpp:574:43:574:45 | ptr indirection | taint.cpp:574:43:574:45 | Address | TAINT |
8764487656
| taint.cpp:574:43:574:45 | ptr indirection | taint.cpp:574:43:574:45 | Load | |
@@ -87654,6 +87666,7 @@
8765487666
| taint.cpp:574:48:574:48 | VariableAddress indirection | taint.cpp:574:48:574:48 | VariableAddress | TAINT |
8765587667
| taint.cpp:574:48:574:48 | VariableAddress indirection | taint.cpp:574:48:574:48 | n indirection | |
8765687668
| taint.cpp:574:48:574:48 | n | taint.cpp:574:25:574:34 | Call | TAINT |
87669+
| taint.cpp:574:48:574:48 | n | taint.cpp:574:25:574:34 | call to _mbsncat_l indirection | TAINT |
8765787670
| taint.cpp:574:48:574:48 | n | taint.cpp:574:36:574:40 | _mbsncat_l output argument | TAINT |
8765887671
| taint.cpp:574:48:574:48 | n | taint.cpp:580:48:580:48 | n indirection | |
8765987672
| taint.cpp:574:48:574:48 | n indirection | taint.cpp:574:48:574:48 | Address | TAINT |
@@ -87671,6 +87684,7 @@
8767187684
| taint.cpp:574:51:574:56 | _mbsncat_l output argument | taint.cpp:573:49:573:54 | Load indirection | |
8767287685
| taint.cpp:574:51:574:56 | source | taint.cpp:573:49:573:54 | Address | |
8767387686
| taint.cpp:574:51:574:56 | source | taint.cpp:574:25:574:34 | Call | TAINT |
87687+
| taint.cpp:574:51:574:56 | source | taint.cpp:574:25:574:34 | call to _mbsncat_l indirection | TAINT |
8767487688
| taint.cpp:574:51:574:56 | source | taint.cpp:574:36:574:40 | _mbsncat_l output argument | TAINT |
8767587689
| taint.cpp:574:51:574:56 | source indirection | taint.cpp:573:49:573:54 | Load indirection | |
8767687690
| taint.cpp:574:51:574:56 | source indirection | taint.cpp:574:51:574:56 | Address | TAINT |
@@ -87814,6 +87828,7 @@
8781487828
| taint.cpp:580:36:580:40 | VariableAddress indirection | taint.cpp:580:36:580:40 | dest3 indirection | |
8781587829
| taint.cpp:580:36:580:40 | _mbsncat_l output argument | taint.cpp:581:7:581:11 | dest3 indirection | |
8781687830
| taint.cpp:580:36:580:40 | dest3 | taint.cpp:580:25:580:34 | Call | |
87831+
| taint.cpp:580:36:580:40 | dest3 | taint.cpp:580:25:580:34 | call to _mbsncat_l indirection | TAINT |
8781787832
| taint.cpp:580:36:580:40 | dest3 | taint.cpp:580:36:580:40 | _mbsncat_l output argument | TAINT |
8781887833
| taint.cpp:580:36:580:40 | dest3 | taint.cpp:581:7:581:11 | dest3 indirection | |
8781987834
| taint.cpp:580:36:580:40 | dest3 indirection | taint.cpp:580:25:580:34 | Call | TAINT |
@@ -87837,9 +87852,11 @@
8783787852
| taint.cpp:580:43:580:45 | VariableAddress indirection | taint.cpp:580:43:580:45 | ptr indirection | |
8783887853
| taint.cpp:580:43:580:45 | VariableAddress indirection | taint.cpp:580:43:580:45 | ptr indirection | |
8783987854
| taint.cpp:580:43:580:45 | ptr | taint.cpp:572:65:572:67 | Address | |
87855+
| taint.cpp:580:43:580:45 | ptr | taint.cpp:580:25:580:34 | call to _mbsncat_l indirection | TAINT |
8784087856
| taint.cpp:580:43:580:45 | ptr | taint.cpp:580:36:580:40 | _mbsncat_l output argument | TAINT |
8784187857
| taint.cpp:580:43:580:45 | ptr indirection | taint.cpp:572:65:572:67 | Load indirection | |
8784287858
| taint.cpp:580:43:580:45 | ptr indirection | taint.cpp:580:25:580:34 | Call | TAINT |
87859+
| taint.cpp:580:43:580:45 | ptr indirection | taint.cpp:580:25:580:34 | call to _mbsncat_l indirection | TAINT |
8784387860
| taint.cpp:580:43:580:45 | ptr indirection | taint.cpp:580:36:580:40 | _mbsncat_l output argument | TAINT |
8784487861
| taint.cpp:580:43:580:45 | ptr indirection | taint.cpp:580:43:580:45 | Address | TAINT |
8784587862
| taint.cpp:580:43:580:45 | ptr indirection | taint.cpp:580:43:580:45 | Load | |
@@ -87854,6 +87871,7 @@
8785487871
| taint.cpp:580:48:580:48 | VariableAddress indirection | taint.cpp:580:48:580:48 | VariableAddress | TAINT |
8785587872
| taint.cpp:580:48:580:48 | VariableAddress indirection | taint.cpp:580:48:580:48 | n indirection | |
8785687873
| taint.cpp:580:48:580:48 | n | taint.cpp:580:25:580:34 | Call | TAINT |
87874+
| taint.cpp:580:48:580:48 | n | taint.cpp:580:25:580:34 | call to _mbsncat_l indirection | TAINT |
8785787875
| taint.cpp:580:48:580:48 | n | taint.cpp:580:36:580:40 | _mbsncat_l output argument | TAINT |
8785887876
| taint.cpp:580:48:580:48 | n indirection | taint.cpp:580:48:580:48 | Address | TAINT |
8785987877
| taint.cpp:580:48:580:48 | n indirection | taint.cpp:580:48:580:48 | Load | |
@@ -87870,6 +87888,7 @@
8787087888
| taint.cpp:580:51:580:55 | _mbsncat_l output argument | taint.cpp:573:32:573:36 | Load indirection | |
8787187889
| taint.cpp:580:51:580:55 | clean | taint.cpp:573:32:573:36 | Address | |
8787287890
| taint.cpp:580:51:580:55 | clean | taint.cpp:580:25:580:34 | Call | TAINT |
87891+
| taint.cpp:580:51:580:55 | clean | taint.cpp:580:25:580:34 | call to _mbsncat_l indirection | TAINT |
8787387892
| taint.cpp:580:51:580:55 | clean | taint.cpp:580:36:580:40 | _mbsncat_l output argument | TAINT |
8787487893
| taint.cpp:580:51:580:55 | clean indirection | taint.cpp:573:32:573:36 | Load indirection | |
8787587894
| taint.cpp:580:51:580:55 | clean indirection | taint.cpp:580:51:580:55 | Address | TAINT |

cpp/ql/test/library-tests/dataflow/taint-tests/taint.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -574,8 +574,8 @@ void test__mbsncat_l(unsigned char* dest1, unsigned const char* ptr, unsigned ch
574574
unsigned char* dest2 = _mbsncat_l(dest1, ptr, n, source);
575575
sink(dest1); // $ SPURIOUS: ir
576576
sink(*dest1); // $ ir
577-
sink(dest2); // $ SPURIOUS: ir
578-
sink(*dest2); // $ MISSING: ir
577+
sink(dest2); // $ SPURIOUS: ast,ir
578+
sink(*dest2); // $ ast,ir
579579

580580
unsigned char* dest4 = _mbsncat_l(dest3, ptr, n, clean);
581581
sink(dest3);

0 commit comments

Comments
 (0)