const char* abc = "foo";
printf(abc);
这是安全吗?我看到一些遗留代码,包括这个。 谢谢!C++ printf问题:如何安全地将char *传递给printf?
非常非常sorry..I犯了一个错误,我改了回来....
const char* abc = "foo";
printf(abc);
这是安全吗?我看到一些遗留代码,包括这个。 谢谢!C++ printf问题:如何安全地将char *传递给printf?
非常非常sorry..I犯了一个错误,我改了回来....
不,这不是安全的。假设abc
指向一个有效的字符串(它目前没有),这种模式可能容易受到格式字符串漏洞的影响。请参阅Format string attacks
编辑:我看到您修复了您的问题中的代码。它曾经通过abc
作为printf
的第一个参数,这真的很糟糕。现在你提出了第一个参数"%s"
,它好多了。这两者并不相似,并且在安全性方面存在巨大差异,因此请在旧代码中查找此模式。
我假设你的abc
指向一个实际的字符串而不是无。清理你的示例代码会很有帮助。
我已经在过去写过一个静态字符串并从未遇到过问题。回想起来,我很幸运。是正确的,它或许应该是这样的:
const char* abc = "foo";
printf("%s", abc);
很难从有限的代码片段,告诉你问题
但是,取决于.... printf的将打印它作为一个格式字符串... ..所以只要它不使用任何格式字符串特殊字符这将是确定......
对于
const char* abc = "foo";
printf(abc);
我看不出有任何理由引入变量ABC,因为2线条是如此的克洛SE。
如果abc不是一个常量字符串指针,那么这是非常危险的。 由于printf依赖于参数列表,它本身不是类型安全的,因此很容易导致崩溃或类似情况。
仅供参考,格式化您的代码将不胜感激。 – 2011-02-01 22:39:25
我假设在这些行之后应该有分号? – James 2011-02-01 22:40:12
正确的地方有一些分号也会有帮助。 – 2011-02-01 22:40:16