【问题标题】: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

标签: visual-c++ mfc code-analysis


【解决方案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 调用标志。它在我自己的文件中,不能排除。再次感谢。
  • 老实说,这比任何代码分析警告都要糟糕。这是一个非常微妙的 UB 脚枪,编译器和链接器都没有机会注意到。他们只会尽职尽责地输出行为可能未定义的代码。此外,从代码分析中排除文件不适用于预处理器宏。在涉及分析器之前,宏会被替换。一旦它看到代码,它就不再知道它的一部分来自应该被忽略的文件中定义的宏。
  • @IInspectable 感谢您的解释。制作另一个 MY_ENSURE 而不是重新定义 MFC 可能会更好。 OTOH 您的模板解决方案可能更好,您应该使用此解决方案发布答案​​。
  • @我会在我有时间的时候发布一个答案,但不确定什么时候会。至于USES_CONVERSION,已经不需要了,十多年没有了。据我所知,您可以删除它,仍然使用字符串转换宏。遗憾的是,我找不到任何官方文档来解释 USES_CONVERSION 的用途,也找不到哪个版本的 MFC/ATL 删除了该要求。
猜你喜欢
  • 2011-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多