malloc,strcpy,strcmp的实现: malloc()函数是用来动态分配内存空间的函数,它的实现是通过系统调用brk或mmap在进程的虚拟地址空间中分配一块指定大小的内存区域。 当调用malloc()函数时,它会搜索空闲内存池,如果找到一个空闲块大小刚好可以满足要求,则直接分配。如果找不到满足要求的空闲块,则会通过系统调用brk或mmap请求操作系统分配一块内存空间。 具体实现过程如下: ①检查内存池中是否有足够大小的空闲块; ②如果有,则返回该块的地址; ③如果没有,则向操作系统请求一块内存空间,用于分配给调用者; ④将该块内存插入内存池中,并返回该块的地址。
strcpy()函数实现: strcpy()函数是用来将一个字符串复制到另一个字符串的函数。具体实现过程如下: 判断源字符串和目标字符串的指针是否为空,如果为空则返回NULL; 从源字符串中读取一个字符,判断该字符是否为字符串结束符'\0',如果是,则跳到步骤4,否则继续执行步骤3; 将该字符复制到目标字符串中对应的位置,然后将源字符串和目标字符串的指针都向后移动一位,重复执行步骤2; 在目标字符串的末尾添加一个字符串结束符'\0',然后返回目标字符串的地址。
strcmp()函数实现: strcmp()函数用于比较两个字符串的大小。具体实现过程如下: 比较两个字符串的第一个字符,如果相等则继续比较下一个字符,直到遇到第一个不相等的字符或者两个字符串中的任意一个到达结束符'\0'; 如果遇到不相等的字符,则比较它们的ASCII码值,如果字符串1的字符ASCII码值大于字符串2的字符ASCII码值,则返回一个正数,反之返回一个负数; 如果两个字符串中有一个到达了字符串结束符'\0',则比较它们的长度,如果字符串1的长度大于字符串2的长度,则返回一个正数,反之返回一个负数; 如果两个字符串相等,则返回0。
哪些库函数属于高危函数: strcpy、strcat:这些函数没有对目标字符串的长度进行检查,容易导致缓冲区溢出。 sprintf、vsprintf:这些函数也没有对目标字符串的长度进行检查,容易导致缓冲区溢出。 gets:这个函数会读取用户的输入并存储到一个字符串中,但是没有对输入的长度进行检查,容易导致缓冲区溢出。 scanf、fscanf、sscanf:这些函数也容易导致缓冲区溢出,因为它们没有对输入的长度进行检查。 system:这个函数可以执行系统命令,但是容易被黑客利用进行恶意攻击。 为了防止这些问题,C++标准库提供了一些安全的函数替代品,例如strncpy、snprintf、fgets等,这些函数会对目标字符串的长度进行检查,从而防止缓冲区溢出等问题。