能否针对全局变量实现编译期use-after-move检测?
全局变量的编译期use-after-move检测可行性
现象说明
Clang编译器与clang-tidy静态分析器可检测局部变量的use-after-move场景并发出警告,示例如下:
int main(int, char**) { a_class a; auto b = std::move(a); a.f(); // 触发警告:"invalid invocation of method 'f' on object 'a' while it is in the 'consumed' state [-Werror,-Wconsumed]" }
但将变量改为全局、静态或延迟静态变量后,分析器不再触发警告:
a_class a; int main(int, char**) { auto b = std::move(a); a.f(); // 无警告 }
核心问题
能否针对全局变量实现通用的编译期use-after-move检测?或是原则上无法实现?
注:仅聚焦编译器与工具检测该模式的技术可行性,不讨论全局对象优劣及移后使用的合法性。
完整可复现代码
使用编译命令clang -Wconsumed -Werror -std=c++11编译,或借助clang-tidy检测,通过Clang注解扩展辅助识别:
#include<cassert> #include<memory> class [[clang::consumable(unconsumed)]] a_class { std::unique_ptr<int> p_; public: [[clang::callable_when(unconsumed)]] void f() {} // private: [[clang::set_typestate(consumed)]] void invalidate() {} // 非必需,仅作参考 }; a_class a; int main(int, char**) { // a_class a; auto b = std::move(a); a.f(); // 全局变量此处无警告 }
技术背景参考
Clang提供的consumed注解扩展可用于辅助捕获use-after-move错误,相关细节可参考Andrea Kling的博客内容。
内容的提问来源于stack exchange,提问作者alfC
相关产品推荐
相关产品推荐

