const char* abc = "foo";
printf(abc);
这样安全或正确吗?我看到了一些遗留代码,包括这个。 谢谢!
非常非常抱歉..我犯了一个错误,我改回来了......
答案 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依赖于参数列表,它本身不是类型安全的,所以很容易导致崩溃或类似。