@@ -11,6 +11,7 @@ extern "C" {
1111 void free (void *ptr);
1212 extern void use_pw (char *pw);
1313 int printf (const char * format, ...);
14+ char * gets (char * str);
1415}
1516
1617#define PW_SIZE 32
@@ -25,30 +26,34 @@ struct mem {
2526// x86-64 clang 9.0.0: not deleted
2627// x64 msvc v19.22: not deleted
2728void func (char buff[128 ], unsigned long long sz) {
28- memset (buff, 0 , PW_SIZE); // GOOD
29+ gets (buff);
30+ memset (buff, 0 , PW_SIZE); // GOOD
2931}
3032
3133// x86-64 gcc 9.2: not deleted
3234// x86-64 clang 9.0.0: not deleted
3335// x64 msvc v19.22: not deleted
34- char *func2 (char buff[128 ], unsigned long long sz) {
35- memset (buff, 0 , PW_SIZE); // GOOD
36- return buff;
36+ char *func2 (char buff[128 ], unsigned long long sz) {
37+ gets (buff);
38+ memset (buff, 0 , PW_SIZE); // GOOD
39+ return buff;
3740}
3841
3942// x86-64 gcc 9.2: deleted
4043// x86-64 clang 9.0.0: deleted
4144// x64 msvc v19.22: deleted
4245void func3 (unsigned long long sz) {
43- char buff[128 ];
46+ char buff[128 ];
47+ gets (buff);
4448 memset (buff, 0 , PW_SIZE); // BAD
4549}
4650
4751// x86-64 gcc 9.2: deleted
4852// x86-64 clang 9.0.0: deleted
4953// x64 msvc v19.22: deleted
5054void func4 (unsigned long long sz) {
51- char buff[128 ];
55+ char buff[128 ];
56+ gets (buff);
5257 memset (buff, 0 , PW_SIZE); // BAD [NOT DETECTED]
5358 strcpy (buff, " Hello" );
5459}
@@ -57,7 +62,8 @@ void func4(unsigned long long sz) {
5762// x86-64 clang 9.0.0: deleted
5863// x64 msvc v19.22: deleted
5964void func5 (unsigned long long sz) {
60- char buff[128 ];
65+ char buff[128 ];
66+ gets (buff);
6167 memset (buff, 0 , PW_SIZE); // BAD [NOT DETECTED]
6268 if (sz > 5 ) {
6369 strcpy (buff, " Hello" );
@@ -68,15 +74,17 @@ void func5(unsigned long long sz) {
6874// x86-64 clang 9.0.0: deleted
6975// x64 msvc v19.22: deleted
7076void func6 (unsigned long long sz) {
71- struct mem m;
77+ struct mem m;
78+ gets (m.b );
7279 memset (&m, 0 , PW_SIZE); // BAD
7380}
7481
7582// x86-64 gcc 9.2: deleted
7683// x86-64 clang 9.0.0: deleted
7784// x64 msvc v19.22: deleted
7885void func7 (unsigned long long sz) {
79- struct mem m;
86+ struct mem m;
87+ gets (m.b );
8088 memset (&m, 0 , PW_SIZE); // BAD [NOT DETECTED]
8189 m.a = 15 ;
8290}
@@ -86,6 +94,7 @@ void func7(unsigned long long sz) {
8694// x64 msvc v19.22: not deleted
8795void func8 (unsigned long long sz) {
8896 struct mem *m = (struct mem *)malloc (sizeof (struct mem ));
97+ gets (m->b );
8998 memset (m, 0 , PW_SIZE); // BAD [NOT DETECTED]
9099}
91100
@@ -94,6 +103,7 @@ void func8(unsigned long long sz) {
94103// x64 msvc v19.22: not deleted
95104void func9 (unsigned long long sz) {
96105 struct mem *m = (struct mem *)malloc (sizeof (struct mem ));
106+ gets (m->b );
97107 memset (m, 0 , PW_SIZE); // BAD [NOT DETECTED]
98108 free (m);
99109}
@@ -103,6 +113,7 @@ void func9(unsigned long long sz) {
103113// x64 msvc v19.22: not deleted
104114void func10 (unsigned long long sz) {
105115 struct mem *m = (struct mem *)malloc (sizeof (struct mem ));
116+ gets (m->b );
106117 memset (m, 0 , PW_SIZE); // BAD [NOT DETECTED]
107118 m->a = sz;
108119 m->c = m->a + 1 ;
@@ -113,6 +124,7 @@ void func10(unsigned long long sz) {
113124// x64 msvc v19.22: not deleted
114125void func11 (unsigned long long sz) {
115126 struct mem *m = (struct mem *)malloc (sizeof (struct mem ));
127+ gets (m->b );
116128 ::memset (m, 0 , PW_SIZE); // BAD [NOT DETECTED]
117129 if (sz > 5 ) {
118130 strcpy (m->b , " Hello" );
@@ -124,12 +136,14 @@ void func11(unsigned long long sz) {
124136// x64 msvc v19.22: not deleted
125137int func12 (unsigned long long sz) {
126138 struct mem *m = (struct mem *)malloc (sizeof (struct mem ));
139+ gets (m->b );
127140 memset (m, 0 , sz); // GOOD
128141 return m->c ;
129142}
130143
131144int funcN1 () {
132145 char pw[PW_SIZE];
146+ gets (pw);
133147 char *pw_ptr = pw;
134148 memset (pw, 0 , PW_SIZE); // GOOD
135149 use_pw (pw_ptr);
@@ -138,23 +152,25 @@ int funcN1() {
138152
139153char pw_global[PW_SIZE];
140154int funcN2 () {
155+ gets (pw_global);
141156 use_pw (pw_global);
142157 memset (pw_global, 0 , PW_SIZE); // GOOD
143158 return 0 ;
144159}
145160
146161int funcN3 (unsigned long long sz) {
147162 struct mem m;
163+ gets (m.b );
148164 memset (&m, 0 , sizeof (m)); // GOOD
149165 return m.a ;
150166}
151167
152168void funcN (int num) {
153169 char pw[PW_SIZE];
154170 int i;
155-
156171 for (i = 0 ; i < num; i++)
157172 {
173+ gets (pw);
158174 use_pw (pw);
159175 memset (pw, 0 , PW_SIZE); // GOOD
160176 }
@@ -193,11 +209,13 @@ void badFunc0_0(){
193209}
194210
195211void nobadFunc1_0 () {
196- unsigned char * buff1 = (unsigned char *) malloc (PW_SIZE);
212+ char * buff1 = (char *) malloc (PW_SIZE);
213+ gets (buff1);
197214 memset (buff1, 0 , PW_SIZE); // BAD [NOT DETECTED]
198215}
199216void badFunc1_0 (){
200- unsigned char * buff1 = (unsigned char *) malloc (PW_SIZE);
217+ char * buff1 = (char *) malloc (PW_SIZE);
218+ gets (buff1);
201219 memset (buff1, 0 , PW_SIZE); // BAD [NOT DETECTED]
202220 free (buff1);
203221}
@@ -217,14 +235,16 @@ void nobadFunc2_0_0(){
217235}
218236
219237void nobadFunc2_0_1 (){
220- unsigned char buff1[PW_SIZE];
238+ char buff1[PW_SIZE];
239+ gets (buff1);
221240 memset (buff1, ' \0 ' , sizeof (buff1));
222241 memset (buff1, 0 , PW_SIZE); // GOOD
223242 printf (" %s" , buff1 + 3 );
224243}
225244
226245void nobadFunc2_0_2 (){
227- unsigned char buff1[PW_SIZE];
246+ char buff1[PW_SIZE];
247+ gets (buff1);
228248 memset (buff1, 0 , PW_SIZE); // GOOD
229249 printf (" %c" , *buff1);
230250}
@@ -238,14 +258,16 @@ void nobadFunc2_0_3(char ch){
238258 printf (" %c" , *(buff1 + 3 ));
239259}
240260
241- unsigned char * nobadFunc2_0_4 (){
242- unsigned char buff1[PW_SIZE];
261+ char * nobadFunc2_0_4 (){
262+ char buff1[PW_SIZE];
263+ gets (buff1);
243264 memset (buff1, 0 , PW_SIZE); // GOOD
244265 return buff1;
245266}
246267
247- unsigned char * nobadFunc2_0_5 (){
248- unsigned char buff1[PW_SIZE];
268+ char * nobadFunc2_0_5 (){
269+ char buff1[PW_SIZE];
270+ gets (buff1);
249271 memset (buff1, 0 , PW_SIZE); // GOOD
250272
251273 return buff1+3 ;
@@ -261,28 +283,31 @@ unsigned char nobadFunc2_0_6(){
261283}
262284
263285unsigned char nobadFunc2_0_7 (){
264- unsigned char buff1[PW_SIZE];
286+ char buff1[PW_SIZE];
287+ gets (buff1);
265288 memset (buff1, 0 , PW_SIZE); // GOOD
266289
267290 return *(buff1 + 3 );
268291}
269292
270293bool nobadFunc2_1_0 (unsigned char ch){
271- unsigned char buff1[PW_SIZE];
272-
294+ char buff1[PW_SIZE];
295+ gets (buff1);
273296 memset (buff1, 0 , PW_SIZE); // GOOD
274297 if (*buff1 == ch) { return true ; }
275298 return false ;
276299}
277300
278301void nobadFunc2_1_2 (){
279- unsigned char buff1[PW_SIZE];
302+ char buff1[PW_SIZE];
303+ gets (buff1);
280304 memset (buff1, 0 , PW_SIZE); // BAD [NOT DETECTED]
281305 buff1[2 ] = 5 ;
282306}
283307
284- void nobadFunc3_0 (unsigned char * buffAll){
285- unsigned char * buff1 = buffAll;
308+ void nobadFunc3_0 (char * buffAll){
309+ char * buff1 = buffAll;
310+ gets (buff1);
286311 memset (buff1, 0 , PW_SIZE); // GOOD
287312}
288313
@@ -293,12 +318,13 @@ void nobadFunc3_1(unsigned char * buffAll){
293318
294319struct buffers
295320{
296- unsigned char buff1[50 ];
321+ char buff1[50 ];
297322 unsigned char *buff2;
298323};
299324
300325void nobadFunc3_2 (struct buffers buffAll) {
301- unsigned char * buff1 = buffAll.buff1 ;
326+ char * buff1 = buffAll.buff1 ;
327+ gets (buff1);
302328 memset (buff1, 0 , PW_SIZE); // GOOD
303329}
304330
@@ -313,7 +339,7 @@ void nobadFunc3_4(struct buffers buffAll) {
313339}
314340
315341void nobadFunc3_5 (struct buffers * buffAll) {
316- unsigned char * buff1 = buffAll->buff1 ;
342+ char * buff1 = buffAll->buff1 ;
317343 memset (buff1, 0 , PW_SIZE); // GOOD
318344}
319345
@@ -322,26 +348,27 @@ void nobadFunc3_6(struct buffers *buffAll){
322348 memset (buff1, 0 , PW_SIZE); // GOOD
323349}
324350
325- unsigned char * globalBuff;
351+ char * globalBuff;
326352
327353void nobadFunc4 (){
328- unsigned char * buff1 = globalBuff;
354+ char * buff1 = globalBuff;
329355 memset (buff1, 0 , PW_SIZE); // GOOD
330356}
331357
332358void nobadFunc4_0 (){
333- unsigned char * buff1 = globalBuff;
359+ char * buff1 = globalBuff;
360+ gets (buff1);
334361 memset (buff1, 0 , PW_SIZE); // GOOD
335362}
336363void nobadFunc4_1 (){
337- unsigned char * buff1 = globalBuff + 3 ;
364+ char * buff1 = globalBuff + 3 ;
338365 memset (buff1, 0 , PW_SIZE); // GOOD
339366}
340367
341368buffers globalBuff1, *globalBuff2;
342369
343370void nobadFunc4_2 (){
344- unsigned char * buff1 = globalBuff1.buff1 ;
371+ char * buff1 = globalBuff1.buff1 ;
345372 memset (buff1, 0 , PW_SIZE); // GOOD
346373}
347374
@@ -356,7 +383,7 @@ void nobadFunc4_4(){
356383}
357384
358385void nobadFunc4_5 (){
359- unsigned char * buff1 = globalBuff2->buff1 ;
386+ char * buff1 = globalBuff2->buff1 ;
360387 memset (buff1, 0 , PW_SIZE); // GOOD
361388}
362389
0 commit comments