SonarQube cpp:S3654规则下,默认虚析构加noexcept报解析错误求解决方案
我之前也碰到过一模一样的情况——GCC能正常编译带noexcept和= default的虚析构,但SonarQube却报解析错误。这大概率是SonarQube的C++分析器(SonarCFamily)对这种语法组合的支持滞后导致的,下面给你几个可行的解决办法:
升级SonarQube及SonarCFamily插件版本
旧版本的SonarCFamily插件可能对C++11及以后的语法组合(比如noexcept+= default的虚析构)解析存在bug。建议升级到SonarQube 9.0以上版本,同时搭配最新版的SonarCFamily插件(比如6.30+),新版本通常会修复这类语法解析问题,能正确识别virtual ~ConfigurationAccess() noexcept = default;这种写法。改用显式空析构函数替代
= default
如果暂时没法升级环境,可以把默认析构改成显式的空实现,写法如下:virtual ~ConfigurationAccess() noexcept {}这种写法和
= default的行为完全一致(编译器会生成和默认析构相同的代码),而且SonarQube的分析器能正确解析,同时也满足cpp:S3654对析构函数加noexcept的要求,GCC编译也不会有问题。检查SonarQube的C++标准配置
确保SonarQube在分析时启用了正确的C标准(至少C11,因为noexcept和= default都是C11引入的)。如果项目的分析标准设置为C03或更低,分析器会无法识别这些语法,从而抛出解析错误。你可以在SonarQube的项目设置里调整sonar.cxx.std参数,设置为c++11或更高版本。
内容的提问来源于stack exchange,提问作者I McCutcheon

