使用 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 不太可能改变这一点。

更简洁的方法是从分析中排除某些头文件,但这取决于您的工具。

请注意,ENSUREASSERT 是非常不同的东西:

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代码的最佳方法?

警告:请使用tensorflow / models中的官方/ mnist / dataset.py等替代方法

编组变量参数 - __arglist 或替代

防止 NullPointerException 警告的最佳方法?