【发布时间】:2014-03-19 03:28:35
【问题描述】:
我正在玩在 go 中调用 C 代码。但是,当我尝试从 go 中使用 printf 时,我收到有关格式字符串不是字符串文字的警告:
package main
// #include <stdio.h>
import "C"
func main() {
C.printf(C.CString("Hello world\n"));
}
警告:
警告:格式字符串不是字符串文字(可能不安全)[-Wformat-security]
如何将字符串文字传递给像 printf 这样的 C 函数?是否有类似于C.CString() 的功能可以使用,还是不可能,我应该忽略此警告?
【问题讨论】:
-
请尝试
C.printf("%s",C.CString("Hello world\n")); -
@AnkitB 不起作用;如果是这样,那么我可以简单地使用
C.printf("Hello world\n"); -
为什么特别是
printf?有一个压倒一切的原因吗?所写的警告是正确的:所写的代码正在传递给 C 的printf一个在技术上在运行时构造的值。众所周知,printf第一个位置的动态值可以成为攻击的向量。 C 没有任何偏见:它只知道printf的第一个位置有一些值,它不是文字字符串标记。编译器给出了一个合法的编译时警告。