2011-02-01 103 views
1
const char* abc = "foo"; 
printf(abc); 

这是安全吗?我看到一些遗留代码,包括这个。 谢谢!C++ printf问题:如何安全地将char *传递给printf?

非常非常sorry..I犯了一个错误,我改了回来....

+1

仅供参考,格式化您的代码将不胜感激。 – 2011-02-01 22:39:25

+0

我假设在这些行之后应该有分号? – James 2011-02-01 22:40:12

+0

正确的地方有一些分号也会有帮助。 – 2011-02-01 22:40:16

回答

7

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

编辑:我看到您修复了您的问题中的代码。它曾经通过abc作为printf的第一个参数,这真的很糟糕。现在你提出了第一个参数"%s",它好多了。这两者并不相似,并且在安全性方面存在巨大差异,因此请在旧代码中查找此模式。

3

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

我已经在过去写过一个静态字符串并从未遇到过问题。回想起来,我很幸运。是正确的,它或许应该是这样的:

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

很难从有限的代码片段,告诉你问题

但是,取决于.... printf的将打印它作为一个格式字符串... ..所以只要它不使用任何格式字符串特殊字符这将是确定......

0

对于

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

我看不出有任何理由引入变量ABC,因为2线条是如此的克洛SE。

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