不幸的是,此代码似乎在打印实际文本之前先打印了一些内容。这是什么?为何打印?
“ \ 300 \ 367 \ 277 \ 357 \ 376”
我在代码中更经常地意识到这一点,并且我确信这暗示我做错了什么。
// uids are: EUID=1001, RUID=1000
setreuid(1001, 1000) ; // works because EUID=1001 and RUID=1000
// uids are: EUID=1000, RUID=1001
setreuid(1000, 1001); // works because EUID=1000 and RUID=1001
答案 0 :(得分:0)
即使我们忽略了对不安全且不再受支持的函数gets
的调用,从您的concat
函数开始,此代码也存在许多问题:
char* concat(const char *s1, const char *s2)
{
char *result = malloc(strlen(s1) + strlen(s2) + 1);
strcpy(result, s1);
strcat(result, s2);
return result;
}
当concat
未初始化时,您正在通过以下行呼叫buf = concat(buf, lastchars);
:buf
。换句话说:
char *result = malloc(strlen(buf) + strlen(lastwords) + 1);
strcpy(result, buf);
strcat(result, lastwords);
return result;
什么是strlen(buf)
?这是未定义的行为,因为buf
不包含带有空终止符的字符串。
然后,strcpy(result, buf)
也是未定义的行为,因为buf
未初始化。
然后返回result
并将其分配回buf
。
用此代码很难理解您的意图,因此我无法提供解决方案-仅指出众多问题。