gpt4 book ai didi

c++ - 从 C++ 调用 NSLog : "Format string is not a string literal (potentially insecure)"

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:05:28 24 4
gpt4 key购买 nike

当我从 C++ 调用 NSLog 时,Xcode 提示传递给 NSLog 的格式字符串不是文字字符串。这是触发警告的一行代码:

NSLog(CFSTR("Leaking?"));

我不知道有什么方法可以在 C++ 中编写 NSString 文字,而且我没有看到可以在项目设置中关闭的相关警告。有没有办法在不触发此消息的情况下从 C++ 调用 NSLog?我正在使用 Xcode 4.2.1。

编辑:这确实是 C++ 代码。我通常避免使用 Objective-C++,坚持使用 Objective-C 或普通的旧 C++,因为没有官方文档说明什么在 Objective-C++ 中有效,什么无效。我只发现模糊的警告(例如)STL 的某些部分可能存在问题。我使用模板、STL 和 C++ 的其他“高级”功能,所以我想谨慎行事。

编辑 #2,解决方案:我刚刚发现 clang 支持的警告标志比实际记录的要多得多。 (从 Xcode 提供给我的一长串警告中应该可以看出这一点。)我在 gcc 中尝试了 -Wno-format-nonliteral,现在 Xcode 很高兴。

最佳答案

您所要做的就是编写 @"this" 来创建一个文字 NSString 对象。

所以用 NSLog(@"Leaking?"); 替换那一行,你应该没问题。

您可能需要使用扩展名 .mm 重命名您的文件,以确保它被编译为 Objective-C++(Objective-C 和 C++ 的变种爱子)。如果你不想这样做,你可以在一个调用 NSLog 的小 mm 文件中创建一个包装函数,然后从你的 C++ 代码中调用该函数。它看起来像这样:

void MyNSLog(const char *message)
{
NSLog(@"%s", message);
}

请注意,编译器让您感到痛苦的原因是,使用不可变字符串文本(其中的内容在编译时已知)以外的任何内容都存在安全风险。否则,可以更改格式字符串以包含不存在的参数的格式说明符(例如,%d)。如果发生这种情况,NSLog 只会从堆栈中获取随机指针,并且可能会发生一些不好的事情。 (有关详细信息,请参阅 this question。)

关于c++ - 从 C++ 调用 NSLog : "Format string is not a string literal (potentially insecure)",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9793199/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com