忽略C++中断言表达式中的副作用

Ignore side-effects in asserted expression in C++

本文关键字:副作用 表达式 断言 C++ 中断 忽略      更新时间:2023-10-16

我有以下宏,

#define assert(exp) ({ if(! (exp) ) __builtin_unreachable(); })

然而,事实证明,一些(少数)表达式生成代码(gcc-Redhat 5.2.1-2-O2-std=c++17)。

assert(syscall(GET_TID)==tid); 当然是这样

我认为非纯函数一般都是这样。

我的第二个选择:

#define assume(exp) 
  ({ 
    auto __a = [&] () __attribute__((pure)) -> int { 
      return !! (exp); 
    }; 
    if (!__a()) 
      __builtin_unreachable(); 
  })

这意味着欺骗编译器,使其相信表达式是纯的,从而优化它,否则就会生成错误。不幸的是,没有看到任何改善。

问题。

有没有一种方法可以强制编译器优化所有代码。或者,我可以在编译时检测问题:即表达式是生成代码还是非纯代码。编译/链接错误是可以接受的,但我想把这些作为最后的手段。

更新:更多解释。

  1. 我希望编译器利用表达式中的提示来进一步优化代码
  2. 我不希望在检查假设的地方产生额外的代码(或者至少能够确认这一点)

通过短暂检查编译器输出。在许多情况下,只要表达式对编译器有用且透明(例如变量比较、内联函数调用、无副作用),它就可以非常巧妙地实现(1)。

对于(2)存在问题。编译器在表达式为不透明(或非纯)的地方留下代码。实际上,这些正是编译器无法从中导出提示的表达式。

我想停止编译器执行(2)或在出现这种情况时生成警告。

否,不能使assert忽略可能包含副作用的条件(例如函数调用),这是它们不能用作优化提示的主要原因。

您需要修改编译器前端才能获得这种功能(我不久前在这里提交了一个GCC补丁)。