@@ -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}
0 commit comments