Skip to content

Commit 4c14393

Browse files
authored
Merge pull request #22455 from trail-of-forks/kumarak/cpp-bdlbb-blob-models
cpp: model BDE bdlbb::Blob byte-buffer taint flow
2 parents 1e57e0a + 9559357 commit 4c14393

6 files changed

Lines changed: 215 additions & 2 deletions

File tree

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
---
2+
category: minorAnalysis
3+
---
4+
* Added flow summaries for the BDE `BloombergLP::bdlbb::Blob` segmented byte buffer.

cpp/ql/lib/ext/bdlbb.model.yml

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
# Model of the BDE bdlbb::Blob segmented byte buffer (BloombergLP::bdlbb).
2+
# Lets taint reach a blob's payload bytes, e.g. a message body filled by bmqa::Message::getData.
3+
extensions:
4+
- addsTo:
5+
pack: codeql/cpp-all
6+
extensible: summaryModel
7+
data: # namespace, type, subtypes, name, signature, ext, input, output, kind, provenance
8+
# Accessor chain
9+
- ["BloombergLP::bdlbb", "Blob", true, "buffer", "", "", "Argument[-1]", "ReturnValue[*]", "taint", "manual"]
10+
- ["BloombergLP::bdlbb", "BlobBuffer", true, "data", "", "", "Argument[-1]", "ReturnValue[*]", "taint", "manual"]
11+
- ["BloombergLP::bdlbb", "BlobBuffer", true, "buffer", "", "", "Argument[-1]", "ReturnValue[*]", "taint", "manual"]
12+
# BlobUtil read-out
13+
- ["BloombergLP::bdlbb", "BlobUtil", true, "copy", "(char *,const Blob &,int,int)", "", "Argument[*1]", "Argument[*0]", "taint", "manual"]
14+
- ["BloombergLP::bdlbb", "BlobUtil", true, "getContiguousRangeOrCopy", "", "", "Argument[*1]", "Argument[*0]", "taint", "manual"]
15+
- ["BloombergLP::bdlbb", "BlobUtil", true, "getContiguousRangeOrCopy", "", "", "Argument[*1]", "ReturnValue[*]", "taint", "manual"]
16+
# BlobUtil write-in
17+
- ["BloombergLP::bdlbb", "BlobUtil", true, "copy", "(Blob *,int,const char *,int)", "", "Argument[*2]", "Argument[*0]", "taint", "manual"]
18+
- ["BloombergLP::bdlbb", "BlobUtil", true, "copy", "(Blob *,int,const Blob &,int,int)", "", "Argument[*2]", "Argument[*0]", "taint", "manual"]
Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
2+
// --- stub library headers ---
3+
4+
namespace bsl {
5+
typedef unsigned long size_t;
6+
template <class T> class allocator {};
7+
template<class charT> struct char_traits {};
8+
template<class charT, class traits = char_traits<charT>, class Allocator = allocator<charT> >
9+
class basic_string {
10+
public:
11+
basic_string(const charT* s, const Allocator& a = Allocator());
12+
const charT* data() const;
13+
size_t size() const;
14+
};
15+
typedef basic_string<char> string;
16+
template <class T> class shared_ptr {
17+
public:
18+
T *get() const;
19+
};
20+
}
21+
22+
namespace BloombergLP {
23+
namespace bdlbb {
24+
class BlobBuffer {
25+
public:
26+
char *data() const;
27+
bsl::shared_ptr<char> &buffer();
28+
const bsl::shared_ptr<char> &buffer() const;
29+
};
30+
31+
class Blob {
32+
public:
33+
const BlobBuffer &buffer(int index) const;
34+
};
35+
36+
struct BlobUtil {
37+
static void copy(char *dstBuffer, const Blob &srcBlob, int position, int length);
38+
static void copy(Blob *dstBlob, int dstOffset, const char *srcBuffer, int length);
39+
static void copy(Blob *dstBlob, int dstOffset, const Blob &srcBlob, int srcOffset,
40+
int length);
41+
static char *getContiguousRangeOrCopy(char *dstBuffer, const Blob &srcBlob, int position,
42+
int length, int alignment);
43+
};
44+
}
45+
}
46+
47+
// --- test code ---
48+
49+
char *source();
50+
void sink(char);
51+
52+
// A blob populated from a tainted buffer taints the bytes read back out of it.
53+
void test_BlobUtil_copy() {
54+
bsl::string s(source());
55+
BloombergLP::bdlbb::Blob blob;
56+
BloombergLP::bdlbb::BlobUtil::copy(&blob, 0, s.data(), s.size());
57+
char dst[16];
58+
BloombergLP::bdlbb::BlobUtil::copy(dst, blob, 0, 16);
59+
sink(*dst); // $ ir
60+
}
61+
62+
void test_accessor_chain() {
63+
bsl::string s(source());
64+
BloombergLP::bdlbb::Blob blob;
65+
BloombergLP::bdlbb::BlobUtil::copy(&blob, 0, s.data(), s.size());
66+
const char *p = blob.buffer(0).data();
67+
sink(*p); // $ ir
68+
}
69+
70+
// The get() step comes from the built-in smart pointer model, not from bdlbb.model.yml.
71+
void test_accessor_chain_shared_ptr() {
72+
bsl::string s(source());
73+
BloombergLP::bdlbb::Blob blob;
74+
BloombergLP::bdlbb::BlobUtil::copy(&blob, 0, s.data(), s.size());
75+
const char *p = blob.buffer(0).buffer().get();
76+
sink(*p); // $ ir
77+
}
78+
79+
void test_getContiguousRangeOrCopy() {
80+
bsl::string s(source());
81+
BloombergLP::bdlbb::Blob blob;
82+
BloombergLP::bdlbb::BlobUtil::copy(&blob, 0, s.data(), s.size());
83+
char dst[16];
84+
char *r = BloombergLP::bdlbb::BlobUtil::getContiguousRangeOrCopy(dst, blob, 0, 16, 1);
85+
sink(*r); // $ ir
86+
}
87+
88+
// A blob copied into another blob carries the taint across.
89+
void test_BlobUtil_copy_blob_to_blob() {
90+
bsl::string s(source());
91+
BloombergLP::bdlbb::Blob src;
92+
BloombergLP::bdlbb::BlobUtil::copy(&src, 0, s.data(), s.size());
93+
BloombergLP::bdlbb::Blob dst;
94+
BloombergLP::bdlbb::BlobUtil::copy(&dst, 0, src, 0, 16);
95+
char out[16];
96+
BloombergLP::bdlbb::BlobUtil::copy(out, dst, 0, 16);
97+
sink(*out); // $ ir
98+
}

cpp/ql/test/library-tests/dataflow/external-models/flow.expected

Lines changed: 78 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,14 @@ models
9595
| 94 | Summary: Azure::Core::IO; BodyStream; true; ReadToCount; ; ; Argument[-1]; Argument[*0]; taint; manual |
9696
| 95 | Summary: Azure::Core::IO; BodyStream; true; ReadToEnd; ; ; Argument[-1]; ReturnValue.Element; taint; manual |
9797
| 96 | Summary: Azure; Nullable; true; Value; ; ; Argument[-1]; ReturnValue[*]; taint; manual |
98-
| 97 | Summary: boost::asio; ; false; buffer; ; ; Argument[*0]; ReturnValue; taint; manual |
98+
| 97 | Summary: BloombergLP::bdlbb; Blob; true; buffer; ; ; Argument[-1]; ReturnValue[*]; taint; manual |
99+
| 98 | Summary: BloombergLP::bdlbb; BlobBuffer; true; buffer; ; ; Argument[-1]; ReturnValue[*]; taint; manual |
100+
| 99 | Summary: BloombergLP::bdlbb; BlobBuffer; true; data; ; ; Argument[-1]; ReturnValue[*]; taint; manual |
101+
| 100 | Summary: BloombergLP::bdlbb; BlobUtil; true; copy; (Blob *,int,const Blob &,int,int); ; Argument[*2]; Argument[*0]; taint; manual |
102+
| 101 | Summary: BloombergLP::bdlbb; BlobUtil; true; copy; (Blob *,int,const char *,int); ; Argument[*2]; Argument[*0]; taint; manual |
103+
| 102 | Summary: BloombergLP::bdlbb; BlobUtil; true; copy; (char *,const Blob &,int,int); ; Argument[*1]; Argument[*0]; taint; manual |
104+
| 103 | Summary: BloombergLP::bdlbb; BlobUtil; true; getContiguousRangeOrCopy; ; ; Argument[*1]; ReturnValue[*]; taint; manual |
105+
| 104 | Summary: boost::asio; ; false; buffer; ; ; Argument[*0]; ReturnValue; taint; manual |
99106
edges
100107
| asio_streams.cpp:87:34:87:44 | read_until output argument | asio_streams.cpp:91:7:91:17 | recv_buffer | provenance | Src:MaD:56 |
101108
| asio_streams.cpp:87:34:87:44 | read_until output argument | asio_streams.cpp:93:29:93:39 | recv_buffer | provenance | Src:MaD:56 Sink:MaD:4 |
@@ -104,7 +111,7 @@ edges
104111
| asio_streams.cpp:100:44:100:62 | call to buffer | asio_streams.cpp:100:44:100:62 | call to buffer | provenance | |
105112
| asio_streams.cpp:100:44:100:62 | call to buffer | asio_streams.cpp:101:7:101:17 | send_buffer | provenance | |
106113
| asio_streams.cpp:100:44:100:62 | call to buffer | asio_streams.cpp:103:29:103:39 | send_buffer | provenance | Sink:MaD:4 |
107-
| asio_streams.cpp:100:64:100:71 | *send_str | asio_streams.cpp:100:44:100:62 | call to buffer | provenance | MaD:97 |
114+
| asio_streams.cpp:100:64:100:71 | *send_str | asio_streams.cpp:100:44:100:62 | call to buffer | provenance | MaD:104 |
108115
| azure.cpp:253:48:253:60 | *call to GetBodyStream | azure.cpp:257:5:257:8 | *resp | provenance | |
109116
| azure.cpp:253:48:253:60 | *call to GetBodyStream | azure.cpp:262:5:262:8 | *resp | provenance | |
110117
| azure.cpp:253:48:253:60 | *call to GetBodyStream | azure.cpp:266:38:266:41 | *resp | provenance | |
@@ -144,6 +151,38 @@ edges
144151
| azure.cpp:294:38:294:53 | call to operator[] | azure.cpp:295:10:295:20 | contentType | provenance | |
145152
| azure.cpp:294:38:294:53 | call to operator[] | azure.cpp:295:10:295:20 | contentType | provenance | |
146153
| azure.cpp:295:10:295:20 | contentType | azure.cpp:295:10:295:20 | contentType | provenance | |
154+
| bdlbb.cpp:54:16:54:23 | call to source | bdlbb.cpp:56:49:56:52 | *call to data | provenance | TaintFunction |
155+
| bdlbb.cpp:56:37:56:41 | copy output argument | bdlbb.cpp:58:42:58:45 | *blob | provenance | |
156+
| bdlbb.cpp:56:49:56:52 | *call to data | bdlbb.cpp:56:37:56:41 | copy output argument | provenance | MaD:101 |
157+
| bdlbb.cpp:58:37:58:39 | copy output argument | bdlbb.cpp:59:7:59:10 | * ... | provenance | |
158+
| bdlbb.cpp:58:42:58:45 | *blob | bdlbb.cpp:58:37:58:39 | copy output argument | provenance | MaD:102 |
159+
| bdlbb.cpp:63:16:63:23 | call to source | bdlbb.cpp:65:49:65:52 | *call to data | provenance | TaintFunction |
160+
| bdlbb.cpp:65:37:65:41 | copy output argument | bdlbb.cpp:66:18:66:21 | *blob | provenance | |
161+
| bdlbb.cpp:65:49:65:52 | *call to data | bdlbb.cpp:65:37:65:41 | copy output argument | provenance | MaD:101 |
162+
| bdlbb.cpp:66:18:66:21 | *blob | bdlbb.cpp:66:29:66:32 | *call to buffer | provenance | MaD:97 |
163+
| bdlbb.cpp:66:18:66:38 | *call to data | bdlbb.cpp:66:18:66:38 | *call to data | provenance | |
164+
| bdlbb.cpp:66:18:66:38 | *call to data | bdlbb.cpp:67:7:67:8 | * ... | provenance | |
165+
| bdlbb.cpp:66:29:66:32 | *call to buffer | bdlbb.cpp:66:18:66:38 | *call to data | provenance | MaD:99 |
166+
| bdlbb.cpp:72:16:72:23 | call to source | bdlbb.cpp:74:49:74:52 | *call to data | provenance | TaintFunction |
167+
| bdlbb.cpp:74:37:74:41 | copy output argument | bdlbb.cpp:75:18:75:21 | *blob | provenance | |
168+
| bdlbb.cpp:74:49:74:52 | *call to data | bdlbb.cpp:74:37:74:41 | copy output argument | provenance | MaD:101 |
169+
| bdlbb.cpp:75:18:75:21 | *blob | bdlbb.cpp:75:29:75:32 | *call to buffer | provenance | MaD:97 |
170+
| bdlbb.cpp:75:18:75:46 | call to get | bdlbb.cpp:76:7:76:8 | * ... | provenance | |
171+
| bdlbb.cpp:75:29:75:32 | *call to buffer | bdlbb.cpp:75:39:75:41 | *call to buffer | provenance | MaD:98 |
172+
| bdlbb.cpp:75:39:75:41 | *call to buffer | bdlbb.cpp:75:18:75:46 | call to get | provenance | DataFlowFunction |
173+
| bdlbb.cpp:80:16:80:23 | call to source | bdlbb.cpp:82:49:82:52 | *call to data | provenance | TaintFunction |
174+
| bdlbb.cpp:82:37:82:41 | copy output argument | bdlbb.cpp:84:72:84:75 | *blob | provenance | |
175+
| bdlbb.cpp:82:49:82:52 | *call to data | bdlbb.cpp:82:37:82:41 | copy output argument | provenance | MaD:101 |
176+
| bdlbb.cpp:84:12:84:65 | *call to getContiguousRangeOrCopy | bdlbb.cpp:84:12:84:65 | *call to getContiguousRangeOrCopy | provenance | |
177+
| bdlbb.cpp:84:12:84:65 | *call to getContiguousRangeOrCopy | bdlbb.cpp:85:7:85:8 | * ... | provenance | |
178+
| bdlbb.cpp:84:72:84:75 | *blob | bdlbb.cpp:84:12:84:65 | *call to getContiguousRangeOrCopy | provenance | MaD:103 |
179+
| bdlbb.cpp:90:16:90:23 | call to source | bdlbb.cpp:92:48:92:51 | *call to data | provenance | TaintFunction |
180+
| bdlbb.cpp:92:37:92:40 | copy output argument | bdlbb.cpp:94:46:94:48 | *src | provenance | |
181+
| bdlbb.cpp:92:48:92:51 | *call to data | bdlbb.cpp:92:37:92:40 | copy output argument | provenance | MaD:101 |
182+
| bdlbb.cpp:94:37:94:40 | copy output argument | bdlbb.cpp:96:42:96:44 | *dst | provenance | |
183+
| bdlbb.cpp:94:46:94:48 | *src | bdlbb.cpp:94:37:94:40 | copy output argument | provenance | MaD:100 |
184+
| bdlbb.cpp:96:37:96:39 | copy output argument | bdlbb.cpp:97:7:97:10 | * ... | provenance | |
185+
| bdlbb.cpp:96:42:96:44 | *dst | bdlbb.cpp:96:37:96:39 | copy output argument | provenance | MaD:102 |
147186
| test.cpp:7:47:7:52 | value2 | test.cpp:7:64:7:69 | value2 | provenance | |
148187
| test.cpp:7:64:7:69 | value2 | test.cpp:7:5:7:30 | *ymlStepGenerated_with_body | provenance | |
149188
| test.cpp:10:10:10:18 | call to ymlSource | test.cpp:10:10:10:18 | call to ymlSource | provenance | Src:MaD:48 |
@@ -541,6 +580,43 @@ nodes
541580
| azure.cpp:295:10:295:20 | contentType | semmle.label | contentType |
542581
| azure.cpp:295:10:295:20 | contentType | semmle.label | contentType |
543582
| azure.cpp:295:10:295:20 | contentType | semmle.label | contentType |
583+
| bdlbb.cpp:54:16:54:23 | call to source | semmle.label | call to source |
584+
| bdlbb.cpp:56:37:56:41 | copy output argument | semmle.label | copy output argument |
585+
| bdlbb.cpp:56:49:56:52 | *call to data | semmle.label | *call to data |
586+
| bdlbb.cpp:58:37:58:39 | copy output argument | semmle.label | copy output argument |
587+
| bdlbb.cpp:58:42:58:45 | *blob | semmle.label | *blob |
588+
| bdlbb.cpp:59:7:59:10 | * ... | semmle.label | * ... |
589+
| bdlbb.cpp:63:16:63:23 | call to source | semmle.label | call to source |
590+
| bdlbb.cpp:65:37:65:41 | copy output argument | semmle.label | copy output argument |
591+
| bdlbb.cpp:65:49:65:52 | *call to data | semmle.label | *call to data |
592+
| bdlbb.cpp:66:18:66:21 | *blob | semmle.label | *blob |
593+
| bdlbb.cpp:66:18:66:38 | *call to data | semmle.label | *call to data |
594+
| bdlbb.cpp:66:18:66:38 | *call to data | semmle.label | *call to data |
595+
| bdlbb.cpp:66:29:66:32 | *call to buffer | semmle.label | *call to buffer |
596+
| bdlbb.cpp:67:7:67:8 | * ... | semmle.label | * ... |
597+
| bdlbb.cpp:72:16:72:23 | call to source | semmle.label | call to source |
598+
| bdlbb.cpp:74:37:74:41 | copy output argument | semmle.label | copy output argument |
599+
| bdlbb.cpp:74:49:74:52 | *call to data | semmle.label | *call to data |
600+
| bdlbb.cpp:75:18:75:21 | *blob | semmle.label | *blob |
601+
| bdlbb.cpp:75:18:75:46 | call to get | semmle.label | call to get |
602+
| bdlbb.cpp:75:29:75:32 | *call to buffer | semmle.label | *call to buffer |
603+
| bdlbb.cpp:75:39:75:41 | *call to buffer | semmle.label | *call to buffer |
604+
| bdlbb.cpp:76:7:76:8 | * ... | semmle.label | * ... |
605+
| bdlbb.cpp:80:16:80:23 | call to source | semmle.label | call to source |
606+
| bdlbb.cpp:82:37:82:41 | copy output argument | semmle.label | copy output argument |
607+
| bdlbb.cpp:82:49:82:52 | *call to data | semmle.label | *call to data |
608+
| bdlbb.cpp:84:12:84:65 | *call to getContiguousRangeOrCopy | semmle.label | *call to getContiguousRangeOrCopy |
609+
| bdlbb.cpp:84:12:84:65 | *call to getContiguousRangeOrCopy | semmle.label | *call to getContiguousRangeOrCopy |
610+
| bdlbb.cpp:84:72:84:75 | *blob | semmle.label | *blob |
611+
| bdlbb.cpp:85:7:85:8 | * ... | semmle.label | * ... |
612+
| bdlbb.cpp:90:16:90:23 | call to source | semmle.label | call to source |
613+
| bdlbb.cpp:92:37:92:40 | copy output argument | semmle.label | copy output argument |
614+
| bdlbb.cpp:92:48:92:51 | *call to data | semmle.label | *call to data |
615+
| bdlbb.cpp:94:37:94:40 | copy output argument | semmle.label | copy output argument |
616+
| bdlbb.cpp:94:46:94:48 | *src | semmle.label | *src |
617+
| bdlbb.cpp:96:37:96:39 | copy output argument | semmle.label | copy output argument |
618+
| bdlbb.cpp:96:42:96:44 | *dst | semmle.label | *dst |
619+
| bdlbb.cpp:97:7:97:10 | * ... | semmle.label | * ... |
544620
| test.cpp:7:5:7:30 | *ymlStepGenerated_with_body | semmle.label | *ymlStepGenerated_with_body |
545621
| test.cpp:7:47:7:52 | value2 | semmle.label | value2 |
546622
| test.cpp:7:64:7:69 | value2 | semmle.label | value2 |

cpp/ql/test/library-tests/dataflow/external-models/steps.expected

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,20 @@
44
| azure.cpp:262:5:262:8 | *resp | azure.cpp:262:23:262:28 | ReadToCount output argument |
55
| azure.cpp:287:79:287:98 | call to string | azure.cpp:287:62:287:99 | call to Url |
66
| azure.cpp:289:24:289:56 | call to GetHeader | azure.cpp:289:63:289:65 | call to Value |
7+
| bdlbb.cpp:56:49:56:52 | *call to data | bdlbb.cpp:56:37:56:41 | copy output argument |
8+
| bdlbb.cpp:58:42:58:45 | *blob | bdlbb.cpp:58:37:58:39 | copy output argument |
9+
| bdlbb.cpp:65:49:65:52 | *call to data | bdlbb.cpp:65:37:65:41 | copy output argument |
10+
| bdlbb.cpp:66:18:66:21 | *blob | bdlbb.cpp:66:29:66:32 | *call to buffer |
11+
| bdlbb.cpp:66:29:66:32 | *call to buffer | bdlbb.cpp:66:18:66:38 | *call to data |
12+
| bdlbb.cpp:74:49:74:52 | *call to data | bdlbb.cpp:74:37:74:41 | copy output argument |
13+
| bdlbb.cpp:75:18:75:21 | *blob | bdlbb.cpp:75:29:75:32 | *call to buffer |
14+
| bdlbb.cpp:75:29:75:32 | *call to buffer | bdlbb.cpp:75:39:75:41 | *call to buffer |
15+
| bdlbb.cpp:82:49:82:52 | *call to data | bdlbb.cpp:82:37:82:41 | copy output argument |
16+
| bdlbb.cpp:84:72:84:75 | *blob | bdlbb.cpp:84:12:84:65 | *call to getContiguousRangeOrCopy |
17+
| bdlbb.cpp:84:72:84:75 | *blob | bdlbb.cpp:84:67:84:69 | getContiguousRangeOrCopy output argument |
18+
| bdlbb.cpp:92:48:92:51 | *call to data | bdlbb.cpp:92:37:92:40 | copy output argument |
19+
| bdlbb.cpp:94:46:94:48 | *src | bdlbb.cpp:94:37:94:40 | copy output argument |
20+
| bdlbb.cpp:96:42:96:44 | *dst | bdlbb.cpp:96:37:96:39 | copy output argument |
721
| test.cpp:17:24:17:24 | x | test.cpp:17:10:17:22 | call to ymlStepManual |
822
| test.cpp:21:27:21:27 | x | test.cpp:21:10:21:25 | call to ymlStepGenerated |
923
| test.cpp:25:35:25:35 | x | test.cpp:25:11:25:33 | call to ymlStepManual_with_body |

cpp/ql/test/library-tests/dataflow/external-models/validatemodels.expected

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -370,6 +370,8 @@
370370
| Dubious signature "(BN_MONT_CTX *,const BIGNUM *,int,const unsigned char *,size_t,uint32_t,uint32_t)" in summary model. |
371371
| Dubious signature "(BN_RECP_CTX *,const BIGNUM *,BN_CTX *)" in summary model. |
372372
| Dubious signature "(BUF_MEM *,size_t)" in summary model. |
373+
| Dubious signature "(Blob *,int,const Blob &,int,int)" in summary model. |
374+
| Dubious signature "(Blob *,int,const char *,int)" in summary model. |
373375
| Dubious signature "(BrotliBitReader *const,uint64_t,uint64_t *)" in summary model. |
374376
| Dubious signature "(BrotliDecoderState *,BrotliDecoderStateInternal *,BrotliSharedDictionaryType,size_t,const uint8_t[])" in summary model. |
375377
| Dubious signature "(BrotliDecoderState *,BrotliDecoderStateInternal *,brotli_decoder_metadata_start_func,brotli_decoder_metadata_chunk_func,void *)" in summary model. |
@@ -2948,6 +2950,7 @@
29482950
| Dubious signature "(char *,char *__restrict__,int,FILE *,FILE *__restrict__)" in summary model. |
29492951
| Dubious signature "(char *,char *__restrict__,size_t,const char *,const char *__restrict__,const tm *,const tm *__restrict__,locale_t)" in summary model. |
29502952
| Dubious signature "(char *,char,char **)" in summary model. |
2953+
| Dubious signature "(char *,const Blob &,int,int)" in summary model. |
29512954
| Dubious signature "(char *,const char *)" in summary model. |
29522955
| Dubious signature "(char *,const char **,const char **,const char **,const char **,const char **)" in summary model. |
29532956
| Dubious signature "(char *,const char *,char **)" in summary model. |

0 commit comments

Comments
 (0)