sonar代码扫描常见问题以及处理方案


)

一. 没有关闭io流

sonar

Use try-with-resources or close this "FileInputStream" in a "finally" clause.

错误示例


FileInputStream fis = null;
byte[] buffer = new byte[1024];
try {
    fis = new FileInputStream(new File("E:\Java文件.txt")); 
    while (fis.read(buffer) > 0) {
        System.out.println(new String(buffer)); 
    }
} catch(Exception e) {
    e.printStackTrace();
}

解决办法

在catch后加上关闭代码
finally{
                if(null != printwriter) {
                    printwriter.close();
                }
            }
使用try-with-resources ,放在try里面
try ( Fil eInputStream fis = new FileInputStream(new File("E:\Java文件.txt"))) {
	out2.println("the text");
} catch (IOException e) {
	e.printStackTrace();
}

注: 要是使用的是idea ,可以使用ctrl + alt + T ,找到try-with-resources 快捷解决

二. 在finally语句块中有return,continue,throw 语句

sonar

Remove this return statement from this finally block.
Remove this continue statement from this finally block.
Remove this throw statement from this finally block.

错误示例

 } finally {
            try {
                fis.close();
            } catch (IOException e) {
                log.error("关闭流出现异常:{}", e);
                throw new Exception(); 
            }
 }

解决办法

 } finally {
          fis.close();
 }

三. 可能存在空指针异常,需要增加空值检测。

sonar

A "NullPointerException" could be thrown; "name" is nullable here

错误示例

String name = user.getName();

解决办法

String name ;
if(user != null ){
name = user.getName();
}

四. 当包含操作状态代码时,不应该忽略文件删除操作的结果

sonar

Do something with the "boolean" value returned by "delete".

错误示例

file.dekete();

解决办法

 if (!file.delete()) {
    // file delete failed; take appropriate action
  }

五. 移除没有用到的包、变量、方法

sonar


//移除没有用到的包、变量、方法
Remove this useless assignment to local variable xxx

错误示例

在这里插入图片描述

解决办法

需要看看这个变量有什么作用,没有作用的可以删除掉

六. 方法的认知复杂性不应太高

sonar

//方法的认知复杂性不应太高

Cognitive Complexity of methods should not be too high

//认知复杂性是衡量一种方法的控制流程理解难度的指标。认知复杂性高的方法难以别的开发人员去维护。
Cognitive Complexity is a measure of how hard the control flow of a method is to understand. Methods with high Cognitive Complexity will be difficult to maintain.

错误示例

在这里插入图片描述

解决办法

Compliant Solution(统一解决方案):

对应这种if-else 过多方法,我们主要目的是要消除 if-else ,每多一个 else 那么就会多一个逻辑分叉,代码的易读性会急速降低,这里收集总结了一些地址,需要的同学可以去看一下:
l如何无痛降低 if else 面条代码复杂度 .

七. BigDecimal的取值方法

sonar


//BigDecimal的取值方法
Use "BigDecimal.valueOf" instead.

错误示例


double d = 1.1;

BigDecimal bd1 = new BigDecimal(d); // Noncompliant; see comment above

BigDecimal bd2 = new BigDecimal(1.1); // Noncompliant; same result

解决办法

double d = 1.1;

BigDecimal bd1 = BigDecimal.valueOf(d);

BigDecimal bd2 = BigDecimal.valueOf(1.1);

八. 更改此条件,以便它不总是评估为“false"

sonar


//更改此条件,以便它不总是评估为“false"
Change this condition so that it does not always evaluate to “false

错误示例

在这里插入图片描述

解决办法

可以把这行删除掉,obj不可能为null if (obj == null) return false; 这样这个bug也没有了。

<think>好的,我现在需要帮助用户配置SonarScanner只检测C++代码,而不检测Python。首先,我要理解用户的需求。用户可能在一个项目中同时拥有C++和Python代码,但只想让SonarQube分析C++部分,排除Python文件。这可能是因为他们想专注于C++的质量,或者Python代码由其他工具处理。 接下来,我需要回忆SonarQube的配置选项。SonarScanner主要通过sonar-project.properties文件或命令行参数来设置。常见的排除方法包括sonar.exclusions,但用户需要的是仅包含特定语言的文件,而排除其他语言。这时候可能需要结合sonar.inclusions和sonar.exclusions,或者直接指定语言。 首先,确定SonarQube项目是否已经正确配置了C++的语言插件。如果未安装C++插件,扫描可能不会处理C++代码,但用户的问题更多是关于排除Python,所以可能已经安装了相关插件。需要确保Python插件没有安装,但这种方法不太实际,因为可能影响其他项目。更好的方法是配置扫描时仅分析C++文件。 然后,考虑使用sonar.inclusions来指定只包含C++的源文件。例如,设置sonar.sources为项目根目录,然后用sonar.inclusions=**/*.cpp,**/*.hpp等模式来包含C++文件,这样其他文件如.py就会被排除。同时,可能需要设置sonar.language为c++,但不确定这个参数是否有效,因为SonarQube通常是自动检测语言。需要查证文档。 另外,检查是否有sonar.lang.patterns.cpp可以用来指定C++的文件模式,或者通过sonar.import_unknown_files属性,设置为false,这样未识别的文件类型会被忽略。不过这可能取决于SonarQube版本和插件支持。 还要考虑排除测试文件或其他目录,但用户主要想排除Python。可能需要同时设置sonar.inclusions和sonar.exclusions,确保只有C++文件被包含,而Python被排除。例如,sonar.inclusions=**/*.cpp,**/*.hpp和sonar.exclusions=**/*.py。 另外,用户可能需要通过命令行参数动态设置这些属性,特别是在CI/CD环境中。例如,使用-Dsonar.inclusions=**/*.cpp,**/*.hpp。 还需要验证配置是否正确,可以通过运行扫描并查看日志中的排除文件列表,或在SonarQube界面上检查分析结果是否只包含C++文件。 可能遇到的问题包括路径模式不正确,或者多个配置冲突。例如,如果sonar.sources设置了一个包含Python文件的目录,但没有正确包含或排除,可能导致Python文件被扫描。需要确保sonar.sources和inclusions/exclusions的组合正确。 总结步骤:设置sonar.sources为项目根目录,使用sonar.inclusions包含C++文件扩展名,或用sonar.exclusions排除.py文件。同时,确保SonarQube项目配置了C++插件,并且没有启用Python插件(如果可行的话)。最后,测试配置并验证结果。</think>在 SonarQube 扫描中实现**仅检测 C++ 代码并排除 Python**,可通过以下配置方案实现: --- ### 🛠️ **核心配置方案** **方案一:精准包含 C++ 文件(推荐)** 在 `sonar-project.properties` 中配置: ```properties # 指定扫描根目录(例如 src) sonar.sources=src # 仅包含 C++ 文件(根据实际扩展名调整) sonar.inclusions=**/*.cpp, **/*.hpp, **/*.cxx, **/*.hxx, **/*.cc, **/*.h # 强制指定语言(可选) sonar.language=c++ ``` **方案二:显式排除 Python 文件** ```properties sonar.sources=. sonar.exclusions=**/*.py, **/*.pyw, **/*.pyc ``` --- ### 🔍 **验证配置效果** 1. **查看扫描日志** 在输出中检查: ``` Included sources: **/*.cpp **/*.hpp Excluded sources: **/*.py ``` 2. **Web 界面验证** 项目 → 代码 → 文件列表应只显示 `.cpp/.hpp` 等文件 --- ### ⚙️ **进阶配置技巧** **1. 多层级混合配置** ```properties # 包含 src/cpp 目录下的 C++ 文件 sonar.inclusions=src/cpp/**/*.cpp, include/**/*.hpp # 排除所有测试目录中的 Python 文件 sonar.exclusions=**/test/**/*.py ``` **2. 命令行动态覆盖** ```bash sonar-scanner \ -Dsonar.inclusions="**/*.cpp,**/*.h" \ -Dsonar.exclusions="**/*.py" ``` **3. 语言插件管理(终极方案)** *Admin → Marketplace → 卸载 Python 插件* (注意:此操作将影响所有项目) --- ### 📂 **典型目录结构适配** 假设项目结构为: ``` project/ ├── src/ │ ├── cpp/ # C++ 代码 │ └── python/ # Python 代码 └── tests/ ``` 对应配置: ```properties sonar.sources=src/cpp, tests/cpp sonar.exclusions=**/python/**, **/*.py ``` --- ### ⚠️ **常见问题排查** **Q:Python 文件仍被扫描?** - 检查 `sonar.sources` 是否包含 Python 文件所在目录 - 确认路径模式正确(如 `**/*.py` 需包含子目录) - 验证是否有其他配置冲突(如同时设置了包含规则) **Q:C++ 文件未被识别?** - 确认已安装 [C/C++ 插件](https://docs.sonarqube.org/latest/analyzing-source-code/languages/c-cpp-objective-c/) - 检查文件扩展名是否在默认支持列表中(可添加自定义扩展名) - 尝试添加显式语言声明:`sonar.lang.patterns.cpp=**/*.cpp,**/*.hpp` --- ### 🌰 **完整配置示例** ```properties # sonar-project.properties sonar.projectKey=my_cpp_project sonar.sources=src sonar.inclusions=**/*.cpp, **/*.hpp, **/*.c, **/*.h sonar.exclusions=**/*.py, **/third_party/** sonar.cxx.file.suffixes=.cpp,.hpp,.c,.h,.cc,.hxx ``` --- ### 📌 **最佳实践建议** 1. **优先使用 `inclusions`** 比 `exclusions` 更精准可控 2. **结合 CI/CD 环境变量** ```yaml # GitLab CI 示例 sonar-scanner: variables: SONAR_INCLUSIONS: "**/*.cpp,**/*.hpp" ``` 3. **定期检查插件兼容性** 不同 SonarQube 版本对 C++ 的支持差异较大(建议使用 LTS 版本) 如果需要进一步优化 C++ 分析配置(如编译器参数设置),可参考官方文档配置 `sonar.cxx` 相关参数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值