C安全编程教学-预处理器-不要在类函数的宏调用中使用预处理器指令_linux

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

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

目录

一.介绍

二.缺陷代码

三.解决方案


一.介绍

    类函数宏调用时不能包含预处理器指令,如#define,#ifdef和#include。根据C语言标准,这样会造成未定义行为。

    在最外层括号内的预处理器符号序列组成类函数宏的参数列表。列表中的独立参数由预处理符号逗号分隔,但是内部括号内的逗号不分隔参数。如果参数列表中预处理符号序列作为预处理器指令使用,此行为为未定义。

    这条规则同样适用于未知是否使用宏的函数参数中对预处理器指令的使用。例如标准库函数memcpy(),printf()和assert()可能以宏的形式实现。

二.缺陷代码

    在这个不相容代码示例【GCC缺陷】中,程序员使用预处理器指令指定memcpy()的平台特定参数。然而,如果memcpy()用宏实现,这段代码会造成未定义行为。

#include <string.h>
void func(const char *src){
    char *dest;
    memcpy(dest,src,
        #indef PLATFORM1
            12
        #else
            24
        #endif
    );
};
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.

三.解决方案

    对memcpy()的正确调用在函数调用之外确定:

#include <string.h>
void func(const char *src){
    char *dest;
    #ifdef PLATFORM1
        memcpy(dest,src,12);
    #else
        memcpy(dest,src,24);
    #endif
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.

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

👇个人网站👇

 安城安的云世界

 

C安全编程教学-预处理器-不要在类函数的宏调用中使用预处理器指令_开发语言_02