使用 ENSURE 避免代码分析警告的最佳替代方法是啥?
Posted
技术标签:
【中文标题】使用 ENSURE 避免代码分析警告的最佳替代方法是啥?【英文标题】:What is the best alternative to using ENSURE to avoid code analysis warnings?使用 ENSURE 避免代码分析警告的最佳替代方法是什么? 【发布时间】:2021-10-28 07:24:45 【问题描述】:例子:
ENSURE(strTitle.LoadString(AFX_IDS_APP_TITLE));
ENSURE(strMainInstruction.LoadString(IDS_STR_SUBMIT_STATS_MAIN_TEXT));
ENSURE(strContent.LoadString(IDS_STR_SUBMIT_STATS_CONTENT_TEXT));
ENSURE(strAdditional.LoadString(IDS_STR_SUBMIT_STATS_ADDITIONAL_TEXT));
ENSURE(strFooter.LoadString(IDS_STR_TASK_DIALOG_FOOTER));
ENSURE(strVerification.LoadString(IDS_STR_SUBMIT_STATS_VERIFICATION_TEXT));
ENSURE(strExpand.LoadString(IDS_STR_FIND_OUT_MORE));
ENSURE(strCollapse.LoadString(IDS_STR_COLLAPSE));
定义:
#define ENSURE(cond) ENSURE_THROW(cond, ::AfxThrowInvalidArgException() )
这是一个 Microsoft 宏,虽然我看不到它的文档。当我注意到它在 Microsoft SDK 代码中使用时,我开始使用它。烦人的是它会触发代码分析:
警告 C26496:变量 '__afx_condVal' 构造后没有变化,将其标记为 const (con.4)。
我确实用Microsoft 提出了它。底层宏ENSURE_THROW
:
#define ENSURE_THROW(cond, exception) \
do int __afx_condVal=!!(cond); ASSERT(__afx_condVal); if (!(__afx_condVal))exception; __pragma(warning(suppress:4127)) while (false)
...只需要const
这个词即可解决。
我可以拨打其他电话吗,因为我知道 ASSERT
仅适用于 DEBUG
构建。
【问题讨论】:
确保很好documented @Jabberwocky 感谢您的链接。我试过ENSURE
并没有出现...
第一次使用 mfc 确保宏 访问 google
【参考方案1】:
您可以重新定义ENSURE_THROW
并将其放入您的stdafx.h
:
#undef ENSURE_THROW
#define ENSURE_THROW(cond, exception) \
do const int __afx_condVal=!!(cond); ASSERT(__afx_condVal); \
if (!(__afx_condVal))exception; while (false)
它与 afx.h
中的原始 MS 定义相同,但添加了 const
。
这可能会在 MFC 的未来版本中中断,尽管 MS 不太可能改变这一点。
更简洁的方法是从分析中排除某些头文件,但这取决于您的工具。
请注意,ENSURE
和 ASSERT
是非常不同的东西:
ASSERT(x)
:在调试版本中,如果x
为假,它将停止程序执行并显示一条消息,在发布版本中,它是一个 NOP,x
甚至不会被评估
ENSURE(x)
:x
将被评估,如果为假,则会抛出异常。在调试版本中,在引发异常之前会显示一个诊断对话框。
【讨论】:
谢谢。我有排除目录设置。因此,MFC SDK 代码本身没有任何 ENSURE 调用标志。它在我自己的文件中,不能排除。再次感谢。 这很适合the architecture of a C compiler。 老实说,这比任何代码分析警告都要糟糕。这是一个非常微妙的 UB 脚枪,编译器和链接器都没有机会注意到。他们只会尽职尽责地输出行为可能未定义的代码。此外,从代码分析中排除文件不适用于预处理器宏。在涉及分析器之前,宏会被替换。一旦它看到代码,它就不再知道它的一部分来自应该被忽略的文件中定义的宏。 @IInspectable 感谢您的解释。制作另一个MY_ENSURE
而不是重新定义 MFC 可能会更好。 OTOH 您的模板解决方案可能更好,您应该使用此解决方案发布答案。
@我会在我有时间的时候发布一个答案,但不确定什么时候会。至于USES_CONVERSION
,已经不需要了,十多年没有了。据我所知,您可以删除它,仍然使用字符串转换宏。遗憾的是,我找不到任何官方文档来解释 USES_CONVERSION
的用途,也找不到哪个版本的 MFC/ATL 删除了该要求。以上是关于使用 ENSURE 避免代码分析警告的最佳替代方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章
ios8调用相机报警告: Snapshotting a view that has not been rendered results in an empty snapshot. Ensure you
避免在 pyspark 代码中使用 collect() 函数的最佳方法是啥?编写优化pyspark代码的最佳方法?