我正在编写一个自定义包装器,通过尝试记住堆大小分配到地址,以更安全的方式实现strcat,strcpy等。例如,如果malloc(100)返回指针p,strcat将检查p处的当前字符串大小,如果它记住malloc中的p,则安全地转换为strncat。这是我的实施:
#define _GNU_SOURCE
#include <stdlib.h>
#include <stdio.h>
#include <dlfcn.h>
#include <string.h>
#include "linkedlist.h"
List * ptrSizes;
char *(*libc_strcat)(char * , const char * );
char* strcat(char * dest, const char * src){
printf("Called strcat\n");
if (ptrSizes == NULL) {
ptrSizes = createList();
}
if (libc_strcat == NULL) {
libc_strcat = dlsym(RTLD_NEXT, "strcat");
}
// Assume node returns the saved mapping correctly
Node* node = findInList(ptrSizes, dest);
if (node != NULL){
size_t curr_sz = strlen(dest);
size_t left = node -> max_sz - curr_sz - 1;
if (left > 0) {
printf("Copying %zd bytes with strncat\n", left);
dest = strncat(dest, src, left);
}
else{
printf("No copy to prevent overflow\n");
}
}
else{
// no memory of malloc. Can't help yet
dest = libc_strcat(dest, src);
}
return dest;
}
现在我的问题是,在任何测试文件中,strcat(dest, "Hello World");
都不会调用我的包装器strcat,而是
char src[]="Hello World";
strcat(dest, src);
正确调用我的包装器。我无法删除const关键字,因为它使得它与string.h中的声明不符。
我能做什么才能将两个电话都转到我的包装器上?