注:本课程参考文献《C安全编码标准》
欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~
目录
一.不安全代码
二.修改方案
三.练习和答案
一.不安全代码
除了C语言标准库头文件中定义为函数的符号之外,采用外部链接的标识符,例如error
和math_errhandling
等,即使它们可能被同名的宏所遮蔽,也应被考虑在内。
尽管在某些传统的UNIX实现(例如Dmalloc库)中允许对C语言标准库函数malloc()和free()进行定义替换,但根据C语言的标准规定,这种做法被视为未定义行为。即便在那些允许替换malloc()函数的系统中,如果不同时对aligned_alloc()、calloc()和realloc()这几个函数也进行替换,这种做法仍然可能引发问题。
#include <stddef.h>
void *malloc(size_t nbytes){
void *ptr;
/* Allocate storage from own pool and set ptr */
return ptr;
}
void free(void *ptr){
/*Return storage to own pool */
}
二.修改方案
#include <stddef.h>
void *my_malloc(size_t nbytes){
void *ptr;
/* Allocate storage from own pool and set ptr */
return ptr;
}
void *my_aligned_alloc(size_t alignment,size_t size){
void *ptr;
/* Allocate storage from own pool,align properly,set ptr */
return ptr;
}
void *my_calloc(size_t nelems,size_t elsize){
void *ptr;
/* Allocate storage from own pool,zero memory, and set ptr */
return ptr;
}
void *my_realloc(void *ptr,size_t nbytes){
/* Reallocate storage from own pool and set ptr */
return ptr;
}
void my_free(void *ptr){
/* Return storage to own pool */
}
三.练习和答案
案例:
不安全代码案例
考虑一个C语言程序,该程序试图替换标准库中的malloc
和free
函数,以实现自定义的内存管理策略。代码如下:
#include <stddef.h>
void *malloc(size_t nbytes){
void *ptr;
/* Allocate storage from own pool and set ptr */
return ptr;
}
void free(void *ptr){
/* Return storage to own pool */
}
问题:
- 根据C语言标准,替换
malloc
和free
函数是未定义行为。 - 即便在允许替换
malloc
函数的系统中,如果只替换malloc
而不替换aligned_alloc
、calloc
和realloc
,可能会引发问题。
修改方案案例
为了避免上述问题,可以对程序进行修改,使用自定义名称的函数来替代标准库的内存管理函数,并确保替换所有相关的内存管理函数。修改后的代码如下:
#include <stddef.h>
void *my_malloc(size_t nbytes){
void *ptr;
/* Allocate storage from own pool and set ptr */
return ptr;
}
void *my_aligned_alloc(size_t alignment,size_t size){
void *ptr;
/* Allocate storage from own pool, align properly, set ptr */
return ptr;
}
void *my_calloc(size_t nelems,size_t elsize){
void *ptr;
/* Allocate storage from own pool, zero memory, and set ptr */
return ptr;
}
void *my_realloc(void *ptr,size_t nbytes){
/* Reallocate storage from own pool and set ptr */
return ptr;
}
void my_free(void *ptr){
/* Return storage to own pool */
}
答案:
修改后的代码通过使用自定义名称的函数(如my_malloc
、my_aligned_alloc
、my_calloc
、my_realloc
和my_free
)来替代标准库的内存管理函数,从而避免了未定义行为,并确保了所有相关的内存管理函数都被适当地替换,从而提高了代码的健壮性和可移植性。
非常感谢您花时间阅读我的博客,希望这些分享能为您带来启发和帮助。期待您的反馈与交流,让我们共同成长,再次感谢!
👇个人网站👇