2017-05-08 28 views
0

我有以下代码:Ç - 非定格式串旗

if (my_condition_is_true){ 
    my_format_string = "Something %d, plus some_other_thing %lu" 
} 
else{ 
    my_format_string = "Something %d, plus some_other_thing %llu" 
} 

my_string_formatter(my_format_string, var1, var2) 

这就提出了非恒定格式字符串问题。我试过以下,

my_string_formatter("%s" my_format_string, var1, var2) 

但是,这个亘古不变的帮助

任何想法乡亲....

+3

什么'my_string_formatter'? – StoryTeller

+6

var2是一个无符号长整型和一个无符号长整型long?不知道你会得到一个没有[mcve] –

+0

答案这只是一个警告。当你知道自己在做什么时,忽略警告可能是你最好的选择(你可以完全禁用它)。 – pmg

回答

0

你传递一个非恒定的 '格式' 字符串:

"Something %d, plus some_other_thing %lu" 

here

传递一个非恒定的“格式”字符串到类printf函数可以 导致由 “格式”和实际传递给函数的自变量数目定义自变量的数量之间的失配。 如果格式字符串最终来自不受信任的源,则可以使用此 进行攻击。

这是一个有关安全警告。

+0

感谢您的链接,我已经看过这个网站。我的问题是如何解决这个问题。 – Emdadul

+0

@Emdadul将这个信息包含在你的问题中,对于那些不熟悉这个gcc标志的人来说是有用的 –

0

这是一个警告,因为

char* someString = someFunc(); 
printf(someString); 

是一个常见的错误尤其是鼓励初学者。如果字符串包含格式说明符或甚至未转义的百分号,则这是一个非常糟糕的错误。如果幸运的话,这是一个分段错误,否则,这是一个安全漏洞。

如果你真的知道你在做什么,你可以禁用警告。 (NB我的编译器(铛)不会引发这个警告,即使我发现有些令人惊讶的-Wall)。这个答案可能会帮助

https://stackoverflow.com/a/12171222/169346

你的属性添加到您的my_string_formatter功能,它告诉编译器,第一个字符串格式字符串。编译器之间的属性可能是不可移植的。

然而,你的两个格式字符串有不同类型的第二个参数(一个是unsigned long,另一个是unsigned long long),但你通过相同的两个参数在通话,无论哪种格式字符串使用。这是一个错误,你只就要用它,因为longlong long对你的执行相同的大小(我认为)。