为什么在Clang中使用__attribute__((__format__(__printf_..))来避免格式化字符串
Why use __attribute__((__format__ (__printf__,...) in Clang to avoid format string is not a string literal?
这里和这里都建议,为了避免Clang中出现"格式字符串不是字符串文字"的警告,应该在函数定义之前使用以下__attribute__
代码段来告诉Clang printf
家族的一个函数正在函数内部调用:
__attribute__((__format__ (__printf__, 3, 0)))
我的问题是为什么?我看过这里的官方文件,但不能真正指出这个问题。
重点是,将任意输入作为printf
格式字符串传递通常是一个非常糟糕的想法。一个类型不匹配,您就得到了一张通往Undefined Behavior的单程票(更不用说可怕的%n
说明符,它可能会导致写入不匹配的任意内存)。
因此,如果用非文字调用printf
,GCC和clang会抱怨(如果用文字格式字符串调用,他们会根据提供的参数检查格式字符串)。__attribute__((__format__ (__printf__,...)
告诉编译器您的参数之一是printf
格式字符串,并在调用该函数时应用检查。由于编译器知道在调用函数时会检查格式字符串参数,因此它不会抱怨您在函数中使用该参数作为格式字符串。
相关文章:
- 如何从C++中的格式化字符串派生整数?
- C++逐步格式化字符串
- C++:格式化包含十六进制值的字符串
- 格式化返回字符串C++
- 有没有更快的方法从成员函数返回格式化字符串
- 如何在C++中对静态缓冲区执行字符串格式化?
- 格式化的时间字符串在解析为time_point时会产生小时差异
- C++ ctime() 迄今为止格式化的字符串?
- 自定义 {fmt} 格式化函数,具有编译时格式字符串检查功能
- 如何在提升库中格式化字符串
- 使用参数的可变大小向量格式化字符串(例如,将参数向量传递给 std::snprintf)
- 使用 c++ 格式化字符串的自然方法
- 使用此字符串重新格式化器使用什么代替 substr
- snprintf等效于WCHAR_T计算格式化的字符串大小(MAC)
- WXSTRING:是否有使用类似Python3的占位符实现字符串格式化的C/C 代码
- C字符串.格式化插入斜杠
- 如何截断字符串 [格式化] ?C++
- 是否为osx标准库实现swscanf子字符串格式化([a-z])
- c++字符串格式化-固定宽度的浮点数,以及在偏移处有空格的字符串
- 如何创建可变模板字符串格式化程序