Skip to content

Commit 7396053

Browse files
add strcpy() and strncpy() wrappers
1 parent 16c29aa commit 7396053

File tree

2 files changed

+75
-0
lines changed

2 files changed

+75
-0
lines changed

runtime/LibcWrappers.cpp

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -635,4 +635,48 @@ long int SYM(atol)(const char *s) {
635635

636636
return result;
637637
}
638+
639+
char *SYM(strcpy)(char *dest, const char *src) {
640+
tryAlternative(dest, _sym_get_parameter_expression(0), SYM(strcpy));
641+
tryAlternative(src, _sym_get_parameter_expression(1), SYM(strcpy));
642+
643+
auto *result = strcpy(dest, src);
644+
_sym_set_return_expression(nullptr);
645+
646+
size_t cpyLen = strlen(src);
647+
if (isConcrete(src, cpyLen) && isConcrete(dest, cpyLen))
648+
return result;
649+
650+
auto srcShadow = ReadOnlyShadow(src, cpyLen);
651+
auto destShadow = ReadWriteShadow(dest, cpyLen);
652+
653+
std::copy(srcShadow.begin(), srcShadow.end(), destShadow.begin());
654+
655+
return result;
656+
}
657+
658+
char *SYM(strncpy)(char *dest, const char *src, size_t n) {
659+
tryAlternative(dest, _sym_get_parameter_expression(0), SYM(strncpy));
660+
tryAlternative(src, _sym_get_parameter_expression(1), SYM(strncpy));
661+
tryAlternative(n, _sym_get_parameter_expression(2), SYM(strncpy));
662+
663+
auto *result = strncpy(dest, src, n);
664+
_sym_set_return_expression(nullptr);
665+
666+
size_t srcLen = strnlen(src, n);
667+
size_t copied = std::min(n, srcLen);
668+
if (isConcrete(src, copied) && isConcrete(dest, n))
669+
return result;
670+
671+
auto srcShadow = ReadOnlyShadow(src, copied);
672+
auto destShadow = ReadWriteShadow(dest, n);
673+
674+
std::copy(srcShadow.begin(), srcShadow.end(), destShadow.begin());
675+
if (copied < n) {
676+
ReadWriteShadow destRestShadow(dest + copied, n - copied);
677+
std::fill(destRestShadow.begin(), destRestShadow.end(), nullptr);
678+
}
679+
680+
return result;
681+
}
638682
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
#include <stdio.h>
2+
#include <string.h>
3+
#include <stdarg.h>
4+
#include <stdlib.h>
5+
#include <stdint.h>
6+
#include <unistd.h>
7+
int main(int argc, char *argv[]) {
8+
9+
char buf[1024];
10+
ssize_t i;
11+
if ((i = read(0, buf, sizeof(buf) - 1)) < 24) return 0;
12+
buf[i] = 0;
13+
if (buf[0] != 'A') return 0;
14+
if (buf[1] != 'B') return 0;
15+
if (buf[2] != 'C') return 0;
16+
if (buf[3] != 'D') return 0;
17+
if (memcmp(buf + 4, "1234", 4) || memcmp(buf + 8, "EFGH", 4)) return 0;
18+
19+
char buf_2[4];
20+
strcpy(buf_2, buf+12);
21+
if (memcmp(buf_2, "NICE", 4)){
22+
printf("NOT HIT!\n");
23+
return 0;
24+
} else {
25+
printf("HIT!\n");
26+
27+
}
28+
29+
return 0;
30+
31+
}

0 commit comments

Comments
 (0)