c ++ printf问题:如何安全地将char *传递给printf?

时间:2011-02-01 22:37:48

标签: c++ pointers printf

const char* abc = "foo";
printf(abc);

这样安全或正确吗?我看到了一些遗留代码,包括这个。 谢谢!

非常非常抱歉..我犯了一个错误,我改回来了......

4 个答案:

答案 0 :(得分:7)

不,这不安全。假设abc指向有效字符串(它当前没有),这种模式可能容易受到格式字符串漏洞的影响。请参阅Format string attacks

编辑:我看到您修复了问题中的代码。它曾经将abc作为第一个参数传递给printf,这真的非常糟糕。既然您已经创建了第一个参数"%s",那就更好了。这两者并不相似,并且在安全性方面存在巨大差异,因此请在遗留代码中查找此模式。

答案 1 :(得分:4)

我假设你的abc指向一个实际的字符串而不是什么。清理示例代码会很有帮助。

我在过去做过这个,写出一个静态字符串,从未遇到过问题。回想起来,我很幸运。为了正确,它应该看起来像:

const char* abc = "foo";
printf("%s", abc);

答案 2 :(得分:1)

很难从问题中的有限代码片段中分辨出来

但是,依赖.... printf会将其打印为格式字符串.....所以只要它不使用任何格式字符串特殊字符就可以了......

答案 3 :(得分:0)

对于

const char* abc = "foo";
printf(abc);

我看不出为什么要引入变量abc,因为2行非常接近。

如果abc不是const字符串指针,那么这是非常危险的。 因为printf依赖于参数列表,它本身不是类型安全的,所以很容易导致崩溃或类似。