C安全编程教学-声明和初始化-不要声明或者定义保留标识符(四)_未定义

注:本课程参考文献《C安全编码标准》

 欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~

目录

一.不安全代码

二.修改方案

三.练习和答案


一.不安全代码

    除了C语言标准库头文件中定义为函数的符号之外,采用外部链接的标识符,例如errormath_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语言程序,该程序试图替换标准库中的mallocfree函数,以实现自定义的内存管理策略。代码如下:

#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 */  
}

问题

  1. 根据C语言标准,替换mallocfree函数是未定义行为。
  2. 即便在允许替换malloc函数的系统中,如果只替换malloc而不替换aligned_alloccallocrealloc,可能会引发问题。

修改方案案例

    为了避免上述问题,可以对程序进行修改,使用自定义名称的函数来替代标准库的内存管理函数,并确保替换所有相关的内存管理函数。修改后的代码如下:

#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_mallocmy_aligned_allocmy_callocmy_reallocmy_free)来替代标准库的内存管理函数,从而避免了未定义行为,并确保了所有相关的内存管理函数都被适当地替换,从而提高了代码的健壮性和可移植性。

 非常感谢您花时间阅读我的博客,希望这些分享能为您带来启发和帮助。期待您的反馈与交流,让我们共同成长,再次感谢!

👇个人网站👇

安城安的云世界

 

C安全编程教学-声明和初始化-不要声明或者定义保留标识符(四)_#include_02